agent/handlers/v1/introspection_state.go (69 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package v1
import (
"fmt"
apitask "github.com/aws/amazon-ecs-agent/agent/api/task"
"github.com/aws/amazon-ecs-agent/agent/engine/dockerstate"
handlerutils "github.com/aws/amazon-ecs-agent/agent/handlers/utils"
"github.com/aws/amazon-ecs-agent/agent/utils"
agentversion "github.com/aws/amazon-ecs-agent/agent/version"
v1 "github.com/aws/amazon-ecs-agent/ecs-agent/introspection/v1"
)
// AgentStateImpl is an implementation of the AgentState interface in the introspection package.
// This struct supplies the introspection server with the necessary data to construct its responses.
type AgentStateImpl struct {
ContainerInstanceArn *string
ClusterName string
TaskEngine handlerutils.DockerStateResolver
}
var licenseProvider = utils.NewLicenseProvider()
// GetLicenseText returns the agent's license text as a string with an error if the license cannot be retrieved.
func (as *AgentStateImpl) GetLicenseText() (string, error) {
return licenseProvider.GetText()
}
// GetAgentMetadata returns agent metadata in v1 format.
func (as *AgentStateImpl) GetAgentMetadata() (*v1.AgentMetadataResponse, error) {
return &v1.AgentMetadataResponse{
Cluster: as.ClusterName,
ContainerInstanceArn: as.ContainerInstanceArn,
Version: agentversion.String(),
}, nil
}
// GetTasksMetadata returns task metadata in v1 format for all tasks on the host with an error if the metadata
// cannot be retrieved.
func (as *AgentStateImpl) GetTasksMetadata() (*v1.TasksResponse, error) {
agentState := as.TaskEngine.State()
allTasks := agentState.AllExternalTasks()
taskResponses := make([]*v1.TaskResponse, len(allTasks))
for ndx, task := range allTasks {
containerMap, _ := agentState.ContainerMapByArn(task.Arn)
taskResponses[ndx] = NewTaskResponse(task, containerMap)
}
return &v1.TasksResponse{Tasks: taskResponses}, nil
}
// GetTaskMetadataByArn returns task metadata in v1 format for the task with a matching task Arn, with an error
// if the metadata cannot be retrieved.
func (as *AgentStateImpl) GetTaskMetadataByArn(taskArn string) (*v1.TaskResponse, error) {
agentState := as.TaskEngine.State()
task, found := agentState.TaskByArn(taskArn)
return createTaskResponse(taskArn, "arn", agentState, task, found)
}
// GetTaskMetadataByID returns task metadata in v1 format for the task with a matching docker ID, with an error
// if the metadata cannot be retieved.
func (as *AgentStateImpl) GetTaskMetadataByID(dockerID string) (*v1.TaskResponse, error) {
agentState := as.TaskEngine.State()
task, found := agentState.TaskByID(dockerID)
return createTaskResponse(dockerID, "dockerID", agentState, task, found)
}
// GetTaskMetadataByShortID returns task metadata in v1 format for the task with a matching short docker ID, with
// an error if the metadata cannot be retrieved.
func (as *AgentStateImpl) GetTaskMetadataByShortID(shortDockerID string) (*v1.TaskResponse, error) {
agentState := as.TaskEngine.State()
tasks, found := agentState.TaskByShortID(shortDockerID)
if len(tasks) > 1 {
return nil, v1.NewErrorMultipleTasksFound(fmt.Sprintf("multiple tasks found with short id %s", shortDockerID))
}
var task *apitask.Task
if found {
task = tasks[0]
}
return createTaskResponse(shortDockerID, "shortDockerID", agentState, task, found)
}
// createTaskResponse looks up a task and returns the task metadata response in v1 format or a not found error
// if the response cannot be constructed.
func createTaskResponse(
key string,
keyType string,
agentState dockerstate.TaskEngineState,
task *apitask.Task, found bool) (*v1.TaskResponse, error) {
if !found {
return nil, v1.NewErrorNotFound(fmt.Sprintf("no task found with %s %s", keyType, key))
}
containerMap, _ := agentState.ContainerMapByArn(task.Arn)
return NewTaskResponse(task, containerMap), nil
}