summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/cloudformation/cloudformation_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/goamz/goamz/cloudformation/cloudformation_test.go')
-rw-r--r--vendor/github.com/goamz/goamz/cloudformation/cloudformation_test.go653
1 files changed, 653 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/cloudformation/cloudformation_test.go b/vendor/github.com/goamz/goamz/cloudformation/cloudformation_test.go
new file mode 100644
index 000000000..1937e8042
--- /dev/null
+++ b/vendor/github.com/goamz/goamz/cloudformation/cloudformation_test.go
@@ -0,0 +1,653 @@
+package cloudformation_test
+
+import (
+ "testing"
+ "time"
+
+ . "gopkg.in/check.v1"
+
+ "github.com/goamz/goamz/aws"
+ cf "github.com/goamz/goamz/cloudformation"
+ "github.com/goamz/goamz/testutil"
+)
+
+func Test(t *testing.T) {
+ TestingT(t)
+}
+
+var _ = Suite(&S{})
+
+type S struct {
+ cf *cf.CloudFormation
+}
+
+var testServer = testutil.NewHTTPServer()
+
+var mockTest bool
+
+func (s *S) SetUpSuite(c *C) {
+ testServer.Start()
+ auth := aws.Auth{AccessKey: "abc", SecretKey: "123"}
+ s.cf = cf.New(auth, aws.Region{CloudFormationEndpoint: testServer.URL})
+}
+
+func (s *S) TearDownTest(c *C) {
+ testServer.Flush()
+}
+
+func (s *S) TestCancelUpdateStack(c *C) {
+ testServer.Response(200, nil, CancelUpdateStackResponse)
+
+ resp, err := s.cf.CancelUpdateStack("foo")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "CancelUpdateStack")
+ c.Assert(values.Get("StackName"), Equals, "foo")
+ // Response test
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+}
+
+func (s *S) TestCreateStack(c *C) {
+ testServer.Response(200, nil, CreateStackResponse)
+
+ stackParams := &cf.CreateStackParams{
+ NotificationARNs: []string{"arn:aws:sns:us-east-1:1234567890:my-topic"},
+ Parameters: []cf.Parameter{
+ {
+ ParameterKey: "AvailabilityZone",
+ ParameterValue: "us-east-1a",
+ },
+ },
+ StackName: "MyStack",
+ TemplateBody: "[Template Document]",
+ }
+ resp, err := s.cf.CreateStack(stackParams)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "CreateStack")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("NotificationARNs.member.1"), Equals, "arn:aws:sns:us-east-1:1234567890:my-topic")
+ c.Assert(values.Get("TemplateBody"), Equals, "[Template Document]")
+ c.Assert(values.Get("Parameters.member.1.ParameterKey"), Equals, "AvailabilityZone")
+ c.Assert(values.Get("Parameters.member.1.ParameterValue"), Equals, "us-east-1a")
+ // Response test
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+ c.Assert(resp.StackId, Equals, "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83")
+}
+
+func (s *S) TestCreateStackWithInvalidParams(c *C) {
+ testServer.Response(400, nil, CreateStackWithInvalidParamsResponse)
+ //testServer.Response(200, nil, DeleteAutoScalingGroupResponse)
+
+ cfTemplate := `
+{
+ "AWSTemplateFormatVersion" : "2010-09-09",
+ "Description" : "Sample template",
+ "Parameters" : {
+ "KeyName" : {
+ "Description" : "key pair",
+ "Type" : "String"
+ }
+ },
+ "Resources" : {
+ "Ec2Instance" : {
+ "Type" : "AWS::EC2::Instance",
+ "Properties" : {
+ "KeyName" : { "Ref" : "KeyName" },
+ "ImageId" : "ami-7f418316",
+ "UserData" : { "Fn::Base64" : "80" }
+ }
+ }
+ },
+ "Outputs" : {
+ "InstanceId" : {
+ "Description" : "InstanceId of the newly created EC2 instance",
+ "Value" : { "Ref" : "Ec2Instance" }
+ }
+}`
+
+ stackParams := &cf.CreateStackParams{
+ Capabilities: []string{"CAPABILITY_IAM"},
+ DisableRollback: true,
+ NotificationARNs: []string{
+ "arn:aws:sns:us-east-1:1234567890:my-topic",
+ "arn:aws:sns:us-east-1:1234567890:my-topic2",
+ },
+ OnFailure: "ROLLBACK",
+ Parameters: []cf.Parameter{
+ {
+ ParameterKey: "AvailabilityZone",
+ ParameterValue: "us-east-1a",
+ },
+ },
+ StackName: "MyStack",
+ StackPolicyBody: "{PolicyBody}",
+ StackPolicyURL: "http://stack-policy-url",
+ Tags: []cf.Tag{
+ {
+ Key: "TagKey",
+ Value: "TagValue",
+ },
+ },
+ TemplateBody: cfTemplate,
+ TemplateURL: "http://url",
+ TimeoutInMinutes: 20,
+ }
+ resp, err := s.cf.CreateStack(stackParams)
+ c.Assert(err, NotNil)
+ c.Assert(resp, IsNil)
+ values := testServer.WaitRequest().PostForm
+
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "CreateStack")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("NotificationARNs.member.1"), Equals, "arn:aws:sns:us-east-1:1234567890:my-topic")
+ c.Assert(values.Get("NotificationARNs.member.2"), Equals, "arn:aws:sns:us-east-1:1234567890:my-topic2")
+ c.Assert(values.Get("Capabilities.member.1"), Equals, "CAPABILITY_IAM")
+ c.Assert(values.Get("TemplateBody"), Equals, cfTemplate)
+ c.Assert(values.Get("TemplateURL"), Equals, "http://url")
+ c.Assert(values.Get("StackPolicyBody"), Equals, "{PolicyBody}")
+ c.Assert(values.Get("StackPolicyURL"), Equals, "http://stack-policy-url")
+ c.Assert(values.Get("OnFailure"), Equals, "ROLLBACK")
+ c.Assert(values.Get("DisableRollback"), Equals, "true")
+ c.Assert(values.Get("Tags.member.1.Key"), Equals, "TagKey")
+ c.Assert(values.Get("Tags.member.1.Value"), Equals, "TagValue")
+ c.Assert(values.Get("Parameters.member.1.ParameterKey"), Equals, "AvailabilityZone")
+ c.Assert(values.Get("Parameters.member.1.ParameterValue"), Equals, "us-east-1a")
+ c.Assert(values.Get("TimeoutInMinutes"), Equals, "20")
+
+ // Response test
+ c.Assert(err.(*cf.Error).RequestId, Equals, "70a76d42-9665-11e2-9fdf-211deEXAMPLE")
+ c.Assert(err.(*cf.Error).Message, Equals, "Either Template URL or Template Body must be specified.")
+ c.Assert(err.(*cf.Error).Type, Equals, "Sender")
+ c.Assert(err.(*cf.Error).Code, Equals, "ValidationError")
+ c.Assert(err.(*cf.Error).StatusCode, Equals, 400)
+
+}
+
+func (s *S) TestDeleteStack(c *C) {
+ testServer.Response(200, nil, DeleteStackResponse)
+
+ resp, err := s.cf.DeleteStack("foo")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "DeleteStack")
+ c.Assert(values.Get("StackName"), Equals, "foo")
+ // Response test
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+}
+
+func (s *S) TestDescribeStackEvents(c *C) {
+ testServer.Response(200, nil, DescribeStackEventsResponse)
+
+ resp, err := s.cf.DescribeStackEvents("MyStack", "")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+
+ // Post request test
+ t1, _ := time.Parse(time.RFC3339, "2010-07-27T22:26:28Z")
+ t2, _ := time.Parse(time.RFC3339, "2010-07-27T22:27:28Z")
+ t3, _ := time.Parse(time.RFC3339, "2010-07-27T22:28:28Z")
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "DescribeStackEvents")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("NextToken"), Equals, "")
+
+ // Response test
+ expected := &cf.DescribeStackEventsResponse{
+ StackEvents: []cf.StackEvent{
+ {
+ EventId: "Event-1-Id",
+ StackId: "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83",
+ StackName: "MyStack",
+ LogicalResourceId: "MyStack",
+ PhysicalResourceId: "MyStack_One",
+ ResourceType: "AWS::CloudFormation::Stack",
+ Timestamp: t1,
+ ResourceStatus: "CREATE_IN_PROGRESS",
+ ResourceStatusReason: "User initiated",
+ },
+ {
+ EventId: "Event-2-Id",
+ StackId: "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83",
+ StackName: "MyStack",
+ LogicalResourceId: "MyDBInstance",
+ PhysicalResourceId: "MyStack_DB1",
+ ResourceType: "AWS::SecurityGroup",
+ Timestamp: t2,
+ ResourceStatus: "CREATE_IN_PROGRESS",
+ ResourceProperties: "{\"GroupDescription\":...}",
+ },
+ {
+ EventId: "Event-3-Id",
+ StackId: "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83",
+ StackName: "MyStack",
+ LogicalResourceId: "MySG1",
+ PhysicalResourceId: "MyStack_SG1",
+ ResourceType: "AWS::SecurityGroup",
+ Timestamp: t3,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ },
+ NextToken: "",
+ RequestId: "4af14eec-350e-11e4-b260-EXAMPLE",
+ }
+ c.Assert(resp, DeepEquals, expected)
+}
+
+func (s *S) TestDescribeStackResource(c *C) {
+ testServer.Response(200, nil, DescribeStackResourceResponse)
+
+ resp, err := s.cf.DescribeStackResource("MyStack", "MyDBInstance")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "DescribeStackResource")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("LogicalResourceId"), Equals, "MyDBInstance")
+ t, _ := time.Parse(time.RFC3339, "2011-07-07T22:27:28Z")
+ // Response test
+ expected := &cf.DescribeStackResourceResponse{
+ StackResourceDetail: cf.StackResourceDetail{
+ StackId: "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83",
+ StackName: "MyStack",
+ LogicalResourceId: "MyDBInstance",
+ PhysicalResourceId: "MyStack_DB1",
+ ResourceType: "AWS::RDS::DBInstance",
+ LastUpdatedTimestamp: t,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ RequestId: "4af14eec-350e-11e4-b260-EXAMPLE",
+ }
+ c.Assert(resp, DeepEquals, expected)
+}
+
+func (s *S) TestDescribeStackResources(c *C) {
+ testServer.Response(200, nil, DescribeStackResourcesResponse)
+
+ resp, err := s.cf.DescribeStackResources("MyStack", "", "")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+
+ // Post request test
+ t1, _ := time.Parse(time.RFC3339, "2010-07-27T22:27:28Z")
+ t2, _ := time.Parse(time.RFC3339, "2010-07-27T22:28:28Z")
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "DescribeStackResources")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("PhysicalResourceId"), Equals, "")
+ c.Assert(values.Get("LogicalResourceId"), Equals, "")
+
+ // Response test
+ expected := &cf.DescribeStackResourcesResponse{
+ StackResources: []cf.StackResource{
+ {
+ StackId: "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83",
+ StackName: "MyStack",
+ LogicalResourceId: "MyDBInstance",
+ PhysicalResourceId: "MyStack_DB1",
+ ResourceType: "AWS::DBInstance",
+ Timestamp: t1,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ {
+ StackId: "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83",
+ StackName: "MyStack",
+ LogicalResourceId: "MyAutoScalingGroup",
+ PhysicalResourceId: "MyStack_ASG1",
+ ResourceType: "AWS::AutoScalingGroup",
+ Timestamp: t2,
+ ResourceStatus: "CREATE_IN_PROGRESS",
+ },
+ },
+ RequestId: "4af14eec-350e-11e4-b260-EXAMPLE",
+ }
+ c.Assert(resp, DeepEquals, expected)
+}
+
+func (s *S) TestDescribeStacks(c *C) {
+ testServer.Response(200, nil, DescribeStacksResponse)
+
+ resp, err := s.cf.DescribeStacks("MyStack", "")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+
+ // Post request test
+ t, _ := time.Parse(time.RFC3339, "2010-07-27T22:28:28Z")
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "DescribeStacks")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("NextToken"), Equals, "")
+
+ // Response test
+ expected := &cf.DescribeStacksResponse{
+ Stacks: []cf.Stack{
+ {
+ StackId: "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83",
+ StackName: "MyStack",
+ Description: "My Description",
+ Capabilities: []string{"CAPABILITY_IAM"},
+ NotificationARNs: []string{"arn:aws:sns:region-name:account-name:topic-name"},
+ Parameters: []cf.Parameter{
+ {
+ ParameterKey: "MyKey",
+ ParameterValue: "MyValue",
+ },
+ },
+ Tags: []cf.Tag{
+ {
+ Key: "MyTagKey",
+ Value: "MyTagValue",
+ },
+ },
+ CreationTime: t,
+ StackStatus: "CREATE_COMPLETE",
+ DisableRollback: false,
+ Outputs: []cf.Output{
+ {
+ Description: "ServerUrl",
+ OutputKey: "StartPage",
+ OutputValue: "http://my-load-balancer.amazonaws.com:80/index.html",
+ },
+ },
+ },
+ },
+ NextToken: "",
+ RequestId: "4af14eec-350e-11e4-b260-EXAMPLE",
+ }
+ c.Assert(resp, DeepEquals, expected)
+}
+
+func (s *S) TestEstimateTemplateCost(c *C) {
+ testServer.Response(200, nil, EstimateTemplateCostResponse)
+
+ resp, err := s.cf.EstimateTemplateCost(nil, "", "https://s3.amazonaws.com/cloudformation-samples-us-east-1/Drupal_Simple.template")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "EstimateTemplateCost")
+ c.Assert(values.Get("TemplateBody"), Equals, "")
+ c.Assert(values.Get("TemplateURL"), Equals, "https://s3.amazonaws.com/cloudformation-samples-us-east-1/Drupal_Simple.template")
+ // Response test
+ c.Assert(resp.Url, Equals, "http://calculator.s3.amazonaws.com/calc5.html?key=cf-2e351785-e821-450c-9d58-625e1e1ebfb6")
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+}
+
+func (s *S) TestGetStackPolicy(c *C) {
+ testServer.Response(200, nil, GetStackPolicyResponse)
+
+ resp, err := s.cf.GetStackPolicy("MyStack")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "GetStackPolicy")
+
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ // Response test
+ policy := `{
+ "Statement" : [
+ {
+ "Effect" : "Deny",
+ "Action" : "Update:*",
+ "Principal" : "*",
+ "Resource" : "LogicalResourceId/ProductionDatabase"
+ },
+ {
+ "Effect" : "Allow",
+ "Action" : "Update:*",
+ "Principal" : "*",
+ "Resource" : "*"
+ }
+ ]
+ }`
+ c.Assert(resp.StackPolicyBody, Equals, policy)
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+}
+
+func (s *S) TestGetTemplate(c *C) {
+ testServer.Response(200, nil, GetTemplateResponse)
+
+ resp, err := s.cf.GetTemplate("MyStack")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "GetTemplate")
+
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ // Response test
+ templateBody := `{
+ "AWSTemplateFormatVersion" : "2010-09-09",
+ "Description" : "Simple example",
+ "Resources" : {
+ "MySQS" : {
+ "Type" : "AWS::SQS::Queue",
+ "Properties" : {
+ }
+ }
+ }
+ }`
+ c.Assert(resp.TemplateBody, Equals, templateBody)
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+}
+
+func (s *S) TestListStackResources(c *C) {
+ testServer.Response(200, nil, ListStackResourcesResponse)
+
+ resp, err := s.cf.ListStackResources("MyStack", "4dad1-32131da-d-31")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "ListStackResources")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("NextToken"), Equals, "4dad1-32131da-d-31")
+
+ // Response test
+ t1, _ := time.Parse(time.RFC3339, "2011-06-21T20:15:58Z")
+ t2, _ := time.Parse(time.RFC3339, "2011-06-21T20:25:57Z")
+ t3, _ := time.Parse(time.RFC3339, "2011-06-21T20:26:12Z")
+ t4, _ := time.Parse(time.RFC3339, "2011-06-21T20:28:48Z")
+ t5, _ := time.Parse(time.RFC3339, "2011-06-21T20:29:06Z")
+ t6, _ := time.Parse(time.RFC3339, "2011-06-21T20:29:23Z")
+
+ expected := &cf.ListStackResourcesResponse{
+ StackResourceSummaries: []cf.StackResourceSummary{
+ {
+ LogicalResourceId: "DBSecurityGroup",
+ PhysicalResourceId: "gmarcteststack-dbsecuritygroup-1s5m0ez5lkk6w",
+ ResourceType: "AWS::RDS::DBSecurityGroup",
+ LastUpdatedTimestamp: t1,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ {
+ LogicalResourceId: "SampleDB",
+ PhysicalResourceId: "MyStack-sampledb-ycwhk1v830lx",
+ ResourceType: "AWS::RDS::DBInstance",
+ LastUpdatedTimestamp: t2,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ {
+ LogicalResourceId: "SampleApplication",
+ PhysicalResourceId: "MyStack-SampleApplication-1MKNASYR3RBQL",
+ ResourceType: "AWS::ElasticBeanstalk::Application",
+ LastUpdatedTimestamp: t3,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ {
+ LogicalResourceId: "SampleEnvironment",
+ PhysicalResourceId: "myst-Samp-1AGU6ERZX6M3Q",
+ ResourceType: "AWS::ElasticBeanstalk::Environment",
+ LastUpdatedTimestamp: t4,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ {
+ LogicalResourceId: "AlarmTopic",
+ PhysicalResourceId: "arn:aws:sns:us-east-1:803981987763:MyStack-AlarmTopic-SW4IQELG7RPJ",
+ ResourceType: "AWS::SNS::Topic",
+ LastUpdatedTimestamp: t5,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ {
+ LogicalResourceId: "CPUAlarmHigh",
+ PhysicalResourceId: "MyStack-CPUAlarmHigh-POBWQPDJA81F",
+ ResourceType: "AWS::CloudWatch::Alarm",
+ LastUpdatedTimestamp: t6,
+ ResourceStatus: "CREATE_COMPLETE",
+ },
+ },
+ NextToken: "",
+ RequestId: "2d06e36c-ac1d-11e0-a958-f9382b6eb86b",
+ }
+ c.Assert(resp, DeepEquals, expected)
+}
+
+func (s *S) TestListStacks(c *C) {
+ testServer.Response(200, nil, ListStacksResponse)
+
+ resp, err := s.cf.ListStacks([]string{"CREATE_IN_PROGRESS", "DELETE_COMPLETE"}, "4dad1-32131da-d-31")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "ListStacks")
+ c.Assert(values.Get("StackStatusFilter.member.1"), Equals, "CREATE_IN_PROGRESS")
+ c.Assert(values.Get("StackStatusFilter.member.2"), Equals, "DELETE_COMPLETE")
+ c.Assert(values.Get("NextToken"), Equals, "4dad1-32131da-d-31")
+
+ // Response test
+ c1, _ := time.Parse(time.RFC3339, "2011-05-23T15:47:44Z")
+ c2, _ := time.Parse(time.RFC3339, "2011-03-05T19:57:58Z")
+ d2, _ := time.Parse(time.RFC3339, "2011-03-10T16:20:51Z")
+
+ expected := &cf.ListStacksResponse{
+ StackSummaries: []cf.StackSummary{
+ {
+ StackId: "arn:aws:cloudformation:us-east-1:1234567:stack/TestCreate1/aaaaa",
+ StackName: "vpc1",
+ StackStatus: "CREATE_IN_PROGRESS",
+ CreationTime: c1,
+ TemplateDescription: "Creates one EC2 instance and a load balancer.",
+ },
+ {
+ StackId: "arn:aws:cloudformation:us-east-1:1234567:stack/TestDelete2/bbbbb",
+ StackName: "WP1",
+ StackStatus: "DELETE_COMPLETE",
+ CreationTime: c2,
+ DeletionTime: d2,
+ TemplateDescription: "A simple basic Cloudformation Template.",
+ },
+ },
+ NextToken: "",
+ RequestId: "2d06e36c-ac1d-11e0-a958-f9382b6eb86b",
+ }
+ c.Assert(resp, DeepEquals, expected)
+}
+
+func (s *S) TestSetStackPolicy(c *C) {
+ testServer.Response(200, nil, SetStackPolicyResponse)
+
+ resp, err := s.cf.SetStackPolicy("MyStack", "[Stack Policy Document]", "")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "SetStackPolicy")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("StackPolicyBody"), Equals, "[Stack Policy Document]")
+ c.Assert(values.Get("StackPolicyUrl"), Equals, "")
+ // Response test
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+}
+
+func (s *S) TestUpdateStack(c *C) {
+ testServer.Response(200, nil, UpdateStackResponse)
+
+ stackParams := &cf.UpdateStackParams{
+ Capabilities: []string{"CAPABILITY_IAM"},
+ NotificationARNs: []string{"arn:aws:sns:us-east-1:1234567890:my-topic"},
+ StackPolicyBody: "{PolicyBody}",
+ StackPolicyDuringUpdateBody: "{PolicyDuringUpdateBody}",
+ Parameters: []cf.Parameter{
+ {
+ ParameterKey: "AvailabilityZone",
+ ParameterValue: "us-east-1a",
+ },
+ },
+ UsePreviousTemplate: true,
+ StackName: "MyStack",
+ TemplateBody: "[Template Document]",
+ }
+ resp, err := s.cf.UpdateStack(stackParams)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "UpdateStack")
+ c.Assert(values.Get("StackName"), Equals, "MyStack")
+ c.Assert(values.Get("NotificationARNs.member.1"), Equals, "arn:aws:sns:us-east-1:1234567890:my-topic")
+ c.Assert(values.Get("TemplateBody"), Equals, "[Template Document]")
+ c.Assert(values.Get("Parameters.member.1.ParameterKey"), Equals, "AvailabilityZone")
+ c.Assert(values.Get("Parameters.member.1.ParameterValue"), Equals, "us-east-1a")
+ c.Assert(values.Get("Capabilities.member.1"), Equals, "CAPABILITY_IAM")
+ c.Assert(values.Get("StackPolicyBody"), Equals, "{PolicyBody}")
+ c.Assert(values.Get("StackPolicyDuringUpdateBody"), Equals, "{PolicyDuringUpdateBody}")
+ c.Assert(values.Get("UsePreviousTemplate"), Equals, "true")
+
+ // Response test
+ c.Assert(resp.RequestId, Equals, "4af14eec-350e-11e4-b260-EXAMPLE")
+ c.Assert(resp.StackId, Equals, "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83")
+}
+
+func (s *S) TestValidateTemplate(c *C) {
+ testServer.Response(200, nil, ValidateTemplateResponse)
+
+ resp, err := s.cf.ValidateTemplate("", "http://myTemplateRepository/TemplateOne.template")
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+
+ // Post request test
+ c.Assert(values.Get("Version"), Equals, "2010-05-15")
+ c.Assert(values.Get("Action"), Equals, "ValidateTemplate")
+ c.Assert(values.Get("TemplateURL"), Equals, "http://myTemplateRepository/TemplateOne.template")
+ c.Assert(values.Get("TemplateBody"), Equals, "")
+
+ // Response test
+ expected := &cf.ValidateTemplateResponse{
+ Description: "Test",
+ Capabilities: []string{"CAPABILITY_IAM"},
+ Parameters: []cf.TemplateParameter{
+ {
+ NoEcho: false,
+ ParameterKey: "InstanceType",
+ Description: "Type of instance to launch",
+ DefaultValue: "m1.small",
+ },
+ {
+ NoEcho: false,
+ ParameterKey: "WebServerPort",
+ Description: "The TCP port for the Web Server",
+ DefaultValue: "8888",
+ },
+ {
+ NoEcho: false,
+ ParameterKey: "KeyName",
+ Description: "Name of an existing EC2 KeyPair to enable SSH access into the server",
+ },
+ },
+ RequestId: "0be7b6e8-e4a0-11e0-a5bd-9f8d5a7dbc91",
+ }
+ c.Assert(resp, DeepEquals, expected)
+}