-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplugin.go
104 lines (82 loc) · 3.19 KB
/
plugin.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
package main
import (
"encoding/json"
"log"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awsutil"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/cloudformation"
"github.com/aws/aws-sdk-go/service/ecs"
)
type Settings struct {
Mode string `json:"mode"`
Region string `json:"region"`
Parallel bool `json:"parallel"`
Batch []Batch `json:"batch"`
}
type Batch struct {
StackName string `json:"stackname"`
ServiceLogicalName string `json:"servicelogicalname"`
ClusterStackName string `json:"clusterstackname"`
Template string `json:"template"`
Params []Params `json:"params"`
}
type Params struct {
Key string `json:"key"`
Value string `json:"value"`
}
var sess = session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
var cfSvc = cloudformation.New(sess, &aws.Config{
Region: aws.String("eu-west-1"),
})
var ecsSvc = ecs.New(sess, &aws.Config{
Region: aws.String("eu-west-1"),
})
func run() {
batch := parseBatch()
log.Println(batch[0].Params[0].Key)
log.Println(batch[0].Params[0].Value)
action := getAction("stackname", "logicalservice", "clusterstackname")
log.Println(action)
}
func parseBatch() []Batch {
data := `[{"params":[{"key":"environment","value":"staging"}],"stackname":"my-database-stack","template":"templates/db.yml"},{"params":[{"key":"version","value":"123"},{"key":"environment","value":"staging"}],"stackname":"my-app-stack","template":"templates/app.yml"}]`
// pair := os.Getenv("PLUGIN_BATCH")
var message = []byte(data)
var batch []Batch
err := json.Unmarshal(message, &batch)
if err != nil {
log.Println("Error unmarshal", err)
}
return batch
}
func stackExists(stackName string) bool {
stacksInput := &cloudformation.DescribeStacksInput{StackName: aws.String(stackName)}
result, _ := cfSvc.DescribeStacks(stacksInput)
if len(result.Stacks) == 1 {
return true
}
return false
// fmt.Println(awsutil.StringValue(result.Stacks[0].StackStatus))
}
func getAction(stackName string, serviceLogicalName string, clusterStackName string) string {
if stackExists(stackName) {
getTaskDesiredCount(stackName, serviceLogicalName, clusterStackName)
return "update"
}
return "create"
}
func getTaskDesiredCount(stackName string, serviceLogicalName string, clusterStackName string) string {
stackResourceInput := &cloudformation.DescribeStackResourceInput{StackName: aws.String(clusterStackName), LogicalResourceId: aws.String("ECSCluster")}
stackResource, _ := cfSvc.DescribeStackResource(stackResourceInput)
ecsCluster := stackResource.StackResourceDetail.PhysicalResourceId
stackResourceInput = &cloudformation.DescribeStackResourceInput{StackName: aws.String(stackName), LogicalResourceId: aws.String(serviceLogicalName)}
stackResource, _ = cfSvc.DescribeStackResource(stackResourceInput)
var ecsService []*string
ecsService = append(ecsService, stackResource.StackResourceDetail.PhysicalResourceId)
describeServicesInput := &ecs.DescribeServicesInput{Services: ecsService, Cluster: ecsCluster}
services, _ := ecsSvc.DescribeServices(describeServicesInput)
return awsutil.StringValue(services.Services[0].RunningCount)
}