Skip to content

Commit d63fd03

Browse files
author
Piotr Figwer
authored
Merge pull request #102 from Appliscale/update-stack-mode
Update Stack Mode #90
2 parents f88b9b7 + 849651d commit d63fd03

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

cliparser/cliparser.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ var OfflineValidateMode = "validate_offline"
3232
var ConfigureMode = "configure"
3333
var CreateStackMode = "create-stack"
3434
var DestroyStackMode = "delete-stack"
35+
var UpdateStackMode = "update-stack"
3536
var MfaMode = "mfa"
3637

3738
type CliArguments struct {
@@ -88,6 +89,13 @@ func ParseCliArguments(args []string) (cliArguments CliArguments, err error) {
8889
deleteStack = app.Command(DestroyStackMode, "Deletes a stack on aws")
8990
deleteStackName = deleteStack.Arg("stack", "An AWS stack name.").Required().String()
9091

92+
updateStack = app.Command(UpdateStackMode, "Updates a stack on aws")
93+
updateStackName = updateStack.Arg("stack", "An AWS stack name").String()
94+
updateStackTemplate = updateStack.Arg("template", "A path to the template file.").String()
95+
updateStackImpName = updateStack.Flag("stack", "Sn AWS stack name.").String()
96+
updateStackImpTemplate = updateStack.Flag("template", "A path to the template file.").String()
97+
updateStackCapabilities = updateStack.Flag("capabilities", "Capabilities: CAPABILITY_IAM | CAPABILITY_NAMED_IAM").Enums("CAPABILITY_IAM", "CAPABILITY_NAMED_IAM")
98+
9199
mfaCommand = app.Command(MfaMode, "Create temporary secure credentials with MFA.")
92100
)
93101

@@ -133,6 +141,23 @@ func ParseCliArguments(args []string) (cliArguments CliArguments, err error) {
133141
case mfaCommand.FullCommand():
134142
cliArguments.Mode = &MfaMode
135143

144+
// update Stack
145+
case updateStack.FullCommand():
146+
cliArguments.Mode = &UpdateStackMode
147+
cliArguments.Capabilities = updateStackCapabilities
148+
if len(*updateStackImpTemplate) > 0 && len(*updateStackImpName) > 0 {
149+
cliArguments.Stack = updateStackImpName
150+
cliArguments.TemplatePath = updateStackImpTemplate
151+
} else if len(*updateStackName) > 0 && len(*updateStackTemplate) > 0 {
152+
cliArguments.Stack = updateStackName
153+
cliArguments.TemplatePath = updateStackTemplate
154+
} else if len(*updateStackName) > 0 && len(*updateStackImpTemplate) > 0 {
155+
cliArguments.Stack = updateStackName
156+
cliArguments.TemplatePath = updateStackImpTemplate
157+
} else {
158+
err = errors.New("You have to specify stack name and template file, try --help")
159+
return
160+
}
136161
}
137162

138163
// OTHER FLAGS

main.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,10 @@ func main() {
8989
os.Exit(1)
9090
}
9191
}
92+
93+
if *context.CliArguments.Mode == cliparser.UpdateStackMode {
94+
stack.UpdateStack(&context)
95+
os.Exit(0)
96+
}
97+
9298
}

stack/stack.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@ func createStackInput(context *context.Context, template *string, stackName *str
2626
return templateStruct
2727
}
2828

29+
// This function gets template and name of stack. It creates "CreateStackInput" structure.
30+
func updateStackInput(context *context.Context, template *string, stackName *string) cloudformation.UpdateStackInput {
31+
rawCapabilities := *context.CliArguments.Capabilities
32+
capabilities := make([]*string, len(rawCapabilities))
33+
for i, capability := range rawCapabilities {
34+
capabilities[i] = &capability
35+
}
36+
templateStruct := cloudformation.UpdateStackInput{
37+
TemplateBody: template,
38+
StackName: stackName,
39+
Capabilities: capabilities,
40+
}
41+
return templateStruct
42+
}
43+
2944
// This function reads "StackName" from Stack in CliArguments and file from TemplatePath in CliArguments. It converts these to type string.
3045
func getTemplateFromFile(context *context.Context) (string, string) {
3146

@@ -70,6 +85,23 @@ func DestroyStack(context *context.Context) {
7085
}
7186
}
7287

88+
func UpdateStack(context *context.Context) {
89+
template, stackName := getTemplateFromFile(context)
90+
templateStruct := updateStackInput(context, &template, &stackName)
91+
session := mysession.InitializeSession(context)
92+
err := updateStack(templateStruct, session)
93+
if err != nil {
94+
context.Logger.Error(err.Error())
95+
os.Exit(1)
96+
}
97+
}
98+
99+
func updateStack(updateStackInput cloudformation.UpdateStackInput, session *session.Session) error {
100+
api := cloudformation.New(session)
101+
_, err := api.UpdateStack(&updateStackInput)
102+
return err
103+
}
104+
73105
// This function gets "StackName" from Stack in CliArguments and creates "DeleteStackInput" structure.
74106
func deleteStackInput(context *context.Context) cloudformation.DeleteStackInput {
75107
name := *context.CliArguments.Stack

0 commit comments

Comments
 (0)