Skip to content

Commit

Permalink
Merge pull request #26 from convox/sts-tokens-for-install
Browse files Browse the repository at this point in the history
read aws credentials from STDIN
  • Loading branch information
ddollar committed Sep 30, 2015
2 parents 0b9eec8 + 9007434 commit 371856c
Show file tree
Hide file tree
Showing 7 changed files with 453 additions and 325 deletions.
5 changes: 3 additions & 2 deletions api/controllers/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ import (
"testing"

"github.com/convox/rack/api/controllers"
"github.com/convox/rack/test"
"github.com/stretchr/testify/assert"
)

// Note: these tests don't use the api helpers to ensure a naked
// client can connect

func TestNoPassword(t *testing.T) {
aws := stubAws(DescribeConvoxStackCycle("convox-test"))
aws := stubAws(test.DescribeConvoxStackCycle("convox-test"))
defer aws.Close()
defer os.Setenv("RACK", os.Getenv("RACK"))

Expand All @@ -25,7 +26,7 @@ func TestNoPassword(t *testing.T) {

func TestBasicAuth(t *testing.T) {
assert := assert.New(t)
aws := stubAws(DescribeConvoxStackCycle("convox-test"))
aws := stubAws(test.DescribeConvoxStackCycle("convox-test"))
defer aws.Close()
defer os.Setenv("PASSWORD", os.Getenv("PASSWORD"))
defer os.Setenv("RACK", os.Getenv("RACK"))
Expand Down
273 changes: 0 additions & 273 deletions api/controllers/apps_helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,276 +26,3 @@ func stubAws(cycles ...awsutil.Cycle) (s *httptest.Server) {
defaults.DefaultConfig.Endpoint = &s.URL
return s
}

func CreateAppStackCycle(appName string) awsutil.Cycle {
return awsutil.Cycle{
awsutil.Request{"/", "", createAppUrlBody()},
awsutil.Response{200, ""},
}
}

func CreateAppStackExistsCycle(appName string) awsutil.Cycle {
return awsutil.Cycle{
awsutil.Request{"/", "", createAppUrlBody()},
awsutil.Response{
400,
`<ErrorResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
<Error>
<Type>Sender</Type>
<Code>AlreadyExistsException</Code>
<Message>Stack with id ` + appName + ` already exists</Message>
</Error>
<RequestId>bc91dc86-5803-11e5-a24f-85fde26a90fa</RequestId>
</ErrorResponse>`,
},
}
}

// returns the stack you asked for
func DescribeAppStackCycle(stackName string) awsutil.Cycle {
return awsutil.Cycle{
awsutil.Request{"/", "", `Action=DescribeStacks&StackName=` + stackName + `&Version=2010-05-15`},
awsutil.Response{200,
` <DescribeStacksResult><Stacks>` + appStackXML(stackName) + `</Stacks></DescribeStacksResult>`},
}
}

// no filter - returns convox stack and an app
func DescribeStackCycleWithoutQuery(appName string) awsutil.Cycle {
xml := appStackXML(appName) + convoxStackXML("convox")

return awsutil.Cycle{
awsutil.Request{"/", "", `Action=DescribeStacks&Version=2010-05-15`},
awsutil.Response{200, ` <DescribeStacksResult><Stacks>` + xml + `</Stacks></DescribeStacksResult>`},
}
}

// returns convox stack
func DescribeConvoxStackCycle(stackName string) awsutil.Cycle {
return awsutil.Cycle{
awsutil.Request{"/", "", `Action=DescribeStacks&StackName=` + stackName + `&Version=2010-05-15`},
awsutil.Response{200,
` <DescribeStacksResult><Stacks>` + convoxStackXML(stackName) + `</Stacks></DescribeStacksResult>`},
}
}

func DeleteStackCycle(stackName string) awsutil.Cycle {
return awsutil.Cycle{
awsutil.Request{"/", "", `Action=DeleteStack&StackName=` + stackName + `&Version=2010-05-15`},
awsutil.Response{200, ""},
}
}

// search for stack, return missing
func DescribeStackNotFound(stackName string) awsutil.Cycle {
return awsutil.Cycle{
awsutil.Request{"/", "", `Action=DescribeStacks&StackName=` + stackName + `&Version=2010-05-15`},
awsutil.Response{
400,
`<ErrorResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
<Error>
<Type>Sender</Type>
<Code>ValidationError</Code>
<Message>Stack with id ` + stackName + ` does not exist</Message>
</Error>
<RequestId>bc91dc86-5803-11e5-a24f-85fde26a90fa</RequestId>
</ErrorResponse>`,
},
}
}

func convoxStackXML(stackName string) string {
return `
<member>
<Tags/>
<StackId>arn:aws:cloudformation:us-east-1:938166070011:stack/` + stackName + `/9a10bbe0-51d5-11e5-b85a-5001dc3ed8d2</StackId>
<StackStatus>CREATE_COMPLETE</StackStatus>
<StackName>` + stackName + `</StackName>
<NotificationARNs/>
<CreationTime>2015-09-03T00:49:16.068Z</CreationTime>
<Parameters>
<member>
<ParameterValue>3</ParameterValue>
<ParameterKey>InstanceCount</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>RegistryHost</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>Key</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>Ami</ParameterKey>
</member>
<member>
<ParameterValue>LmAlykMYpjFVKopVgibGfxjVnNCZVi</ParameterValue>
<ParameterKey>Password</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>RegistryPort</ParameterKey>
</member>
<member>
<ParameterValue>No</ParameterValue>
<ParameterKey>Development</ParameterKey>
</member>
<member>
<ParameterValue>latest</ParameterValue>
<ParameterKey>Version</ParameterKey>
</member>
<member>
<ParameterValue>test@convox.com</ParameterValue>
<ParameterKey>ClientId</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>Certificate</ParameterKey>
</member>
<member>
<ParameterValue>default</ParameterValue>
<ParameterKey>Tenancy</ParameterKey>
</member>
<member>
<ParameterValue>t2.small</ParameterValue>
<ParameterKey>InstanceType</ParameterKey>
</member>
</Parameters>
<Capabilities>
<member>CAPABILITY_IAM</member>
</Capabilities>
<DisableRollback>false</DisableRollback>
<Outputs>
<member>
<OutputValue>convox-1842138601.us-east-1.elb.amazonaws.com</OutputValue>
<OutputKey>Dashboard</OutputKey>
</member>
<member>
<OutputValue>convox-Kinesis-1BGCFIB6PK55Y</OutputValue>
<OutputKey>Kinesis</OutputKey>
</member>
</Outputs>
</member>
`

}

func appStackXML(appName string) string {

return `
<member>
<Tags>
<member>
<Value>app</Value>
<Key>Type</Key>
</member>
<member>
<Value>convox</Value>
<Key>System</Key>
</member>
</Tags>
<StackId>arn:aws:cloudformation:us-east-1:938166070011:stack/` + appName + `/9a10bbe0-51d5-11e5-b85a-5001dc3ed8d2</StackId>
<StackStatus>CREATE_COMPLETE</StackStatus>
<StackName>` + appName + `</StackName>
<NotificationARNs/>
<CreationTime>2015-09-03T00:49:16.068Z</CreationTime>
<Parameters>
<member>
<ParameterValue>https://apache-app2-settings-1vudpykaywx8o.s3.amazonaws.com/releases/RCSUVJNDLDK/env</ParameterValue>
<ParameterKey>Environment</ParameterKey>
</member>
<member>
<ParameterValue>arn:aws:kms:us-east-1:938166070011:key/e4c9e19c-7410-4e0f-88bf-ac7ac085625d</ParameterValue>
<ParameterKey>Key</ParameterKey>
</member>
<member>
<ParameterValue>256</ParameterValue>
<ParameterKey>MainMemory</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>Repository</ParameterKey>
</member>
<member>
<ParameterValue>vpc-e853928c</ParameterValue>
<ParameterKey>VPC</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>MainService</ParameterKey>
</member>
<member>
<ParameterValue>convo-Clust-GEFJGLHH7O0V</ParameterValue>
<ParameterKey>Cluster</ParameterKey>
</member>
<member>
<ParameterValue>RCSUVJNDLDK</ParameterValue>
<ParameterKey>Release</ParameterKey>
</member>
<member>
<ParameterValue>80</ParameterValue>
<ParameterKey>MainPort80Balancer</ParameterKey>
</member>
<member>
<ParameterValue>200</ParameterValue>
<ParameterKey>Cpu</ParameterKey>
</member>
<member>
<ParameterValue>1</ParameterValue>
<ParameterKey>MainDesiredCount</ParameterKey>
</member>
<member>
<ParameterValue>subnet-2f5e0804,subnet-74a4aa03,subnet-f0c3e3a9</ParameterValue>
<ParameterKey>Subnets</ParameterKey>
</member>
<member>
<ParameterValue/>
<ParameterKey>MainCommand</ParameterKey>
</member>
<member>
<ParameterValue>33787</ParameterValue>
<ParameterKey>MainPort80Host</ParameterKey>
</member>
<member>
<ParameterValue>latest</ParameterValue>
<ParameterKey>Version</ParameterKey>
</member>
<member>
<ParameterValue>convox-720091589.us-east-1.elb.amazonaws.com:5000/apache-app2-main:BDDTZLECEZN</ParameterValue>
<ParameterKey>MainImage</ParameterKey>
</member>
</Parameters>
<Capabilities>
<member>CAPABILITY_IAM</member>
</Capabilities>
<DisableRollback>false</DisableRollback>
<Outputs>
<member>
<OutputValue>apache-app-2311461.test.elb.amazonaws.com</OutputValue>
<OutputKey>BalancerHost</OutputKey>
</member>
<member>
<OutputValue>apache-app-Kinesis-6OTFWDVFK9BB</OutputValue>
<OutputKey>Kinesis</OutputKey>
</member>
<member>
<OutputValue>80</OutputValue>
<OutputKey>MainPort80Balancer</OutputKey>
</member>
<member>
<OutputValue>apache-app-settings-2gkjc9lf123nm</OutputValue>
<OutputKey>Settings</OutputKey>
</member>
</Outputs>
</member>`

}

// NOTE: app stack paramter serialization does not guarantee order,
// so even the same source object is not guaranteed to serialize
// correctly for comparison.
func createAppUrlBody() string {
return `/^Action=CreateStack/`
}
21 changes: 11 additions & 10 deletions api/controllers/apps_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import (
"net/url"
"testing"

"github.com/convox/rack/test"
"github.com/stretchr/testify/assert"
)

func TestAppList(t *testing.T) {
aws := stubAws(DescribeStackCycleWithoutQuery("bar"))
aws := stubAws(test.DescribeStackCycleWithoutQuery("bar"))
defer aws.Close()

body := HTTPBody("GET", "http://convox/apps", nil)
Expand All @@ -24,7 +25,7 @@ func TestAppList(t *testing.T) {
}

func TestAppShow(t *testing.T) {
aws := stubAws(DescribeAppStackCycle("bar"))
aws := stubAws(test.DescribeAppStackCycle("bar"))
defer aws.Close()

body := HTTPBody("GET", "http://convox/apps/bar", nil)
Expand All @@ -39,16 +40,16 @@ func TestAppShow(t *testing.T) {
}

func TestAppShowWithAppNotFound(t *testing.T) {
aws := stubAws(DescribeStackNotFound("bar"))
aws := stubAws(test.DescribeStackNotFound("bar"))
defer aws.Close()

AssertStatus(t, 404, "GET", "http://convox/apps/bar", nil)
}

func TestAppCreate(t *testing.T) {
aws := stubAws(
CreateAppStackCycle("application"),
DescribeAppStackCycle("application"),
test.CreateAppStackCycle("application"),
test.DescribeAppStackCycle("application"),
)
defer aws.Close()

Expand All @@ -68,8 +69,8 @@ func TestAppCreate(t *testing.T) {

func TestAppCreateWithAlreadyExists(t *testing.T) {
aws := stubAws(
CreateAppStackExistsCycle("application"),
DescribeAppStackCycle("application"),
test.CreateAppStackExistsCycle("application"),
test.DescribeAppStackCycle("application"),
)
defer aws.Close()

Expand All @@ -83,8 +84,8 @@ bucket name to the ephermeral host, so you get `app-XXX.127.0.0.1`
*/
func TestAppDelete(t *testing.T) {
aws := stubAws(
DescribeAppStackCycle("bar"),
DeleteStackCycle("bar"),
test.DescribeAppStackCycle("bar"),
test.DeleteStackCycle("bar"),
)
defer aws.Close()

Expand All @@ -99,7 +100,7 @@ func TestAppDelete(t *testing.T) {
}

func TestAppDeleteWithAppNotFound(t *testing.T) {
aws := stubAws(DescribeStackNotFound("bar"))
aws := stubAws(test.DescribeStackNotFound("bar"))
defer aws.Close()

AssertStatus(t, 404, "DELETE", "http://convox/apps/bar", nil)
Expand Down
Loading

0 comments on commit 371856c

Please sign in to comment.