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 }