github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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  	Models          map[string]jujuclient.ControllerAccountModels
    19  	Accounts        map[string]*jujuclient.ControllerAccounts
    20  	Credentials     map[string]cloud.CloudCredential
    21  	BootstrapConfig map[string]jujuclient.BootstrapConfig
    22  }
    23  
    24  func NewMemStore() *MemStore {
    25  	return &MemStore{
    26  		make(map[string]jujuclient.ControllerDetails),
    27  		make(map[string]jujuclient.ControllerAccountModels),
    28  		make(map[string]*jujuclient.ControllerAccounts),
    29  		make(map[string]cloud.CloudCredential),
    30  		make(map[string]jujuclient.BootstrapConfig),
    31  	}
    32  }
    33  
    34  // AllController implements ControllerGetter.AllController
    35  func (c *MemStore) AllControllers() (map[string]jujuclient.ControllerDetails, error) {
    36  	return c.Controllers, nil
    37  }
    38  
    39  // ControllerByName implements ControllerGetter.ControllerByName
    40  func (c *MemStore) ControllerByName(name string) (*jujuclient.ControllerDetails, error) {
    41  	if err := jujuclient.ValidateControllerName(name); err != nil {
    42  		return nil, err
    43  	}
    44  	if result, ok := c.Controllers[name]; ok {
    45  		return &result, nil
    46  	}
    47  	return nil, errors.NotFoundf("controller %s", name)
    48  }
    49  
    50  // UpdateController implements ControllerUpdater.UpdateController
    51  func (c *MemStore) UpdateController(name string, one jujuclient.ControllerDetails) error {
    52  	if err := jujuclient.ValidateControllerName(name); err != nil {
    53  		return err
    54  	}
    55  	if err := jujuclient.ValidateControllerDetails(one); err != nil {
    56  		return err
    57  	}
    58  	c.Controllers[name] = one
    59  	return nil
    60  }
    61  
    62  // RemoveController implements ControllerRemover.RemoveController
    63  func (c *MemStore) RemoveController(name string) error {
    64  	if err := jujuclient.ValidateControllerName(name); err != nil {
    65  		return err
    66  	}
    67  	names := set.NewStrings(name)
    68  	if namedControllerDetails, ok := c.Controllers[name]; ok {
    69  		for name, details := range c.Controllers {
    70  			if details.ControllerUUID == namedControllerDetails.ControllerUUID {
    71  				names.Add(name)
    72  			}
    73  		}
    74  	}
    75  	for _, name := range names.Values() {
    76  		delete(c.Models, name)
    77  		delete(c.Accounts, name)
    78  		delete(c.BootstrapConfig, name)
    79  		delete(c.Controllers, name)
    80  	}
    81  	return nil
    82  }
    83  
    84  // UpdateModel implements ModelUpdater.
    85  func (c *MemStore) UpdateModel(controller, account, model string, details jujuclient.ModelDetails) error {
    86  	if err := jujuclient.ValidateControllerName(controller); err != nil {
    87  		return err
    88  	}
    89  	if err := jujuclient.ValidateAccountName(account); err != nil {
    90  		return err
    91  	}
    92  	if err := jujuclient.ValidateModelName(model); err != nil {
    93  		return err
    94  	}
    95  	if err := jujuclient.ValidateModelDetails(details); err != nil {
    96  		return err
    97  	}
    98  	controllerAccountModels, ok := c.Models[controller]
    99  	if !ok {
   100  		controllerAccountModels.AccountModels = make(map[string]*jujuclient.AccountModels)
   101  		c.Models[controller] = controllerAccountModels
   102  	}
   103  	accountModels, ok := controllerAccountModels.AccountModels[account]
   104  	if !ok {
   105  		accountModels = &jujuclient.AccountModels{
   106  			Models: make(map[string]jujuclient.ModelDetails),
   107  		}
   108  		controllerAccountModels.AccountModels[account] = accountModels
   109  	}
   110  	accountModels.Models[model] = details
   111  	return nil
   112  }
   113  
   114  // SetCurrentModel implements ModelUpdater.
   115  func (c *MemStore) SetCurrentModel(controllerName, accountName, modelName string) error {
   116  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   117  		return errors.Trace(err)
   118  	}
   119  	if err := jujuclient.ValidateAccountName(accountName); err != nil {
   120  		return err
   121  	}
   122  	if err := jujuclient.ValidateModelName(modelName); err != nil {
   123  		return errors.Trace(err)
   124  	}
   125  	controllerAccountModels, ok := c.Models[controllerName]
   126  	if !ok {
   127  		return errors.NotFoundf("models for controller %s", controllerName)
   128  	}
   129  	accountModels, ok := controllerAccountModels.AccountModels[accountName]
   130  	if !ok {
   131  		return errors.NotFoundf(
   132  			"models for account %s on controller %s",
   133  			accountName, controllerName,
   134  		)
   135  	}
   136  	if _, ok := accountModels.Models[modelName]; !ok {
   137  		return errors.NotFoundf("model %s:%s:%s", controllerName, accountName, modelName)
   138  	}
   139  	accountModels.CurrentModel = modelName
   140  	return nil
   141  }
   142  
   143  // RemoveModel implements ModelRemover.
   144  func (c *MemStore) RemoveModel(controller, account, model string) error {
   145  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   146  		return err
   147  	}
   148  	if err := jujuclient.ValidateAccountName(account); err != nil {
   149  		return err
   150  	}
   151  	if err := jujuclient.ValidateModelName(model); err != nil {
   152  		return err
   153  	}
   154  	controllerAccountModels, ok := c.Models[controller]
   155  	if !ok {
   156  		return errors.NotFoundf("models for controller %s", controller)
   157  	}
   158  	accountModels, ok := controllerAccountModels.AccountModels[account]
   159  	if !ok {
   160  		return errors.NotFoundf(
   161  			"models for account %s on controller %s",
   162  			account, controller,
   163  		)
   164  	}
   165  	if _, ok := accountModels.Models[model]; !ok {
   166  		return errors.NotFoundf("model %s:%s:%s", controller, account, model)
   167  	}
   168  	delete(accountModels.Models, model)
   169  	if accountModels.CurrentModel == model {
   170  		accountModels.CurrentModel = ""
   171  	}
   172  	return nil
   173  }
   174  
   175  // AllModels implements ModelGetter.
   176  func (c *MemStore) AllModels(controller, account string) (map[string]jujuclient.ModelDetails, error) {
   177  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   178  		return nil, err
   179  	}
   180  	if err := jujuclient.ValidateAccountName(account); err != nil {
   181  		return nil, err
   182  	}
   183  	controllerAccountModels, ok := c.Models[controller]
   184  	if !ok {
   185  		return nil, errors.NotFoundf("models for controller %s", controller)
   186  	}
   187  	accountModels, ok := controllerAccountModels.AccountModels[account]
   188  	if !ok {
   189  		return nil, errors.NotFoundf("models for account %s on controller %s", account, controller)
   190  	}
   191  	return accountModels.Models, nil
   192  }
   193  
   194  // CurrentModel implements ModelGetter.
   195  func (c *MemStore) CurrentModel(controller, account string) (string, error) {
   196  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   197  		return "", err
   198  	}
   199  	if err := jujuclient.ValidateAccountName(account); err != nil {
   200  		return "", err
   201  	}
   202  	controllerAccountModels, ok := c.Models[controller]
   203  	if !ok {
   204  		return "", errors.NotFoundf("models for controller %s", controller)
   205  	}
   206  	accountModels, ok := controllerAccountModels.AccountModels[account]
   207  	if !ok {
   208  		return "", errors.NotFoundf("models for account %s on controller %s", account, controller)
   209  	}
   210  	if accountModels.CurrentModel == "" {
   211  		return "", errors.NotFoundf("current model for account %s on controller %s", account, controller)
   212  	}
   213  	return accountModels.CurrentModel, nil
   214  }
   215  
   216  // ModelByName implements ModelGetter.
   217  func (c *MemStore) ModelByName(controller, account, model string) (*jujuclient.ModelDetails, error) {
   218  	if err := jujuclient.ValidateControllerName(controller); err != nil {
   219  		return nil, err
   220  	}
   221  	if err := jujuclient.ValidateAccountName(account); err != nil {
   222  		return nil, err
   223  	}
   224  	if err := jujuclient.ValidateModelName(model); err != nil {
   225  		return nil, err
   226  	}
   227  	controllerAccountModels, ok := c.Models[controller]
   228  	if !ok {
   229  		return nil, errors.NotFoundf("models for controller %s", controller)
   230  	}
   231  	accountModels, ok := controllerAccountModels.AccountModels[account]
   232  	if !ok {
   233  		return nil, errors.NotFoundf("models for account %s on controller %s", account, controller)
   234  	}
   235  	details, ok := accountModels.Models[model]
   236  	if !ok {
   237  		return nil, errors.NotFoundf("model %s:%s:%s", controller, account, model)
   238  	}
   239  	return &details, nil
   240  }
   241  
   242  // UpdateAccount implements AccountUpdater.
   243  func (c *MemStore) UpdateAccount(controllerName, accountName string, details jujuclient.AccountDetails) error {
   244  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   245  		return err
   246  	}
   247  	if err := jujuclient.ValidateAccountName(accountName); err != nil {
   248  		return err
   249  	}
   250  	if err := jujuclient.ValidateAccountDetails(details); err != nil {
   251  		return err
   252  	}
   253  	accounts, ok := c.Accounts[controllerName]
   254  	if !ok {
   255  		accounts = &jujuclient.ControllerAccounts{
   256  			Accounts: make(map[string]jujuclient.AccountDetails),
   257  		}
   258  		c.Accounts[controllerName] = accounts
   259  	}
   260  	if len(accounts.Accounts) > 0 {
   261  		if _, ok := accounts.Accounts[accountName]; !ok {
   262  			return errors.AlreadyExistsf(
   263  				"alternative account for controller %s",
   264  				controllerName,
   265  			)
   266  		}
   267  	}
   268  	accounts.Accounts[accountName] = details
   269  	return nil
   270  
   271  }
   272  
   273  // SetCurrentAccount implements AccountUpdater.
   274  func (c *MemStore) SetCurrentAccount(controllerName, accountName string) error {
   275  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   276  		return err
   277  	}
   278  	if err := jujuclient.ValidateAccountName(accountName); err != nil {
   279  		return err
   280  	}
   281  	accounts, ok := c.Accounts[controllerName]
   282  	if !ok {
   283  		return errors.NotFoundf("accounts for controller %s", controllerName)
   284  	}
   285  	if _, ok := accounts.Accounts[accountName]; !ok {
   286  		return errors.NotFoundf("account %s:%s", controllerName, accountName)
   287  	}
   288  	accounts.CurrentAccount = accountName
   289  	return nil
   290  }
   291  
   292  // AllAccounts implements AccountGetter.
   293  func (c *MemStore) AllAccounts(controllerName string) (map[string]jujuclient.AccountDetails, error) {
   294  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   295  		return nil, err
   296  	}
   297  	accounts, ok := c.Accounts[controllerName]
   298  	if !ok {
   299  		return nil, errors.NotFoundf("accounts for controller %s", controllerName)
   300  	}
   301  	return accounts.Accounts, nil
   302  }
   303  
   304  // CurrentAccount implements AccountGetter.
   305  func (c *MemStore) CurrentAccount(controllerName string) (string, error) {
   306  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   307  		return "", err
   308  	}
   309  	accounts, ok := c.Accounts[controllerName]
   310  	if !ok {
   311  		return "", errors.NotFoundf("accounts for controller %s", controllerName)
   312  	}
   313  	if accounts.CurrentAccount == "" {
   314  		return "", errors.NotFoundf("current account for controller %s", controllerName)
   315  	}
   316  	return accounts.CurrentAccount, nil
   317  }
   318  
   319  // AccountByName implements AccountGetter.
   320  func (c *MemStore) AccountByName(controllerName, accountName string) (*jujuclient.AccountDetails, error) {
   321  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   322  		return nil, err
   323  	}
   324  	if err := jujuclient.ValidateAccountName(accountName); err != nil {
   325  		return nil, err
   326  	}
   327  	accounts, ok := c.Accounts[controllerName]
   328  	if !ok {
   329  		return nil, errors.NotFoundf("accounts for controller %s", controllerName)
   330  	}
   331  	details, ok := accounts.Accounts[accountName]
   332  	if !ok {
   333  		return nil, errors.NotFoundf("account %s:%s", controllerName, accountName)
   334  	}
   335  	return &details, nil
   336  }
   337  
   338  // RemoveAccount implements AccountRemover.
   339  func (c *MemStore) RemoveAccount(controllerName, accountName string) error {
   340  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   341  		return err
   342  	}
   343  	if err := jujuclient.ValidateAccountName(accountName); err != nil {
   344  		return err
   345  	}
   346  	accounts, ok := c.Accounts[controllerName]
   347  	if !ok {
   348  		return errors.NotFoundf("accounts for controller %s", controllerName)
   349  	}
   350  	if _, ok := accounts.Accounts[accountName]; !ok {
   351  		return errors.NotFoundf("account %s:%s", controllerName, accountName)
   352  	}
   353  	delete(accounts.Accounts, accountName)
   354  	if accounts.CurrentAccount == accountName {
   355  		accounts.CurrentAccount = ""
   356  	}
   357  	return nil
   358  }
   359  
   360  // UpdateCredential implements CredentialsUpdater.
   361  func (c *MemStore) UpdateCredential(cloudName string, details cloud.CloudCredential) error {
   362  	c.Credentials[cloudName] = details
   363  	return nil
   364  }
   365  
   366  // CredentialForCloud implements CredentialsGetter.
   367  func (c *MemStore) CredentialForCloud(cloudName string) (*cloud.CloudCredential, error) {
   368  	if result, ok := c.Credentials[cloudName]; ok {
   369  		return &result, nil
   370  	}
   371  	return nil, errors.NotFoundf("credentials for cloud %s", cloudName)
   372  }
   373  
   374  // AllCredentials implements CredentialsGetter.
   375  func (c *MemStore) AllCredentials() (map[string]cloud.CloudCredential, error) {
   376  	result := make(map[string]cloud.CloudCredential)
   377  	for k, v := range c.Credentials {
   378  		result[k] = v
   379  	}
   380  	return result, nil
   381  }
   382  
   383  // UpdateBootstrapConfig implements BootstrapConfigUpdater.
   384  func (c *MemStore) UpdateBootstrapConfig(controllerName string, cfg jujuclient.BootstrapConfig) error {
   385  	if err := jujuclient.ValidateControllerName(controllerName); err != nil {
   386  		return err
   387  	}
   388  	if err := jujuclient.ValidateBootstrapConfig(cfg); err != nil {
   389  		return err
   390  	}
   391  	c.BootstrapConfig[controllerName] = cfg
   392  	return nil
   393  
   394  }
   395  
   396  // BootstrapConfigForController implements BootstrapConfigGetter.
   397  func (c *MemStore) BootstrapConfigForController(controllerName string) (*jujuclient.BootstrapConfig, error) {
   398  	if cfg, ok := c.BootstrapConfig[controllerName]; ok {
   399  		return &cfg, nil
   400  	}
   401  	return nil, errors.NotFoundf("bootstrap config for controller %s", controllerName)
   402  
   403  }