Skip to content
This repository has been archived by the owner on Jan 14, 2020. It is now read-only.

Commit

Permalink
[WIP] Fixes for #134, #135, and some more tests (#136)
Browse files Browse the repository at this point in the history
* fixed up delete tests

* added generate test case against a template

* setting all properties to interface{} as a template can no only be validated by cfn itself

* removed fmt
  • Loading branch information
ojkelly authored Nov 19, 2018
1 parent 6119755 commit 47f1d46
Show file tree
Hide file tree
Showing 740 changed files with 40,833 additions and 25,092 deletions.
8 changes: 1 addition & 7 deletions generate/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
#generate

Auto generated cloudformation parsers

##Installation:

```sh
go get github.com/KablamoOSS/kombustion/generate
```
To generate new parsers,run `go generate` from the root directory.
10 changes: 0 additions & 10 deletions generate/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,6 @@ func buildPropertyYaml(obj string, cfnType CfnType) string {
propertyStrings = append(propertyStrings, str)
}
}
for _, property := range sortProperties(cfnType.Properties) {
if str := validatorYaml(obj, property.name, property.CfnProperty); len(str) > 0 {
validatorStrings = append(validatorStrings, str)
}
}

buf := bytes.NewBufferString("")
t := template.Must(template.New("").Parse(propertyTemplate))
Expand All @@ -111,11 +106,6 @@ func buildResourceYaml(obj string, cfnType CfnType) string {
propertyStrings = append(propertyStrings, str)
}
}
for _, property := range sortProperties(cfnType.Properties) {
if str := validatorYaml(obj, property.name, property.CfnProperty); len(str) > 0 {
validatorStrings = append(validatorStrings, str)
}
}

buf := bytes.NewBufferString("")
t := template.Must(template.New("").Parse(resourceTemplate))
Expand Down
3,729 changes: 2,340 additions & 1,389 deletions generate/source/Canada.json

Large diffs are not rendered by default.

5,478 changes: 3,601 additions & 1,877 deletions generate/source/Frankfurt.json

Large diffs are not rendered by default.

1,698 changes: 1,596 additions & 102 deletions generate/source/Ireland.json

Large diffs are not rendered by default.

4,054 changes: 2,655 additions & 1,399 deletions generate/source/London.json

Large diffs are not rendered by default.

3,361 changes: 2,156 additions & 1,205 deletions generate/source/Mumbai.json

Large diffs are not rendered by default.

3,657 changes: 2,304 additions & 1,353 deletions generate/source/North California.json

Large diffs are not rendered by default.

5,868 changes: 3,667 additions & 2,201 deletions generate/source/North Virginia.json

Large diffs are not rendered by default.

4,985 changes: 3,264 additions & 1,721 deletions generate/source/Ohio.json

Large diffs are not rendered by default.

1,698 changes: 1,596 additions & 102 deletions generate/source/Oregon.json

Large diffs are not rendered by default.

3,319 changes: 2,032 additions & 1,287 deletions generate/source/Sao Paulo.json

Large diffs are not rendered by default.

4,407 changes: 2,687 additions & 1,720 deletions generate/source/Seoul.json

Large diffs are not rendered by default.

1,796 changes: 1,678 additions & 118 deletions generate/source/Singapore.json

Large diffs are not rendered by default.

5,191 changes: 3,374 additions & 1,817 deletions generate/source/Sydney.json

Large diffs are not rendered by default.

6,035 changes: 3,777 additions & 2,258 deletions generate/source/Tokyo.json

Large diffs are not rendered by default.

31 changes: 0 additions & 31 deletions generate/templates.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 21 additions & 23 deletions generate/util.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package main

import (
"bytes"
"fmt"
"io/ioutil"
"log"
"sort"
"strings"
"text/template"
)

func checkError(err error) {
Expand All @@ -21,30 +19,30 @@ func valueStringYaml(propPackage, obj, name string, property CfnProperty) string
if property.Required {
omitempty = ""
}
if len(property.PrimitiveType) > 0 {
return name + " interface{} `yaml:" + `"` + name + omitempty + `"` + "`"
} else if len(property.Type) > 0 && property.Type != "List" && property.Type != "Map" {
subPropertyName := propertyNameFromResourceType(obj, property.Type)
return name + " *" + propPackage + subPropertyName + " `yaml:" + `"` + name + omitempty + `"` + "`"
}
// if len(property.PrimitiveType) > 0 {
// return name + " interface{} `yaml:" + `"` + name + omitempty + `"` + "`"
// } else if len(property.Type) > 0 && property.Type != "List" && property.Type != "Map" {
// subPropertyName := propertyNameFromResourceType(obj, property.Type)
// return name + " *" + propPackage + subPropertyName + " `yaml:" + `"` + name + omitempty + `"` + "`"
// }
return name + " interface{} `yaml:" + `"` + name + omitempty + `"` + "`"
}

