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  }