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 }