This change implements a `pulumi refresh` command. It operates a bit like `pulumi update`, and friends, in that it supports `--preview` and `--diff`, along with the usual flags, and will update your checkpoint. It works through substitution of the deploy.Source abstraction, which generates a sequence of resource registration events. This new deploy.RefreshSource takes in a prior checkpoint and will walk it, refreshing the state via the associated resource providers by invoking Read for each resource encountered, and merging the resulting state with the prior checkpoint, to yield a new resource.Goal state. This state is then fed through the engine in the usual ways with a few minor caveats: namely, although the engine must generate steps for the logical operations (permitting us to get nice summaries, progress, and diffs), it mustn't actually carry them out because the state being imported already reflects reality (a deleted resource has *already* been deleted, so of course the engine need not perform the deletion). The diffing logic also needs to know how to treat the case of refresh slightly differently, because we are going to be diffing outputs and not inputs. Note that support for managed stacks is not yet complete, since that requires updates to the service to support a refresh endpoint. That will be coming soon ...
136 lines
4.4 KiB
Go
136 lines
4.4 KiB
Go
// Copyright 2016-2018, Pulumi Corporation. All rights reserved.
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
"golang.org/x/crypto/ssh/terminal"
|
|
|
|
"github.com/pulumi/pulumi/pkg/backend"
|
|
"github.com/pulumi/pulumi/pkg/engine"
|
|
"github.com/pulumi/pulumi/pkg/tokens"
|
|
"github.com/pulumi/pulumi/pkg/util/cmdutil"
|
|
)
|
|
|
|
func newDestroyCmd() *cobra.Command {
|
|
var debug bool
|
|
var stack string
|
|
|
|
var message string
|
|
|
|
// Flags for engine.UpdateOptions.
|
|
var analyzers []string
|
|
var color colorFlag
|
|
var diffDisplay bool
|
|
var parallel int
|
|
var force bool
|
|
var preview bool
|
|
var showConfig bool
|
|
var showReplacementSteps bool
|
|
var showSames bool
|
|
|
|
var cmd = &cobra.Command{
|
|
Use: "destroy",
|
|
SuggestFor: []string{"delete", "down", "kill", "remove", "rm", "stop"},
|
|
Short: "Destroy an existing stack and its resources",
|
|
Long: "Destroy an existing stack and its resources\n" +
|
|
"\n" +
|
|
"This command deletes an entire existing stack by name. The current state is\n" +
|
|
"loaded from the associated snapshot file in the workspace. After running to completion,\n" +
|
|
"all of this stack's resources and associated state will be gone.\n" +
|
|
"\n" +
|
|
"Warning: although old snapshots can be used to recreate a stack, this command\n" +
|
|
"is generally irreversible and should be used with great care.",
|
|
Args: cmdutil.NoArgs,
|
|
Run: cmdutil.RunFunc(func(cmd *cobra.Command, args []string) error {
|
|
if !force && !preview && !terminal.IsTerminal(int(os.Stdout.Fd())) {
|
|
return errors.New("'destroy' must be run interactively or be passed the --force or --preview flags")
|
|
}
|
|
|
|
if force && preview {
|
|
return errors.New("--force and --preview cannot both be specified")
|
|
}
|
|
|
|
s, err := requireStack(tokens.QName(stack), false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
proj, root, err := readProject()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
m, err := getUpdateMetadata(message, root)
|
|
if err != nil {
|
|
return errors.Wrap(err, "gathering environment metadata")
|
|
}
|
|
|
|
if !force && !preview {
|
|
prompt := fmt.Sprintf("This will permanently destroy all resources in the '%s' stack!", s.Name())
|
|
|
|
if !confirmPrompt(prompt, string(s.Name())) {
|
|
return errors.New("confirmation declined")
|
|
}
|
|
}
|
|
|
|
return s.Destroy(proj, root, m, engine.UpdateOptions{
|
|
Analyzers: analyzers,
|
|
Force: force,
|
|
Preview: preview,
|
|
Parallel: parallel,
|
|
Debug: debug,
|
|
}, backend.DisplayOptions{
|
|
Color: color.Colorization(),
|
|
ShowConfig: showConfig,
|
|
ShowReplacementSteps: showReplacementSteps,
|
|
ShowSameResources: showSames,
|
|
DiffDisplay: diffDisplay,
|
|
Debug: debug,
|
|
})
|
|
}),
|
|
}
|
|
|
|
cmd.PersistentFlags().BoolVarP(
|
|
&debug, "debug", "d", false,
|
|
"Print detailed debugging output during resource operations")
|
|
cmd.PersistentFlags().StringVarP(
|
|
&stack, "stack", "s", "",
|
|
"Choose a stack other than the currently selected one")
|
|
cmd.PersistentFlags().StringVarP(
|
|
&message, "message", "m", "",
|
|
"Optional message to associate with the destroy operation")
|
|
|
|
// Flags for engine.UpdateOptions.
|
|
cmd.PersistentFlags().StringSliceVar(
|
|
&analyzers, "analyzer", []string{},
|
|
"Run one or more analyzers as part of this update")
|
|
cmd.PersistentFlags().VarP(
|
|
&color, "color", "c", "Colorize output. Choices are: always, never, raw, auto")
|
|
cmd.PersistentFlags().BoolVar(
|
|
&diffDisplay, "diff", false,
|
|
"Display operation as a rich diff showing the overall change")
|
|
cmd.PersistentFlags().IntVarP(
|
|
¶llel, "parallel", "p", 0,
|
|
"Allow P resource operations to run in parallel at once (<=1 for no parallelism)")
|
|
cmd.PersistentFlags().BoolVarP(
|
|
&force, "force", "f", false,
|
|
"Skip confirmation prompts and preview, and proceed with the destruction automatically")
|
|
cmd.PersistentFlags().BoolVar(
|
|
&preview, "preview", false,
|
|
"Only show a preview of what will happen, without prompting or making any changes")
|
|
cmd.PersistentFlags().BoolVar(
|
|
&showConfig, "show-config", false,
|
|
"Show configuration keys and variables")
|
|
cmd.PersistentFlags().BoolVar(
|
|
&showReplacementSteps, "show-replacement-steps", false,
|
|
"Show detailed resource replacement creates and deletes instead of a single step")
|
|
cmd.PersistentFlags().BoolVar(
|
|
&showSames, "show-sames", false,
|
|
"Show resources that don't need to be updated because they haven't changed, alongside those that do")
|
|
|
|
return cmd
|
|
}
|