func (c *unregisterCommand) Run(ctx *cmd.Context) error { _, err := c.store.ControllerByName(c.controllerName) if err != nil { return errors.Trace(err) } if !c.assumeYes { fmt.Fprintf(ctx.Stdout, unregisterMsg, c.controllerName) if err := jujucmd.UserConfirmYes(ctx); err != nil { return errors.Annotate(err, "unregistering controller") } } return (c.store.RemoveController(c.controllerName)) }
// Run implements Command.Run func (c *destroyCommand) Run(ctx *cmd.Context) error { store := c.ClientStore() controllerName := c.ControllerName() accountName := c.AccountName() modelName := c.ModelName() controllerDetails, err := store.ControllerByName(controllerName) if err != nil { return errors.Annotate(err, "cannot read controller details") } modelDetails, err := store.ModelByName(controllerName, accountName, modelName) if err != nil { return errors.Annotate(err, "cannot read model info") } if modelDetails.ModelUUID == controllerDetails.ControllerUUID { return errors.Errorf("%q is a controller; use 'juju destroy-controller' to destroy it", modelName) } if !c.assumeYes { fmt.Fprintf(ctx.Stdout, destroyEnvMsg, modelName) if err := jujucmd.UserConfirmYes(ctx); err != nil { return errors.Annotate(err, "model destruction") } } // Attempt to connect to the API. If we can't, fail the destroy. api, err := c.getAPI() if err != nil { return errors.Annotate(err, "cannot connect to API") } defer api.Close() // Attempt to destroy the model. err = api.DestroyModel() if err != nil { return c.handleError(errors.Annotate(err, "cannot destroy model"), modelName) } err = store.RemoveModel(controllerName, accountName, modelName) if err != nil && !errors.IsNotFound(err) { return errors.Trace(err) } return nil }
// Run implements Command.Run func (c *destroyCommand) Run(ctx *cmd.Context) error { store, err := configstore.Default() if err != nil { return errors.Annotate(err, "cannot open environment info storage") } cfgInfo, err := store.ReadInfo(c.envName) if err != nil { return errors.Annotate(err, "cannot read environment info") } // Verify that we're not destroying a controller apiEndpoint := cfgInfo.APIEndpoint() if apiEndpoint.ServerUUID != "" && apiEndpoint.EnvironUUID == apiEndpoint.ServerUUID { return errors.Errorf("%q is a controller; use 'juju destroy-controller' to destroy it", c.envName) } if !c.assumeYes { fmt.Fprintf(ctx.Stdout, destroyEnvMsg, c.envName) if err := jujucmd.UserConfirmYes(ctx); err != nil { return errors.Annotate(err, "environment destruction") } } // Attempt to connect to the API. If we can't, fail the destroy. api, err := c.getAPI() if err != nil { return errors.Annotate(err, "cannot connect to API") } defer api.Close() // Attempt to destroy the environment. err = api.DestroyEnvironment() if err != nil { return c.handleError(errors.Annotate(err, "cannot destroy environment")) } return environs.DestroyInfo(c.envName, store) }
// Run implements Command.Run func (c *destroyCommand) Run(ctx *cmd.Context) error { store := c.ClientStore() controllerName := c.ControllerName() modelName := c.ModelName() controllerDetails, err := store.ControllerByName(controllerName) if err != nil { return errors.Annotate(err, "cannot read controller details") } modelDetails, err := store.ModelByName(controllerName, modelName) if errors.IsNotFound(err) { if err := c.RefreshModels(store, controllerName); err != nil { return errors.Annotate(err, "refreshing models cache") } // Now try again. modelDetails, err = store.ModelByName(controllerName, modelName) } if err != nil { return errors.Annotate(err, "cannot read model info") } if modelDetails.ModelUUID == controllerDetails.ControllerUUID { return errors.Errorf("%q is a controller; use 'juju destroy-controller' to destroy it", modelName) } if !c.assumeYes { fmt.Fprintf(ctx.Stdout, destroyEnvMsg, modelName) if err := jujucmd.UserConfirmYes(ctx); err != nil { return errors.Annotate(err, "model destruction") } } // Attempt to connect to the API. If we can't, fail the destroy. api, err := c.getAPI() if err != nil { return errors.Annotate(err, "cannot connect to API") } defer api.Close() // Attempt to destroy the model. ctx.Infof("Destroying model") err = api.DestroyModel(names.NewModelTag(modelDetails.ModelUUID)) if err != nil { return c.handleError(errors.Annotate(err, "cannot destroy model"), modelName) } // Wait for model to be destroyed. const modelStatusPollWait = 2 * time.Second modelStatus := newTimedModelStatus(ctx, api, names.NewModelTag(modelDetails.ModelUUID), c.sleepFunc) modelData := modelStatus(0) for modelData != nil { ctx.Infof(formatDestroyModelInfo(modelData) + "...") modelData = modelStatus(modelStatusPollWait) } err = store.RemoveModel(controllerName, modelName) if err != nil && !errors.IsNotFound(err) { return errors.Trace(err) } return nil }