github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/modelcmd/clientstore.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelcmd 5 6 import ( 7 "github.com/juju/errors" 8 "gopkg.in/juju/names.v2" 9 10 "github.com/juju/juju/jujuclient" 11 ) 12 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 16 // name as necessary. 17 type QualifyingClientStore struct { 18 jujuclient.ClientStore 19 } 20 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 modelName == "" { 27 return "", nil 28 } 29 if !jujuclient.IsQualifiedModelName(modelName) { 30 details, err := s.ClientStore.AccountDetails(controllerName) 31 if err != nil { 32 return "", errors.Annotate(err, "getting account details for qualifying model name") 33 } 34 owner := names.NewUserTag(details.User) 35 modelName = jujuclient.JoinOwnerModelName(owner, modelName) 36 } else { 37 unqualifiedModelName, owner, err := jujuclient.SplitModelName(modelName) 38 if err != nil { 39 return "", errors.Trace(err) 40 } 41 owner = names.NewUserTag(owner.Id()) 42 modelName = jujuclient.JoinOwnerModelName(owner, unqualifiedModelName) 43 } 44 return modelName, nil 45 } 46 47 // Implements jujuclient.ModelGetter. 48 func (s QualifyingClientStore) ModelByName(controllerName, modelName string) (*jujuclient.ModelDetails, error) { 49 qualifiedModelName, err := s.QualifiedModelName(controllerName, modelName) 50 if err != nil { 51 return nil, errors.Annotatef(err, "getting model %q", modelName) 52 } 53 return s.ClientStore.ModelByName(controllerName, qualifiedModelName) 54 } 55 56 // Implements jujuclient.ModelUpdater. 57 func (s QualifyingClientStore) UpdateModel(controllerName, modelName string, details jujuclient.ModelDetails) error { 58 qualifiedModelName, err := s.QualifiedModelName(controllerName, modelName) 59 if err != nil { 60 return errors.Annotatef(err, "updating model %q", modelName) 61 } 62 return s.ClientStore.UpdateModel(controllerName, qualifiedModelName, details) 63 } 64 65 // Implements jujuclient.ModelUpdater. 66 func (s QualifyingClientStore) SetModels(controllerName string, models map[string]jujuclient.ModelDetails) error { 67 qualified := make(map[string]jujuclient.ModelDetails, len(models)) 68 for name, details := range models { 69 modelName, err := s.QualifiedModelName(controllerName, name) 70 if err != nil { 71 return errors.Annotatef(err, "updating model %q", name) 72 } 73 qualified[modelName] = details 74 } 75 return s.ClientStore.SetModels(controllerName, models) 76 } 77 78 // Implements jujuclient.ModelUpdater. 79 func (s QualifyingClientStore) SetCurrentModel(controllerName, modelName string) error { 80 qualifiedModelName, err := s.QualifiedModelName(controllerName, modelName) 81 if err != nil { 82 return errors.Annotatef(err, "setting current model to %q", modelName) 83 } 84 return s.ClientStore.SetCurrentModel(controllerName, qualifiedModelName) 85 } 86 87 // Implements jujuclient.ModelRemover. 88 func (s QualifyingClientStore) RemoveModel(controllerName, modelName string) error { 89 qualifiedModelName, err := s.QualifiedModelName(controllerName, modelName) 90 if err != nil { 91 return errors.Annotatef(err, "removing model %q", modelName) 92 } 93 return s.ClientStore.RemoveModel(controllerName, qualifiedModelName) 94 }