Skip to content

Commit 1078cf6

Browse files
committed
Add changes for handlers and Interface for TMDS Tasks.
1 parent 44f8eb6 commit 1078cf6

File tree

6 files changed

+439
-2
lines changed

6 files changed

+439
-2
lines changed

amazon-vpc-cni-plugins

ecs-agent/tmds/handlers/utils/helpers.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,18 @@ const (
3434
// RequestTypeTaskMetadata specifies the task metadata request type of TaskContainerMetadataHandler.
3535
RequestTypeTaskMetadata = "task metadata"
3636

37+
// RequestTypeTasksMetadata specifies the tasks metadata request type of TaskContainerMetadataHandler.
38+
RequestTypeTasksMetadata = "tasks metadata"
39+
3740
// RequestTypeContainerMetadata specifies the container metadata request type of TaskContainerMetadataHandler.
3841
RequestTypeContainerMetadata = "container metadata"
3942

4043
// RequestTypeTaskStats specifies the task stats request type of StatsHandler.
4144
RequestTypeTaskStats = "task stats"
4245

46+
// RequestTypeTasksStats specifies the tasks stats request type of StatsHandler.
47+
RequestTypeTasksStats = "tasks stats"
48+
4349
// RequestTypeContainerStats specifies the container stats request type of StatsHandler.
4450
RequestTypeContainerStats = "container stats"
4551

ecs-agent/tmds/handlers/v4/handlers.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ func TaskMetadataPath() string {
4646
utils.ConstructMuxVar(EndpointContainerIDMuxName, utils.AnythingButSlashRegEx))
4747
}
4848

49+
// Returns the standard URI path for tasks metadata endpoint.
50+
func TasksMetadataPath() string {
51+
return fmt.Sprintf(
52+
"/v4/%s/tasks",
53+
utils.ConstructMuxVar(EndpointContainerIDMuxName, utils.AnythingButSlashRegEx))
54+
}
55+
4956
// Returns the standard URI path for task metadata with tags endpoint.
5057
func TaskMetadataWithTagsPath() string {
5158
return fmt.Sprintf(
@@ -65,6 +72,12 @@ func TaskStatsPath() string {
6572
utils.ConstructMuxVar(EndpointContainerIDMuxName, utils.AnythingButSlashRegEx))
6673
}
6774

75+
// Returns a standard URI path for v4 tasks stats endpoint.
76+
func TasksStatsPath() string {
77+
return fmt.Sprintf("/v4/%s/tasks/stats",
78+
utils.ConstructMuxVar(EndpointContainerIDMuxName, utils.AnythingButSlashRegEx))
79+
}
80+
6881
// ContainerMetadataHandler returns the HTTP handler function for handling container metadata requests.
6982
func ContainerMetadataHandler(
7083
agentState state.AgentState,
@@ -123,6 +136,14 @@ func TaskMetadataHandler(
123136
return taskMetadataHandler(agentState, metricsFactory, false)
124137
}
125138

139+
// TasksMetadataHandler returns the HTTP handler function for handling tasks metadata requests.
140+
func TasksMetadataHandler(
141+
agentState state.AgentState,
142+
metricsFactory metrics.EntryFactory,
143+
) func(http.ResponseWriter, *http.Request) {
144+
return tasksMetadataHandler(agentState, metricsFactory, false)
145+
}
146+
126147
// TaskMetadataHandler returns the HTTP handler function for handling task metadata with tags requests.
127148
func TaskMetadataWithTagsHandler(
128149
agentState state.AgentState,
@@ -131,6 +152,14 @@ func TaskMetadataWithTagsHandler(
131152
return taskMetadataHandler(agentState, metricsFactory, true)
132153
}
133154

155+
// TasksMetadataHandler returns the HTTP handler function for handling tasks metadata with tags requests.
156+
func TasksMetadataWithTagsHandler(
157+
agentState state.AgentState,
158+
metricsFactory metrics.EntryFactory,
159+
) func(http.ResponseWriter, *http.Request) {
160+
return tasksMetadataHandler(agentState, metricsFactory, true)
161+
}
162+
134163
func taskMetadataHandler(
135164
agentState state.AgentState,
136165
metricsFactory metrics.EntryFactory,
@@ -169,6 +198,39 @@ func taskMetadataHandler(
169198
}
170199
}
171200

201+
func tasksMetadataHandler(
202+
agentState state.AgentState,
203+
metricsFactory metrics.EntryFactory,
204+
includeTags bool,
205+
) func(http.ResponseWriter, *http.Request) {
206+
return func(w http.ResponseWriter, r *http.Request) {
207+
var tasksMetadata []state.TaskResponse
208+
var err error
209+
210+
if includeTags {
211+
tasksMetadata, err = agentState.GetTasksMetadataWithTags()
212+
} else {
213+
tasksMetadata, err = agentState.GetTasksMetadata()
214+
}
215+
216+
if err != nil {
217+
logger.Error("Failed to get v4 tasks metadata", logger.Fields{
218+
field.Error: err,
219+
})
220+
221+
utils.WriteJSONResponse(w, http.StatusInternalServerError,
222+
"failed to get tasks metadata", utils.RequestTypeTasksMetadata)
223+
metricsFactory.New(metrics.InternalServerErrorMetricName).Done(err)
224+
return
225+
}
226+
227+
logger.Info("Writing response for v4 tasks metadata", logger.Fields{
228+
"task_count": len(tasksMetadata),
229+
})
230+
utils.WriteJSONResponse(w, http.StatusOK, tasksMetadata, utils.RequestTypeTasksMetadata)
231+
}
232+
}
233+
172234
// Returns an appropriate HTTP response status code and body for the task metadata error.
173235
func getTaskErrorResponse(endpointContainerID string, err error) (int, string) {
174236
var errContainerLookupFailed *state.ErrorLookupFailure
@@ -206,6 +268,37 @@ func TaskStatsHandler(
206268
utils.RequestTypeTaskStats, taskStatsErrorPrefix)
207269
}
208270

271+
// Returns an HTTP handler for v4 tasks stats endpoint
272+
func TasksStatsHandler(
273+
agentState state.AgentState,
274+
metricsFactory metrics.EntryFactory,
275+
) func(http.ResponseWriter, *http.Request) {
276+
return func(w http.ResponseWriter, r *http.Request) {
277+
// Get stats for all tasks
278+
stats, err := agentState.GetTasksStats("")
279+
if err != nil {
280+
logger.Error("Failed to get v4 tasks stats", logger.Fields{
281+
field.Error: err,
282+
})
283+
284+
responseCode, responseBody := getStatsErrorResponse("", err, "V4 tasks stats handler")
285+
utils.WriteJSONResponse(w, responseCode, responseBody, utils.RequestTypeTasksStats)
286+
287+
if utils.Is5XXStatus(responseCode) {
288+
metricsFactory.New(metrics.InternalServerErrorMetricName).Done(err)
289+
}
290+
291+
return
292+
}
293+
294+
// Write stats response
295+
logger.Info("Writing response for v4 tasks stats", logger.Fields{
296+
"task_count": len(stats),
297+
})
298+
utils.WriteJSONResponse(w, http.StatusOK, stats, utils.RequestTypeTasksStats)
299+
}
300+
}
301+
209302
// Generic function that returns an HTTP handler for container or task stats endpoint
210303
// depending on the parameters.
211304
func statsHandler[R state.StatsResponse | map[string]*state.StatsResponse](

0 commit comments

Comments
 (0)