pulumi/cmd/history.go
Matt Ellis cdcee76abd Fix flaky update history test
The filenames we used to store history data locally only had second
level precision. On my machine, the test history test is able to run
multiple `pulumi update` commands in the same second, which causes a
newer history file to overwrite an older one.

This change moves to using a nanosecond precision timestamp when
writing config. In addition, the CLI was trying to sort the updates
that came back from the backend (instead of just trusting them to be
in newest first order, as we documented) so I removed that code as
well.
2018-03-01 16:20:09 -08:00

78 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
}
// GetHistory returns an array with the newest update first
updates, err := s.Backend().GetHistory(s.Name())
if err != nil {
return errors.Wrap(err, "getting history")
}
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)
}
}