func validatorYaml(obj, name string, property CfnProperty) string {
if !property.Required {
return ""
}

buf := bytes.NewBufferString("")
t := template.Must(template.New("").Parse(validatorTemplate))
err := t.Execute(buf, map[string]interface{}{
"Name": name,
"PrimitiveType": len(property.PrimitiveType) > 0,
"ListMapType": len(property.Type) > 0 && property.Type != "List" && property.Type != "Map",
})
checkError(err)
return buf.String()
}
// func validatorYaml(obj, name string, property CfnProperty) string {
// if !property.Required {
// return ""
// }

// buf := bytes.NewBufferString("")
// t := template.Must(template.New("").Parse(validatorTemplate))
// err := t.Execute(buf, map[string]interface{}{
// "Name": name,
// "PrimitiveType": len(property.PrimitiveType) > 0,
// "ListMapType": len(property.Type) > 0 && property.Type != "List" && property.Type != "Map",
// })
// checkError(err)
// return buf.String()
// }

func sortSpecList(specList map[string]string) []string {
regions := make([]string, len(specList))
Expand Down
17 changes: 9 additions & 8 deletions internal/cloudformation/tasks/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package tasks

import (
"fmt"
printer "github.com/KablamoOSS/go-cli-printer"
"os"
"time"

"github.com/KablamoOSS/kombustion/internal/cloudformation"
"github.com/aws/aws-sdk-go/aws"
awsCF "github.com/aws/aws-sdk-go/service/cloudformation"

printer "github.com/KablamoOSS/go-cli-printer"
"github.com/KablamoOSS/kombustion/internal/cloudformation"
)

// DeleteStack removes a cloudformation stack
Expand All @@ -31,15 +32,15 @@ func DeleteStack(client cloudformation.StackDeleter, stackName, region string) {
status, err := client.DescribeStacks(&awsCF.DescribeStacksInput{StackName: aws.String(stackName)})
checkErrorDeletePoll(err)

events, err := client.DescribeStackEvents(
&awsCF.DescribeStackEventsInput{StackName: aws.String(stackName)},
)
checkError(err)

if len(status.Stacks) > 0 {
events, err := client.DescribeStackEvents(
&awsCF.DescribeStackEventsInput{StackName: aws.String(stackName)},
)
checkErrorDeletePoll(err)

stackStatus := *status.Stacks[0].StackStatus

if len(events.StackEvents) > 0 {
if events != nil && len(events.StackEvents) > 0 {
PrintStackEvent(events.StackEvents[0], false)
}
if stackStatus == awsCF.StackStatusDeleteInProgress {
Expand Down
3 changes: 2 additions & 1 deletion internal/cloudformation/tasks/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ func checkError(err error) {
"",
)
} else {
fmt.Println(err)
// TODO: Make this error more helpful
printer.Fatal(err, "", "")
printer.Fatal(err, "An unknown error occured, please subbmit an issue", "https://github.com/KablamoOSS/kombustion/issues/new?template=bug_report.md")
}
}
}
Expand Down
14 changes: 14 additions & 0 deletions internal/coretest/object_store.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package coretest

import (
"io/ioutil"
"strings"
)

Expand All @@ -17,6 +18,7 @@ func NewMockObjectStore() *MockObjectStore {
}
}

// Get an object
func (objstore *MockObjectStore) Get(path string, subpath ...string) ([]byte, error) {
fullPath := strings.Join(append([]string{path}, subpath...), "/")
data, ok := objstore.Objects[fullPath]
Expand All @@ -26,8 +28,20 @@ func (objstore *MockObjectStore) Get(path string, subpath ...string) ([]byte, er
return data, nil
}

// Put a string into the objectStore
func (objstore *MockObjectStore) Put(data []byte, path string, subpath ...string) error {
fullPath := strings.Join(append([]string{path}, subpath...), "/")
objstore.Objects[fullPath] = data
return nil
}

// PutFile into the objectStore by reading `localPath` from disk
func (objstore *MockObjectStore) PutFile(localPath string, path string, subpath ...string) error {
data, err := ioutil.ReadFile(localPath)
if err != nil {
return err
}
fullPath := strings.Join(append([]string{path}, subpath...), "/")
objstore.Objects[fullPath] = data
return nil
}
34 changes: 34 additions & 0 deletions internal/tasks/common_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package tasks

var sampleKombYaml = `---
Name: Kombustion
Region: ""
Environments:
ci:
Parameters:
BucketName: fooBucket
GenerateDefaultOutputs: false
Tags: {}
`

var sampleKombLock = `plugins: {}`

var sampleYaml = `AWSTemplateFormatVersion: 2010-09-09
Description: S3 test bucket
Parameters:
BucketName:
Type: "String"
Default: "testBucket"
Description: "S3 bucket name"
Mappings: {}
Resources:
testBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref: BucketName
AccessControl: PublicRead
Tags:
- Key: Name
Value: 123
`
44 changes: 25 additions & 19 deletions internal/tasks/delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import (
"fmt"
"testing"

printer "github.com/KablamoOSS/go-cli-printer"
"github.com/KablamoOSS/kombustion/internal/coretest"
"github.com/aws/aws-sdk-go/aws"
awsCF "github.com/aws/aws-sdk-go/service/cloudformation"
"github.com/stretchr/testify/assert"

printer "github.com/KablamoOSS/go-cli-printer"
"github.com/KablamoOSS/kombustion/internal/coretest"
)

type MockStackDeleter struct {
Expand All @@ -30,22 +31,30 @@ func (msd *MockStackDeleter) Open(_, _ string) string {
func (msd *MockStackDeleter) DeleteStack(input *awsCF.DeleteStackInput) (*awsCF.DeleteStackOutput, error) {
stack, ok := msd.Stacks[*input.StackName]
if !ok {
return nil, fmt.Errorf("stack not found: %s", *input.StackName)
return nil, fmt.Errorf("Stack with id %s does not exist", *input.StackName)
}
stack.StackStatus = aws.String("DELETE_IN_PROGRESS")
return &awsCF.DeleteStackOutput{}, nil
}

func (msd *MockStackDeleter) DescribeStackEvents(input *awsCF.DescribeStackEventsInput) (*awsCF.DescribeStackEventsOutput, error) {
events, ok := msd.Events[*input.StackName]
fmt.Println(ok, events, *input.StackName, msd.Events)
if !ok {
return nil, fmt.Errorf("stack %s not found", *input.StackName)
return nil, fmt.Errorf("Stack with id %s does not exist", *input.StackName)

}

out := &awsCF.DescribeStackEventsOutput{
StackEvents: events,
}

stack, ok := msd.Stacks[*input.StackName]
if ok {
if *stack.StackStatus == "DELETE_IN_PROGRESS" {
delete(msd.Stacks, *input.StackName)
delete(msd.Events, *input.StackName)
}
}
return out, nil
}

Expand All @@ -62,21 +71,18 @@ func (msd *MockStackDeleter) DescribeStackEventsPages(input *awsCF.DescribeStack
func (msd *MockStackDeleter) DescribeStacks(input *awsCF.DescribeStacksInput) (*awsCF.DescribeStacksOutput, error) {
stack, ok := msd.Stacks[*input.StackName]
if !ok {
return nil, fmt.Errorf("stack not found: %s", *input.StackName)
return nil, fmt.Errorf("Stack with id %s does not exist", *input.StackName)
}
output := &awsCF.DescribeStacksOutput{
Stacks: []*awsCF.Stack{stack},
}
if *stack.StackStatus == "DELETE_IN_PROGRESS" {
delete(msd.Stacks, *input.StackName)
delete(msd.Events, *input.StackName)
}
return output, nil
}

func TestDeleteTask(t *testing.T) {
printer.Test()

stackName := "TestDeleteTaskStack"
objectStore := coretest.NewMockObjectStore()
objectStore.Put([]byte(sampleKombYaml), "kombustion.yaml")
objectStore.Put([]byte(sampleKombLock), "kombustion.lock")
Expand All @@ -85,29 +91,29 @@ func TestDeleteTask(t *testing.T) {
stacks := make(map[string]*awsCF.Stack)
events := make(map[string][]*awsCF.StackEvent)

stacks["foo-stack"] = &awsCF.Stack{
StackId: aws.String("foo-stack"),
StackName: aws.String("foo-stack"),
stacks[stackName] = &awsCF.Stack{
StackId: aws.String(stackName),
StackName: aws.String(stackName),
StackStatus: aws.String("CREATE_COMPLETE"),
}
events["foo-stack"] = []*awsCF.StackEvent{}
events[stackName] = []*awsCF.StackEvent{}

deleter := &MockStackDeleter{
Stacks: stacks,
Events: events,
}

fmt.Println(deleter.Events)
assert.NotPanics(
t,
func() {
taskDelete(
deleter,
objectStore,
"test.yaml", // templatePath
"foo-stack", // stackName
"ci", // envName
"profile", // profile
stackName, // stackName
"region", // region
"ci", // envName
"kombustion.yaml", // manifest location
)
},
Expand All @@ -131,10 +137,10 @@ func TestDeleteTaskStackNotFound(t *testing.T) {
deleter,
objectStore,
"test.yaml", // templatePath
"event-stack", // stackName
"ci", // envName
"profile", // profile
"event-stack", // stackName
"region", // region
"ci", // envName
"kombustion.yaml", // manifest location
)
},
Expand Down
Loading

0 comments on commit 47f1d46

Please sign in to comment.