// Print a Cloudformation template to stdout. func stackTemplate(c *cli.Context) { stackName := c.Args().First() if c.String("region") != "" { stack.Region = c.String("region") } if stackName == "" { os.Stdout.Write(stack.DefaultGalaxyTemplate()) return } if c.String("region") != "" { stack.Region = c.String("region") } stackTmpl, err := stack.GetTemplate(stackName) if err != nil { if err, ok := err.(*aws.Error); ok { if err.Code == "ValidationError" && strings.Contains(err.Message, "does not exist") { log.Fatalf("ERROR: Stack '%s' does not exist", stackName) } } log.Fatal(err) } if _, err := os.Stdout.Write(stackTmpl); err != nil { log.Fatal(err) } }
// update the base stack func stackUpdate(c *cli.Context) { var stackTmpl []byte var err error stackName := c.Args().First() if stackName == "" { log.Fatal("ERROR: stack name required") } if c.String("region") != "" { stack.Region = c.String("region") } params := make(map[string]string) if p := c.String("parameters"); p != "" { paramJSON, err := jsonFromArg(p) if err != nil { log.Fatal("ERROR: decoding parameters:", err) } err = json.Unmarshal(paramJSON, ¶ms) if err != nil { log.Fatal(err) } } template := c.String("template") if template != "" { stackTmpl, err = jsonFromArg(template) if err != nil { log.Fatalf("ERROR: %s", err) } } if policy := c.String("policy"); policy != "" { policyJSON, err := jsonFromArg(policy) if err != nil { log.Fatal("policy error:", err) } params["StackPolicyDuringUpdateBody"] = string(policyJSON) } if len(stackTmpl) == 0 { // get the current running template stackTmpl, err = stack.GetTemplate(stackName) if err != nil { log.Fatal(err) } } // this reads the Parameters supplied for our current stack for us shared := sharedResources(c, stackName) // add any missing parameters to our for key, val := range shared.Parameters { if params[key] == "" { params[key] = val } } p, _ := json.MarshalIndent(params, "", " ") ok := promptValue(fmt.Sprintf("\nUpdate the [%s] stack with:\n%s\nAccept?", stackName, string(p)), "n") switch strings.ToLower(ok) { case "y", "yes": _, err = stack.Update(stackName, stackTmpl, params) if err != nil { log.Fatal(err) } log.Println("Updating stack:", stackName) default: log.Fatal("aborted") } }