@@ -20,6 +20,8 @@ import (
20
20
"net/http"
21
21
"os"
22
22
"time"
23
+
24
+ "github.com/cihub/seelog"
23
25
)
24
26
25
27
const (
@@ -76,17 +78,17 @@ func getTasksMetadata(client *http.Client, path string) (*TasksResponse, error)
76
78
return nil , err
77
79
}
78
80
79
- fmt . Printf ("Received tasks metadata: %s \n " , string (body ))
81
+ seelog . Infof ("Received tasks metadata: %s \n " , string (body ))
80
82
81
- var tasksMetadata TasksResponse
82
- err = json .Unmarshal (body , & tasksMetadata )
83
+ err = verifyTasksMetadata (body )
83
84
if err != nil {
84
- return nil , fmt .Errorf ("%s: unable to parse response body : %v" , tasksMetadataRespType , err )
85
+ return nil , fmt .Errorf ("%s: unable to verify response: %v" , tasksMetadataRespType , err )
85
86
}
86
87
87
- err = verifyTasksMetadata (& tasksMetadata )
88
+ var tasksMetadata TasksResponse
89
+ err = json .Unmarshal (body , & tasksMetadata )
88
90
if err != nil {
89
- return nil , fmt .Errorf ("%s: unable to verify response: %v" , tasksMetadataRespType , err )
91
+ return nil , fmt .Errorf ("%s: unable to parse response body : %v" , tasksMetadataRespType , err )
90
92
}
91
93
92
94
return & tasksMetadata , nil
@@ -98,90 +100,103 @@ func getTaskMetadata(client *http.Client, path string) (*TaskResponse, error) {
98
100
return nil , err
99
101
}
100
102
101
- fmt . Printf ("Received task metadata: %s \n " , string (body ))
103
+ seelog . Infof ("Received task metadata: %s \n " , string (body ))
102
104
103
- var taskMetadata TaskResponse
104
- err = json .Unmarshal (body , & taskMetadata )
105
+ err = verifyTaskMetadata (body )
105
106
if err != nil {
106
- return nil , fmt .Errorf ("%s: unable to parse response body : %v" , taskMetadataRespType , err )
107
+ return nil , fmt .Errorf ("%s: unable to verify response: %v" , taskMetadataRespType , err )
107
108
}
108
109
109
- err = verifyTaskMetadata (& taskMetadata )
110
+ var taskMetadata TaskResponse
111
+ err = json .Unmarshal (body , & taskMetadata )
110
112
if err != nil {
111
- return nil , fmt .Errorf ("%s: unable to verify response: %v" , taskMetadataRespType , err )
113
+ return nil , fmt .Errorf ("%s: unable to parse response body : %v" , taskMetadataRespType , err )
112
114
}
113
115
114
116
return & taskMetadata , nil
115
117
}
116
118
117
119
// verifyTasksMetadata verifies the number of tasks in tasks metadata.
118
- func verifyTasksMetadata (tasksMetadata * TasksResponse ) error {
119
- if len (tasksMetadata .Tasks ) != 1 {
120
+ func verifyTasksMetadata (tasksMetadataRawMsg json.RawMessage ) error {
121
+ var tasksMetadataArray []json.RawMessage
122
+ json .Unmarshal (tasksMetadataRawMsg , & tasksMetadataArray )
123
+
124
+ if len (tasksMetadataArray ) != 1 {
120
125
return fmt .Errorf ("incorrect number of tasks, expected 1, received %d" ,
121
- len (tasksMetadata . Tasks ))
126
+ len (tasksMetadataArray ))
122
127
}
123
128
124
- return nil
129
+ return verifyTaskMetadata ( tasksMetadataArray [ 0 ])
125
130
}
126
131
127
132
// verifyTaskMetadata verifies the number of containers in task metadata, make
128
133
// sure each necessary field is not empty, we cannot check the values of those fields
129
134
// since they are dynamic. It also verifies the container metadata.
130
- func verifyTaskMetadata (taskMetadata * TaskResponse ) error {
131
- if len (taskMetadata .Containers ) != 1 {
132
- return fmt .Errorf ("incorrect number of containers, expected 1, received %d" ,
133
- len (taskMetadata .Containers ))
134
- }
135
+ func verifyTaskMetadata (taskMetadataRawMsg json.RawMessage ) error {
136
+ taskMetadataMap := make (map [string ]json.RawMessage )
137
+ json .Unmarshal (taskMetadataRawMsg , & taskMetadataMap )
135
138
136
- if isEmpty ( taskMetadata . Arn ) {
139
+ if taskMetadataMap [ " Arn" ] == nil {
137
140
return notEmptyErrMsg ("Arn" )
138
141
}
139
142
140
- if isEmpty ( taskMetadata . Version ) {
141
- return notEmptyErrMsg ("Version " )
143
+ if taskMetadataMap [ "DesiredStatus" ] == nil {
144
+ return notEmptyErrMsg ("DesiredStatus " )
142
145
}
143
146
144
- if isEmpty ( taskMetadata . KnownStatus ) {
147
+ if taskMetadataMap [ " KnownStatus" ] == nil {
145
148
return notEmptyErrMsg ("KnownStatus" )
146
149
}
147
150
148
- if isEmpty ( taskMetadata . DesiredStatus ) {
149
- return notEmptyErrMsg ("DesiredStatus " )
151
+ if taskMetadataMap [ "Family" ] == nil {
152
+ return notEmptyErrMsg ("Family " )
150
153
}
151
154
152
- if isEmpty (taskMetadata .Family ) {
153
- return notEmptyErrMsg ("Family" )
155
+ if taskMetadataMap ["Version" ] == nil {
156
+ return notEmptyErrMsg ("Version" )
157
+ }
158
+
159
+ if taskMetadataMap ["Containers" ] == nil {
160
+ return notEmptyErrMsg ("Containers" )
161
+ }
162
+
163
+ var containersMetadataArray []json.RawMessage
164
+ json .Unmarshal (taskMetadataMap ["Containers" ], & containersMetadataArray )
165
+ if len (containersMetadataArray ) != 1 {
166
+ return fmt .Errorf ("incorrect number of containers, expected 1, received %d" ,
167
+ len (containersMetadataArray ))
154
168
}
155
169
156
- container := taskMetadata .Containers [0 ]
157
- return verifyContainerMetadata (container )
170
+ return verifyContainerMetadata (containersMetadataArray [0 ])
158
171
}
159
172
160
173
// verifyContainerMetadata verifies the container name of the container metadata,
161
174
// and each necessary field is not empty.
162
- func verifyContainerMetadata (containerMetadata ContainerResponse ) error {
163
- if containerMetadata .Name != containerName {
164
- return fmt .Errorf ("incorrect container name, expected %s, received %s" ,
165
- containerName , containerMetadata .Name )
166
- }
175
+ func verifyContainerMetadata (containerMetadataRawMsg json.RawMessage ) error {
176
+ containerMetadataMap := make (map [string ]json.RawMessage )
177
+ json .Unmarshal (containerMetadataRawMsg , & containerMetadataMap )
167
178
168
- if isEmpty ( containerMetadata . DockerID ) {
169
- return notEmptyErrMsg ("DockerID " )
179
+ if containerMetadataMap [ "Name" ] == nil {
180
+ return notEmptyErrMsg ("Containers " )
170
181
}
171
182
172
- if isEmpty (containerMetadata .DockerName ) {
173
- return notEmptyErrMsg ("DockerName" )
183
+ var actualContainerName string
184
+ json .Unmarshal (containerMetadataMap ["Name" ] ,& actualContainerName )
185
+
186
+ if actualContainerName != containerName {
187
+ return fmt .Errorf ("incorrect container name, expected %s, received %s" ,
188
+ containerName , actualContainerName )
174
189
}
175
190
176
- return nil
177
- }
191
+ if containerMetadataMap ["DockerID" ] == nil {
192
+ return notEmptyErrMsg ("Containers" )
193
+ }
178
194
179
- func isEmpty (field string ) bool {
180
- if field == "" {
181
- return true
195
+ if containerMetadataMap ["DockerName" ] == nil {
196
+ return notEmptyErrMsg ("Containers" )
182
197
}
183
198
184
- return false
199
+ return nil
185
200
}
186
201
187
202
func notEmptyErrMsg (fieldName string ) error {
@@ -196,7 +211,7 @@ func metadataResponse(client *http.Client, endpoint string, respType string) ([]
196
211
if err == nil {
197
212
return resp , nil
198
213
}
199
- fmt . Fprintf (os .Stderr , "Attempt [%d/%d]: unable to get metadata response for '%s' from '%s': %v" ,
214
+ seelog . Infof (os .Stderr , "Attempt [%d/%d]: unable to get metadata response for '%s' from '%s': %v" ,
200
215
i , maxRetries , respType , endpoint , err )
201
216
time .Sleep (durationBetweenRetries )
202
217
}
0 commit comments