Skip to content

Commit 3e9833d

Browse files
committed
Add changes for handlers and Interface for TMDS Tasks.
1 parent ec39785 commit 3e9833d

File tree

10 files changed

+596
-1
lines changed

10 files changed

+596
-1
lines changed

agent/handlers/v4/tmdsstate.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,18 @@ func (s *TMDSAgentState) GetTaskStats(v3EndpointID string) (map[string]*tmdsv4.S
249249
return taskStatsResponse, nil
250250
}
251251

252+
func (s *TMDSAgentState) GetTasksMetadata(endpointContainerID string) ([]tmdsv4.TaskResponse, error) {
253+
return nil, tmdsv4.NewErrorMetadataFetchFailure("tasks metadata endpoint not supported")
254+
}
255+
256+
func (s *TMDSAgentState) GetTasksMetadataWithTags(endpointContainerID string) ([]tmdsv4.TaskResponse, error) {
257+
return nil, tmdsv4.NewErrorMetadataFetchFailure("tasks metadata with tags endpoint not supported")
258+
}
259+
260+
func (s *TMDSAgentState) GetTasksStats(endpointContainerID string) ([]map[string]*tmdsv4.StatsResponse, error) {
261+
return nil, tmdsv4.NewErrorStatsFetchFailure("tasks stats endpoint not supported", nil)
262+
}
263+
252264
// sortContainersCNIPauseFirst sorts containers so that CNI_PAUSE containers appear first.
253265
// Other containers maintain their relative order.
254266
func sortContainersCNIPauseFirst(containers []tmdsv4.ContainerResponse) {

agent/handlers/v4/tmdsstate_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package v4
1818

1919
import (
20+
"errors"
2021
"testing"
2122

2223
apicontainer "github.com/aws/amazon-ecs-agent/agent/api/container"
@@ -179,3 +180,30 @@ func TestGetTaskMetadataWithTags(t *testing.T) {
179180
})
180181
}
181182
}
183+
184+
func TestGetTasksMetadata_NotSupported(t *testing.T) {
185+
state := &TMDSAgentState{}
186+
_, err := state.GetTasksMetadata("test-container-id")
187+
188+
var metadataErr *tmdsv4.ErrorMetadataFetchFailure
189+
assert.True(t, errors.As(err, &metadataErr))
190+
assert.Contains(t, err.Error(), "not supported")
191+
}
192+
193+
func TestGetTasksMetadataWithTags_NotSupported(t *testing.T) {
194+
state := &TMDSAgentState{}
195+
_, err := state.GetTasksMetadataWithTags("test-container-id")
196+
197+
var metadataErr *tmdsv4.ErrorMetadataFetchFailure
198+
assert.True(t, errors.As(err, &metadataErr))
199+
assert.Contains(t, err.Error(), "not supported")
200+
}
201+
202+
func TestGetTasksStats_NotSupported(t *testing.T) {
203+
state := &TMDSAgentState{}
204+
_, err := state.GetTasksStats("test")
205+
206+
var statsErr *tmdsv4.ErrorStatsFetchFailure
207+
assert.True(t, errors.As(err, &statsErr))
208+
assert.Contains(t, err.Error(), "not supported")
209+
}

agent/vendor/github.com/aws/amazon-ecs-agent/ecs-agent/tmds/handlers/utils/helpers.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

agent/vendor/github.com/aws/amazon-ecs-agent/ecs-agent/tmds/handlers/v4/handlers.go

Lines changed: 95 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

agent/vendor/github.com/aws/amazon-ecs-agent/ecs-agent/tmds/handlers/v4/state/state.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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: 95 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,40 @@ 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+
endpointContainerID := mux.Vars(r)[EndpointContainerIDMuxName]
208+
var tasksMetadata []state.TaskResponse
209+
var err error
210+
211+
if includeTags {
212+
tasksMetadata, err = agentState.GetTasksMetadataWithTags(endpointContainerID)
213+
} else {
214+
tasksMetadata, err = agentState.GetTasksMetadata(endpointContainerID)
215+
}
216+
217+
if err != nil {
218+
logger.Error("Failed to get v4 tasks metadata", logger.Fields{
219+
field.Error: err,
220+
})
221+
222+
utils.WriteJSONResponse(w, http.StatusInternalServerError,
223+
"failed to get tasks metadata", utils.RequestTypeTasksMetadata)
224+
metricsFactory.New(metrics.InternalServerErrorMetricName).Done(err)
225+
return
226+
}
227+
228+
logger.Info("Writing response for v4 tasks metadata", logger.Fields{
229+
"task_count": len(tasksMetadata),
230+
})
231+
utils.WriteJSONResponse(w, http.StatusOK, tasksMetadata, utils.RequestTypeTasksMetadata)
232+
}
233+
}
234+
172235
// Returns an appropriate HTTP response status code and body for the task metadata error.
173236
func getTaskErrorResponse(endpointContainerID string, err error) (int, string) {
174237
var errContainerLookupFailed *state.ErrorLookupFailure
@@ -206,6 +269,38 @@ func TaskStatsHandler(
206269
utils.RequestTypeTaskStats, taskStatsErrorPrefix)
207270
}
208271

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

0 commit comments

Comments
 (0)