This change implements basic plugin management, but we do not yet actually use the plugins for anything (that comes next). Plugins are stored in `~/.pulumi/plugins`, and are expected to be in the format `pulumi-<KIND>-<NAME>-v<VERSION>[.exe]`. The KIND is one of `analyzer`, `language`, or `resource`, the NAME is a hyphen- delimited name (e.g., `aws` or `foo-bar`), and VERSION is the plugin's semantic version (e.g., `0.9.11`, `1.3.7-beta.a736cf`, etc). This commit includes four new CLI commands: * `pulumi plugin` is the top-level plugin command. It does nothing but show the help text for associated child commands. * `pulumi plugin install` can be used to install plugins manually. If run with no additional arguments, it will compute the set of plugins used by the current project, and download them all. It may be run to explicitly download a single plugin, however, by invoking it as `pulumi plugin install KIND NAME VERSION`. For example, `pulumi plugin install resource aws v0.9.11`. By default, this command uses the cloud backend in the usual way to perform the download, although a separate URL may be given with --cloud-url, just like all other commands that interact with our backend service. * `pulumi plugin ls` lists all plugins currently installed in the plugin cache. It displays some useful statistics, like the size of the plugin, when it was installed, when it was last used, and so on. It sorts the display alphabetically by plugin name, and for plugins with multiple versions, it shows the newest at the top. The command also summarizes how much disk space is currently being consumed by the plugin cache. There are no filtering capabilities yet. * `pulumi plugin prune` will delete plugins from the cache. By default, when run with no arguments, it will delete everything. It may be run with additional arguments, KIND, NAME, and VERSION, each one getting more specific about what it will delete. For instance, `pulumi plugin prune resource aws` will delete all AWS plugin versions, while `pulumi plugin prune resource aws <0.9` will delete all AWS plugins before version 0.9. Unless --yes is passed, the command will confirm the deletion with a count of how many plugins will be affected by the command. We do not yet actually download plugins on demand yet. That will come in a subsequent change.
81 lines
2 KiB
Go
81 lines
2 KiB
Go
// Copyright 2016-2017, Pulumi Corporation. All rights reserved.
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/pulumi/pulumi/pkg/backend"
|
|
"github.com/pulumi/pulumi/pkg/tokens"
|
|
"github.com/pulumi/pulumi/pkg/util/cmdutil"
|
|
)
|
|
|
|
func newHistoryCmd() *cobra.Command {
|
|
var stack string
|
|
var outputJSON bool // Requires PULUMI_DEBUG_COMMANDS
|
|
|
|
var cmd = &cobra.Command{
|
|
Use: "history",
|
|
Aliases: []string{"hist"},
|
|
SuggestFor: []string{"updates"},
|
|
Short: "Update history for a stack",
|
|
Long: "Update history for a stack\n" +
|
|
"\n" +
|
|
"This command lists data about previous updates for a stack.",
|
|
Args: cmdutil.NoArgs,
|
|
Run: cmdutil.RunFunc(func(cmd *cobra.Command, args []string) error {
|
|
s, err := requireStack(tokens.QName(stack), false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
b := s.Backend()
|
|
updates, err := b.GetHistory(s.Name())
|
|
if err != nil {
|
|
return errors.Wrap(err, "getting history")
|
|
}
|
|
|
|
// Sort the updates to ensure the most recent updates come first.
|
|
backend.Sort(updates)
|
|
|
|
if outputJSON {
|
|
b, err := json.MarshalIndent(updates, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Println(string(b))
|
|
} else {
|
|
printUpdateHistory(updates)
|
|
}
|
|
|
|
return nil
|
|
}),
|
|
}
|
|
|
|
cmd.PersistentFlags().StringVarP(
|
|
&stack, "stack", "s", "",
|
|
"Choose a stack other than the currently selected one")
|
|
|
|
// pulumi/issues/496 tracks adding a --format option across all commands. Rather than expose a partial solution
|
|
// for just `history`, we put the JSON flag behind an env var so we can use in tests w/o making public.
|
|
if cmdutil.IsTruthy(os.Getenv("PULUMI_DEBUG_COMMANDS")) {
|
|
cmd.PersistentFlags().BoolVar(&outputJSON, "output-json", false, "Output stack history as JSON")
|
|
}
|
|
|
|
return cmd
|
|
}
|
|
|
|
func printUpdateHistory(updates []backend.UpdateInfo) {
|
|
if len(updates) == 0 {
|
|
fmt.Println("Stack has never been updated")
|
|
return
|
|
}
|
|
for _, update := range updates {
|
|
fmt.Printf("%8v %8v %v\n", update.Kind, update.Result, update.Message)
|
|
}
|
|
}
|