Skip to content

Commit

Permalink
handlers: add eni info to introspection endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
adnxn committed Mar 1, 2018
1 parent 1b9439d commit a490ba1
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 2 deletions.
8 changes: 8 additions & 0 deletions agent/api/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,14 @@ func (c *Container) GetLabels() map[string]string {
return c.labels
}

// GetPorts gets the ports for a container
func (c *Container) GetPorts() []PortBinding {
c.lock.RLock()
defer c.lock.RUnlock()

return c.Ports
}

// HealthStatusShouldBeReported returns true if the health check is defined in
// the task definition
func (c *Container) HealthStatusShouldBeReported() bool {
Expand Down
7 changes: 7 additions & 0 deletions agent/handlers/types/v1/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@

package v1

import (
"github.com/aws/amazon-ecs-agent/agent/containermetadata"
"github.com/aws/amazon-ecs-agent/agent/handlers/types/v2"
)

// MetadataResponse is the schema for the metadata response JSON object
type MetadataResponse struct {
Cluster string
Expand Down Expand Up @@ -40,4 +45,6 @@ type ContainerResponse struct {
DockerId string
DockerName string
Name string
Ports []v2.PortResponse
Networks []containermetadata.Network
}
42 changes: 40 additions & 2 deletions agent/handlers/v1_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@ import (

"github.com/aws/amazon-ecs-agent/agent/api"
"github.com/aws/amazon-ecs-agent/agent/config"
"github.com/aws/amazon-ecs-agent/agent/containermetadata"
"github.com/aws/amazon-ecs-agent/agent/engine"
"github.com/aws/amazon-ecs-agent/agent/engine/dockerstate"
"github.com/aws/amazon-ecs-agent/agent/handlers/types/v1"
"github.com/aws/amazon-ecs-agent/agent/handlers/types/v2"
"github.com/aws/amazon-ecs-agent/agent/logger"
"github.com/aws/amazon-ecs-agent/agent/utils"
"github.com/aws/amazon-ecs-agent/agent/version"
Expand Down Expand Up @@ -66,11 +68,12 @@ func metadataV1RequestHandlerMaker(containerInstanceArn *string, cfg *config.Con

func newTaskResponse(task *api.Task, containerMap map[string]*api.DockerContainer) *v1.TaskResponse {
containers := []v1.ContainerResponse{}
for containerName, container := range containerMap {
for _, container := range containerMap {
if container.Container.IsInternal() {
continue
}
containers = append(containers, v1.ContainerResponse{DockerId: container.DockerID, DockerName: container.DockerName, Name: containerName})
containerResponse := newContainerResponse(container, task.GetTaskENI())
containers = append(containers, containerResponse)
}

knownStatus := task.GetKnownStatus()
Expand All @@ -92,6 +95,41 @@ func newTaskResponse(task *api.Task, containerMap map[string]*api.DockerContaine
}
}

func newContainerResponse(dockerContainer *api.DockerContainer, eni *api.ENI) v1.ContainerResponse {
container := dockerContainer.Container
resp := v1.ContainerResponse{
Name: container.Name,
DockerId: dockerContainer.DockerID,
DockerName: dockerContainer.DockerName,
}

for _, binding := range container.GetPorts() {
port := v2.PortResponse{
ContainerPort: binding.ContainerPort,
Protocol: binding.Protocol.String(),
}

if eni == nil {
port.HostPort = binding.HostPort
} else {
port.HostPort = port.ContainerPort
}

resp.Ports = append(resp.Ports, port)
}

if eni != nil {
resp.Networks = []containermetadata.Network{
{
NetworkMode: "awsvpc",
IPv4Addresses: eni.GetIPV4Addresses(),
IPv6Addresses: eni.GetIPV6Addresses(),
},
}
}
return resp
}

func newTasksResponse(state dockerstate.TaskEngineState) *v1.TasksResponse {
allTasks := state.AllTasks()
taskResponses := make([]*v1.TaskResponse, len(allTasks))
Expand Down
44 changes: 44 additions & 0 deletions agent/handlers/v1_handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (

const testContainerInstanceArn = "test_container_instance_arn"
const testClusterArn = "test_cluster_arn"
const eniIPV4Address = "10.0.0.2"

func TestMetadataHandler(t *testing.T) {
metadataHandler := metadataV1RequestHandlerMaker(utils.Strptr(testContainerInstanceArn), &config.Config{Cluster: testClusterArn})
Expand Down Expand Up @@ -125,6 +126,24 @@ func TestGetTaskByTaskArn(t *testing.T) {
taskDiffHelper(t, []*api.Task{testTasks[0]}, v1.TasksResponse{Tasks: []*v1.TaskResponse{&taskResponse}})
}

func TestGetAWSVPCTaskByTaskArn(t *testing.T) {
recorder := performMockRequest(t, "/v1/tasks?taskarn=awsvpcTask")

var taskResponse v1.TaskResponse
err := json.Unmarshal(recorder.Body.Bytes(), &taskResponse)