-
Notifications
You must be signed in to change notification settings - Fork 5
/
deploy.go
128 lines (110 loc) · 2.61 KB
/
deploy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package commands
import (
"fmt"
"io/ioutil"
"log"
"os"
"time"
"github.com/aws/aws-sdk-go/service/cloudformation"
"github.com/spf13/cobra"
)
var tagsFile string
var templateFile string
var parametersFile string
var deployCmd = &cobra.Command{
Use: "deploy",
Short: "Deploy a CloudFormation Stack",
Run: func(cmd *cobra.Command, args []string) {
// Read template-file
if templateFile == "" {
if err := cmd.Usage(); err != nil {
log.Fatal(err)
}
fmt.Printf("\nArgument 'template-file' is required\n")
os.Exit(1)
}
templateBody, err := ioutil.ReadFile(templateFile)
if err != nil {
log.Fatal(err)
}
stack.TemplateBody = string(templateBody)
// Read tags-file
if tagsFile != "" {
tagsBody, err := ioutil.ReadFile(tagsFile)
if err != nil {
log.Fatal(err)
}
stack.TagsBody = string(tagsBody)
}
// Read tags-file
if parametersFile != "" {
parametersBody, err := ioutil.ReadFile(parametersFile)
if err != nil {
log.Fatal(err)
}
stack.ParametersBody = string(parametersBody)
}
// Populate Stack ID
// Deliberately ignore errors here
stack.GetStackInfo()
after, err := stack.GetLastEventTime()
if err != nil {
// default to epoch as the time to look for events from
epoch := time.Unix(0, 0)
after = &epoch
}
output, err := stack.Deploy()
if err != nil {
log.Fatal(err)
}
if t := "No updates are to be performed."; output.Message == t {
fmt.Println(t)
return
}
for {
// Refresh Stack State
if err := stack.GetStackInfo(); err != nil {
log.Fatal(err)
}
printStackEvents(&stack, after)
status := *stack.StackInfo.StackStatus
switch {
case stackInProgressRegexp.MatchString(status):
case status == cloudformation.StackStatusCreateComplete:
return
case status == cloudformation.StackStatusUpdateComplete:
return
default:
fmt.Print("\n")
log.Fatal(fmt.Errorf("Stack deploy failed! Stack Status: %s", status))
}
time.Sleep(5 * time.Second)
}
},
}
func init() {
deployCmd.PersistentFlags().StringVarP(
&templateFile,
"template-file",
"t",
"",
"Path to the CloudFormation template to be deployed",
)
deployCmd.MarkFlagFilename("template-file")
deployCmd.PersistentFlags().StringVarP(
¶metersFile,
"parameters-file",
"p",
"",
"Path to the file which contains the parameters for this stack",
)
deployCmd.MarkFlagFilename("parameters-file")
deployCmd.PersistentFlags().StringVar(
&tagsFile,
"tags-file",
"",
"Path to the file which contains the tags for this stack",
)
deployCmd.MarkFlagFilename("tags-file")
rootCmd.AddCommand(deployCmd)
}