func (c *useModelCommand) updateCachedInfo(info configstore.EnvironInfo, modelUUID string, creds configstore.APICredentials, endpoint configstore.APIEndpoint) error { info.SetAPICredentials(creds) // Specify the model UUID. The server UUID will be the same as the // endpoint that we have just connected to, as will be the CACert, addresses // and hostnames. endpoint.ModelUUID = modelUUID info.SetAPIEndpoint(endpoint) return errors.Trace(info.Write()) }
func (c *createModelCommand) Run(ctx *cmd.Context) (return_err error) { client, err := c.getAPI() if err != nil { return err } defer client.Close() creds, err := c.ConnectionCredentials() if err != nil { return errors.Trace(err) } creatingForSelf := true envOwner := creds.User if c.Owner != "" { owner := names.NewUserTag(c.Owner) user := names.NewUserTag(creds.User) creatingForSelf = owner == user envOwner = c.Owner } var info configstore.EnvironInfo var endpoint configstore.APIEndpoint if creatingForSelf { logger.Debugf("create cache entry for %q", c.Name) // Create the configstore entry and write it to disk, as this will error // if one with the same name already exists. endpoint, err = c.ConnectionEndpoint() if err != nil { return errors.Trace(err) } store, err := configstore.Default() if err != nil { return errors.Trace(err) } info = store.CreateInfo(c.Name) info.SetAPICredentials(creds) endpoint.ModelUUID = "" if err := info.Write(); err != nil { if errors.Cause(err) == configstore.ErrEnvironInfoAlreadyExists { newErr := errors.AlreadyExistsf("model %q", c.Name) return errors.Wrap(err, newErr) } return errors.Trace(err) } defer func() { if return_err != nil { logger.Debugf("error found, remove cache entry") e := info.Destroy() if e != nil { logger.Errorf("could not remove model file: %v", e) } } }() } else { logger.Debugf("skipping cache entry for %q as owned %q", c.Name, c.Owner) } serverSkeleton, err := client.ConfigSkeleton("", "") if err != nil { return errors.Trace(err) } attrs, err := c.getConfigValues(ctx, serverSkeleton) if err != nil { return errors.Trace(err) } // We pass nil through for the account details until we implement that bit. env, err := client.CreateModel(envOwner, nil, attrs) if err != nil { // cleanup configstore return errors.Trace(err) } if creatingForSelf { // update the cached details with the environment uuid endpoint.ModelUUID = env.UUID info.SetAPIEndpoint(endpoint) if err := info.Write(); err != nil { return errors.Trace(err) } ctx.Infof("created model %q", c.Name) return modelcmd.SetCurrentModel(ctx, c.Name) } else { ctx.Infof("created model %q for %q", c.Name, c.Owner) } return nil }