/
ecsinfo.go
113 lines (94 loc) · 2.63 KB
/
ecsinfo.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
105
106
107
108
109
110
111
112
113
package awsecs
import (
"io/ioutil"
"net/http"
"strings"
"github.com/golang/glog"
"github.com/cloudstax/firecamp/containersvc"
"github.com/cloudstax/firecamp/server/awsec2"
)
const ecsMetadataURLSuffix = ":51678/v1/metadata"
type EcsInfo struct {
localContainerInsID string
clusterID string
}
func NewEcsInfo() (*EcsInfo, error) {
md, err := getEcsMetadata()
if err != nil {
return nil, err
}
localContainerInsID, err := parseContainerInstanceID(md)
if err != nil {
return nil, err
}
clusterID, err := parseClusterID(md)
if err != nil {
return nil, err
}
s := &EcsInfo{
localContainerInsID: localContainerInsID,
clusterID: clusterID,
}
return s, nil
}
func (s *EcsInfo) GetLocalContainerInstanceID() string {
return s.localContainerInsID
}
func (s *EcsInfo) GetContainerClusterID() string {
return s.clusterID
}
func getEcsMetadata() (string, error) {
hostname, err := awsec2.GetLocalEc2Hostname()
if err != nil {
glog.Errorln("awsec2 GetLocalEc2Hostname error", err)
return "", err
}
url := "http://" + hostname + ecsMetadataURLSuffix
resp, err := http.Get(url)
if err != nil {
glog.Errorln("get url", url, "error", err)
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
glog.Errorln("read body error", err, "url", url)
return "", err
}
// example body: {"Cluster":"default","ContainerInstanceArn":"arn:aws:ecs:us-west-1:468784140593:container-instance/45c8b03a-8f4a-49cd-aeda-d8d870798721","Version":"Amazon ECS Agent - v1.13.0 (*aebcbca)"}
return string(body), err
}
func parseClusterID(md string) (string, error) {
start := strings.Index(md, "Cluster")
if start == -1 {
glog.Errorln("Bad ECS Metadata", md)
return "", containersvc.ErrInvalidCluster
}
md1 := md[start:]
start = strings.Index(md1, "\":\"")
end := strings.Index(md1, "\",\"")
if start == -1 || end == -1 {
glog.Errorln("Bad ECS Metadata", md)
return "", containersvc.ErrInvalidCluster
}
cluster := md1[start+3 : end]
glog.Infoln("parseCluster", cluster, "md", md)
return cluster, nil
}
func parseContainerInstanceID(md string) (string, error) {
start := strings.Index(md, "ContainerInstanceArn")
if start == -1 {
glog.Errorln("Bad ECS Metadata", md)
return "", containersvc.ErrInvalidContainerInstanceID
}
md1 := md[start:]
start = strings.Index(md1, "\":\"")
end := strings.Index(md1, "\",\"")
if start == -1 || end == -1 {
glog.Errorln("Bad ECS Metadata format", md)
return "", containersvc.ErrInvalidContainerInstanceID
}
contInsID := md1[start+3 : end]
glog.Infoln("parseContainerInstanceID", contInsID, "md", md)
return contInsID, nil
}