github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/jujuclient/jujuclienttesting/mem.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package jujuclienttesting
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/utils/set"
     9  
    10  	"github.com/juju/juju/cloud"
    11  	"github.com/juju/juju/jujuclient"
    12  )
    13  
    14  // MemStore is an in-memory implementation of jujuclient.ClientStore,
    15  // intended for testing.
    16  type MemStore struct {
    17  	Controllers           map[string]jujuclient.ControllerDetails
    18  	CurrentControllerName string
    19  	Models                map[string]*jujuclient.ControllerModels
    20  	Accounts              map[string]jujuclient.AccountDetails
    21  	Credentials           map[string]cloud.CloudCredential
    22  	BootstrapConfig       map[string]jujuclient.BootstrapConfig
    23  }
    24  
    25  func NewMemStore() *MemStore {
    26  	return &MemStore{
    27  		Controllers:     make(map[string]jujuclient.ControllerDetails),
    28  		Models:          make(map[string]*jujuclient.ControllerModels),
    29  		Accounts:        make(map[string]jujuclient.AccountDetails),
    30  		Credentials:     make(map[string]cloud.CloudCredential),
    31  		BootstrapConfig: make(map[string]jujuclient.BootstrapConfig),
    32  	}
    33  }
    34  
    35  // AllController implements ControllerGetter.AllController
    36  func (c *MemStore) AllControllers() (map[string]jujuclient.ControllerDetails, error) {
    37  	result := make(map[string]jujuclient.ControllerDetails)
    38  	for name, details := range c.Controllers {
    39  		result[name] = details
    40  	}
    41  	return result, nil
    42  }
    43  
    44  // ControllerByName implements ControllerGetter.ControllerByName
    45  func (c *MemStore) ControllerByName(name string) (*jujuclient.ControllerDetails, error) {
    46  	if err := jujuclient.ValidateControllerName(name); err != nil {
    47  		return nil, err
    48  	}
    49  	if result, ok := c.Controllers[name]; ok {
    50  		return &result, nil
    51  	}
    52  	return nil, errors.NotFoundf("controller %s", name)
    53  }
    54  
    55  // CurrentController implements ControllerGetter.CurrentController
    56  func (c *MemStore) CurrentController() (string, error) {
    57  	if c.CurrentControllerName == "" {
    58  		return "", errors.NotFoundf("current controller")
    59  	}
    60  	return c.CurrentControllerName, nil
    61  }
    62  
    63  // SetCurrentController implements ControllerUpdater.SetCurrentController
    64  func (c *MemStore) SetCurrentController(name string) error {
    65  	if err := jujuclient.ValidateControllerName(name); err != nil {
    66  		return err
    67  	}
    68  	if _, ok := c.Controllers[name]; !ok {
    69  		return errors.NotFoundf("controller %s", name)
    70  	}
    71  	c.CurrentControllerName = name
    72  	return nil
    73  }
    74  
    75  // AddController implements ControllerUpdater.AddController
    76  func (c *MemStore) AddController(name string, one jujuclient.ControllerDetails) error {
    77  	if err := jujuclient.ValidateControllerName(name); err != nil {
    78  		return err
    79  	}
    80  	if err := jujuclient.ValidateControllerDetails(one); err != nil {
    81  		return err
    82  	}
    83  
    84  	if _, ok := c.Controllers[name]; ok {
    85  		return errors.AlreadyExistsf("controller with name %s", name)
    86  	}
    87  
    88  	for k, v := range c.Controllers {
    89  		if v.ControllerUUID == one.ControllerUUID {
    90  			return errors.AlreadyExistsf("controller with UUID %s (%s)",
    91  				one.ControllerUUID, k)
    92  		}
    93  	}
    94  	c.Controllers[name] = one
    95  	return nil
    96  }
    97  
    98  // UpdateController implements ControllerUpdater.UpdateController
    99  func (c *MemStore) UpdateController(name string, one jujuclient.ControllerDetails) error {
   100  	if err := jujuclient.ValidateControllerName(name); err != nil {
   101  		return err
   102  	}
   103  	if err := jujuclient.ValidateControllerDetails(one); err != nil {
   104  		return err
   105  	}
   106  
   107  	if len(c.Controllers) == 0 {
   108  		return errors.NotFoundf("controllers")
   109  	}
   110  
   111  	for k, v := range c.Controllers {
   112  		if v.ControllerUUID == one.ControllerUUID && k != name {
   113  			return errors.AlreadyExistsf("controller %s with UUID %s",
   114  				k, v.ControllerUUID)
   115  		}
   116  	}
   117  
   118  	if _, ok := c.Controllers[name]; !ok {
   119  		return errors.NotFoundf("controller %s", name)
   120  	}
   121  
   122  	c.Controllers[name] = one
   123  	return nil
   124  }
   125  
   126  // RemoveController implements ControllerRemover.RemoveController
   127  func (c *MemStore) RemoveController(name string) error {
   128  	if err := jujuclient.ValidateControllerName(name); err != nil {
   129  		return err
   130  	}
   131  	names := set.NewStrings(name)
   132  	if namedControllerDetails, ok := c.Controllers[name]; ok {
   133  		for name, details := range c.Controllers {
   134  			if details.ControllerUUID == namedControllerDetails.ControllerUUID {
   135  				names.Add(name)
   136  				if name == c.CurrentControllerName {
   137  					c.CurrentControllerName = ""
   138  				}
   139  			}
   140  		}
   141  	}
   142  	for _, name := range names.Values() {
   143  		delete(c.Models, name)
   144  		delete(c.Accounts, name)
   145  		delete(c.BootstrapConfig, name)
   146  		delete(c.Controllers, name)
   147  	}
   148  	return nil
   149  }
   150  
   151  // UpdateModel implements ModelUpdater.
   152  func (c *MemStore) UpdateModel(controller, model string, details jujuclient.ModelDetails) error {
   153  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   154  		return err
   155  	}
   156  	if err := jujuclient.ValidateModelName(model); err != nil {
   157  		return err
   158  	}
   159  	if err := jujuclient.ValidateModelDetails(details); err != nil {
   160  		return err
   161  	}
   162  	controllerModels, ok := c.Models[controller]
   163  	if !ok {
   164  		controllerModels = &jujuclient.ControllerModels{
   165  			Models: make(map[string]jujuclient.ModelDetails),
   166  		}
   167  		c.Models[controller] = controllerModels
   168  	}
   169  	controllerModels.Models[model] = details
   170  	return nil
   171  }
   172  
   173  // SetCurrentModel implements ModelUpdater.
   174  func (c *MemStore) SetCurrentModel(controllerName, modelName string) error {
   175  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   176  		return errors.Trace(err)
   177  	}
   178  	if err := jujuclient.ValidateModelName(modelName); err != nil {
   179  		return errors.Trace(err)
   180  	}
   181  	controllerModels, ok := c.Models[controllerName]
   182  	if !ok {
   183  		return errors.NotFoundf("models for controller %s", controllerName)
   184  	}
   185  	if _, ok := controllerModels.Models[modelName]; !ok {
   186  		return errors.NotFoundf("model %s:%s", controllerName, modelName)
   187  	}
   188  	controllerModels.CurrentModel = modelName
   189  	return nil
   190  }
   191  
   192  // RemoveModel implements ModelRemover.
   193  func (c *MemStore) RemoveModel(controller, model string) error {
   194  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   195  		return err
   196  	}
   197  	if err := jujuclient.ValidateModelName(model); err != nil {
   198  		return err
   199  	}
   200  	controllerModels, ok := c.Models[controller]
   201  	if !ok {
   202  		return errors.NotFoundf("models for controller %s", controller)
   203  	}
   204  	if _, ok := controllerModels.Models[model]; !ok {
   205  		return errors.NotFoundf("model %s:%s", controller, model)
   206  	}
   207  	delete(controllerModels.Models, model)
   208  	if controllerModels.CurrentModel == model {
   209  		controllerModels.CurrentModel = ""
   210  	}
   211  	return nil
   212  }
   213  
   214  // AllModels implements ModelGetter.
   215  func (c *MemStore) AllModels(controller string) (map[string]jujuclient.ModelDetails, error) {
   216  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   217  		return nil, err
   218  	}
   219  	controllerModels, ok := c.Models[controller]
   220  	if !ok {
   221  		return nil, errors.NotFoundf("models for controller %s", controller)
   222  	}
   223  	return controllerModels.Models, nil
   224  }
   225  
   226  // CurrentModel implements ModelGetter.
   227  func (c *MemStore) CurrentModel(controller string) (string, error) {
   228  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   229  		return "", err
   230  	}
   231  	controllerModels, ok := c.Models[controller]
   232  	if !ok {
   233  		return "", errors.NotFoundf("models for controller %s", controller)
   234  	}
   235  	if controllerModels.CurrentModel == "" {
   236  		return "", errors.NotFoundf("current model for controller %s", controller)
   237  	}
   238  	return controllerModels.CurrentModel, nil
   239  }
   240  
   241  // ModelByName implements ModelGetter.
   242  func (c *MemStore) ModelByName(controller, model string) (*jujuclient.ModelDetails, error) {
   243  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   244  		return nil, err
   245  	}
   246  	if err := jujuclient.ValidateModelName(model); err != nil {
   247  		return nil, err
   248  	}
   249  	controllerModels, ok := c.Models[controller]
   250  	if !ok {
   251  		return nil, errors.NotFoundf("models for controller %s", controller)
   252  	}
   253  	details, ok := controllerModels.Models[model]
   254  	if !ok {
   255  		return nil, errors.NotFoundf("model %s:%s", controller, model)
   256  	}
   257  	return &details, nil
   258  }
   259  
   260  // UpdateAccount implements AccountUpdater.
   261  func (c *MemStore) UpdateAccount(controllerName string, details jujuclient.AccountDetails) error {
   262  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   263  		return err
   264  	}
   265  	if err := jujuclient.ValidateAccountDetails(details); err != nil {
   266  		return err
   267  	}
   268  	oldDetails := c.Accounts[controllerName]
   269  	// Only update last known access if it has a value.
   270  	if details.LastKnownAccess == "" {
   271  		details.LastKnownAccess = oldDetails.LastKnownAccess
   272  	}
   273  	c.Accounts[controllerName] = details
   274  	return nil
   275  }
   276  
   277  // AccountDetails implements AccountGetter.
   278  func (c *MemStore) AccountDetails(controllerName string) (*jujuclient.AccountDetails, error) {
   279  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   280  		return nil, err
   281  	}
   282  	details, ok := c.Accounts[controllerName]
   283  	if !ok {
   284  		return nil, errors.NotFoundf("account for controller %s", controllerName)
   285  	}
   286  	return &details, nil
   287  }
   288  
   289  // RemoveAccount implements AccountRemover.
   290  func (c *MemStore) RemoveAccount(controllerName string) error {
   291  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   292  		return err
   293  	}
   294  	if _, ok := c.Accounts[controllerName]; !ok {
   295  		return errors.NotFoundf("account for controller %s", controllerName)
   296  	}
   297  	delete(c.Accounts, controllerName)
   298  	return nil
   299  }
   300  
   301  // UpdateCredential implements CredentialsUpdater.
   302  func (c *MemStore) UpdateCredential(cloudName string, details cloud.CloudCredential) error {
   303  	c.Credentials[cloudName] = details
   304  	return nil
   305  }
   306  
   307  // CredentialForCloud implements CredentialsGetter.
   308  func (c *MemStore) CredentialForCloud(cloudName string) (*cloud.CloudCredential, error) {
   309  	if result, ok := c.Credentials[cloudName]; ok {
   310  		return &result, nil
   311  	}
   312  	return nil, errors.NotFoundf("credentials for cloud %s", cloudName)
   313  }
   314  
   315  // AllCredentials implements CredentialsGetter.
   316  func (c *MemStore) AllCredentials() (map[string]cloud.CloudCredential, error) {
   317  	result := make(map[string]cloud.CloudCredential)
   318  	for k, v := range c.Credentials {
   319  		result[k] = v
   320  	}
   321  	return result, nil
   322  }
   323  
   324  // UpdateBootstrapConfig implements BootstrapConfigUpdater.
   325  func (c *MemStore) UpdateBootstrapConfig(controllerName string, cfg jujuclient.BootstrapConfig) error {
   326  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   327  		return err
   328  	}
   329  	if err := jujuclient.ValidateBootstrapConfig(cfg); err != nil {
   330  		return err
   331  	}
   332  	c.BootstrapConfig[controllerName] = cfg
   333  	return nil
   334  
   335  }
   336  
   337  // BootstrapConfigForController implements BootstrapConfigGetter.
   338  func (c *MemStore) BootstrapConfigForController(controllerName string) (*jujuclient.BootstrapConfig, error) {
   339  	if cfg, ok := c.BootstrapConfig[controllerName]; ok {
   340  		return &cfg, nil
   341  	}
   342  	return nil, errors.NotFoundf("bootstrap config for controller %s", controllerName)
   343  
   344  }