1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
"github.com/juju/errors"
8
"gopkg.in/juju/names.v2"
10
"github.com/juju/juju/jujuclient"
13
// QualifyingClientStore wraps a jujuclient.ClientStore, modifying
14
// model-related methods such that they accept unqualified model
15
// names, and automatically qualify them with the logged-in user
17
type QualifyingClientStore struct {
18
jujuclient.ClientStore
21
// QualifiedModelName returns a Qualified model name, given either
22
// an unqualified or qualified model name. If the input is a
23
// fully qualified name, it is returned untouched; otherwise it is
24
// return qualified with the logged-in user name.
25
func (s QualifyingClientStore) QualifiedModelName(controllerName, modelName string) (string, error) {
26
if !jujuclient.IsQualifiedModelName(modelName) {
27
details, err := s.ClientStore.AccountDetails(controllerName)
29
return "", errors.Annotate(err, "getting account details for qualifying model name")
31
owner := names.NewUserTag(details.User)
32
modelName = jujuclient.JoinOwnerModelName(owner, modelName)
34
unqualifiedModelName, owner, err := jujuclient.SplitModelName(modelName)
36
return "", errors.Trace(err)
38
// Make sure that the user name is canonical.
39
owner = names.NewUserTag(owner.Canonical())
40
modelName = jujuclient.JoinOwnerModelName(owner, unqualifiedModelName)
45
// Implements jujuclient.ModelGetter.
46
func (s QualifyingClientStore) ModelByName(controllerName, modelName string) (*jujuclient.ModelDetails, error) {
47
modelName, err := s.QualifiedModelName(controllerName, modelName)
49
return nil, errors.Annotatef(err, "getting model %q", modelName)
51
return s.ClientStore.ModelByName(controllerName, modelName)
54
// Implements jujuclient.ModelUpdater.
55
func (s QualifyingClientStore) UpdateModel(controllerName, modelName string, details jujuclient.ModelDetails) error {
56
modelName, err := s.QualifiedModelName(controllerName, modelName)
58
return errors.Annotatef(err, "updating model %q", modelName)
60
return s.ClientStore.UpdateModel(controllerName, modelName, details)
63
// Implements jujuclient.ModelUpdater.
64
func (s QualifyingClientStore) SetCurrentModel(controllerName, modelName string) error {
65
modelName, err := s.QualifiedModelName(controllerName, modelName)
67
return errors.Annotatef(err, "setting current model to %q", modelName)
69
return s.ClientStore.SetCurrentModel(controllerName, modelName)
72
// Implements jujuclient.ModelRemover.
73
func (s QualifyingClientStore) RemoveModel(controllerName, modelName string) error {
74
modelName, err := s.QualifiedModelName(controllerName, modelName)
76
return errors.Annotatef(err, "removing model %q", modelName)
78
return s.ClientStore.RemoveModel(controllerName, modelName)