Skip to content

Commit

Permalink
Obtain default host network name in tmds state using netconfig
Browse files Browse the repository at this point in the history
  • Loading branch information
mye956 committed Sep 26, 2024
1 parent d30a5cc commit 2277f68
Show file tree
Hide file tree
Showing 8 changed files with 242 additions and 4 deletions.
34 changes: 33 additions & 1 deletion agent/handlers/task_server_setup_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package handlers

import (
"net"
"testing"

apitask "github.com/aws/amazon-ecs-agent/agent/api/task"
Expand All @@ -25,16 +26,19 @@ import (
mock_stats "github.com/aws/amazon-ecs-agent/agent/stats/mock"
mock_ecs "github.com/aws/amazon-ecs-agent/ecs-agent/api/ecs/mocks"
v4 "github.com/aws/amazon-ecs-agent/ecs-agent/tmds/handlers/v4/state"
mock_netlinkwrapper "github.com/aws/amazon-ecs-agent/ecs-agent/utils/netlinkwrapper/mocks"

"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
"github.com/vishvananda/netlink"
)

func TestV4GetTaskMetadataWithTaskNetworkConfig(t *testing.T) {

tcs := []struct {
name string
setStateExpectations func(state *mock_dockerstate.MockTaskEngineState)
setNetLinkExpectations func(netLink *mock_netlinkwrapper.MockNetLink)
expectedTaskNetworkConfig *v4.TaskNetworkConfig
}{
{
Expand Down Expand Up @@ -72,6 +76,25 @@ func TestV4GetTaskMetadataWithTaskNetworkConfig(t *testing.T) {
state.EXPECT().ContainerByID(containerID).Return(nil, false).AnyTimes(),
)
},
setNetLinkExpectations: func(netLink *mock_netlinkwrapper.MockNetLink) {
routes := []netlink.Route{
netlink.Route{
Gw: net.ParseIP("10.194.20.1"),
Dst: nil,
LinkIndex: 0,
},
}
link := &netlink.Device{
LinkAttrs: netlink.LinkAttrs{
Index: 0,
Name: "eth0",
},
}
gomock.InOrder(
netLink.EXPECT().RouteList(nil, netlink.FAMILY_ALL).Return(routes, nil).AnyTimes(),
netLink.EXPECT().LinkByIndex(link.Attrs().Index).Return(link, nil).AnyTimes(),
)
},
expectedTaskNetworkConfig: expectedV4TaskNetworkConfig(true, apitask.HostNetworkMode, hostNetworkNamespace, defaultIfname),
},
{
Expand Down Expand Up @@ -103,7 +126,16 @@ func TestV4GetTaskMetadataWithTaskNetworkConfig(t *testing.T) {
tc.setStateExpectations(state)
}
tmdsAgentState := agentV4.NewTMDSAgentState(state, statsEngine, ecsClient, clusterName, availabilityzone, vpcID, containerInstanceArn)
actualTaskResponse, err := tmdsAgentState.GetTaskMetadataWithTaskNetworkConfig(v3EndpointID, nil)

netConfigClient := v4.NewNetworkConfigClient()

if tc.setNetLinkExpectations != nil {
mock_netlinkwrapper := mock_netlinkwrapper.NewMockNetLink(ctrl)
tc.setNetLinkExpectations(mock_netlinkwrapper)
netConfigClient.NetlinkClient = mock_netlinkwrapper
}

actualTaskResponse, err := tmdsAgentState.GetTaskMetadataWithTaskNetworkConfig(v3EndpointID, netConfigClient)

assert.NoError(t, err)
assert.Equal(t, tc.expectedTaskNetworkConfig, actualTaskResponse.TaskNetworkConfig)
Expand Down
12 changes: 11 additions & 1 deletion agent/handlers/v4/tmdsstate_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,24 @@
package v4

import (
"github.com/aws/amazon-ecs-agent/ecs-agent/logger"
"github.com/aws/amazon-ecs-agent/ecs-agent/logger/field"
tmdsv4 "github.com/aws/amazon-ecs-agent/ecs-agent/tmds/handlers/v4/state"
"github.com/aws/amazon-ecs-agent/ecs-agent/tmds/utils/netconfig"
)

func (s *TMDSAgentState) GetTaskMetadataWithTaskNetworkConfig(v3EndpointID string, networkConfigClient *tmdsv4.NetworkConfigClient) (tmdsv4.TaskResponse, error) {
taskResponse, err := s.getTaskMetadata(v3EndpointID, false, true)
if err == nil {
if taskResponse.TaskNetworkConfig != nil && taskResponse.TaskNetworkConfig.NetworkMode == "host" {
taskResponse.TaskNetworkConfig.NetworkNamespaces[0].NetworkInterfaces[0].DeviceName = ""
hostDeviceName, err := netconfig.DefaultNetInterfaceName(networkConfigClient.NetlinkClient)
if err != nil {
logger.Warn("Unable to obtain default network interface on host", logger.Fields{
field.TaskARN: taskResponse.TaskARN,
field.Error: err,
})
}
taskResponse.TaskNetworkConfig.NetworkNamespaces[0].NetworkInterfaces[0].DeviceName = hostDeviceName
}
}
return taskResponse, err
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions agent/vendor/modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,15 @@ github.com/aws/amazon-ecs-agent/ecs-agent/tmds/handlers/v4
github.com/aws/amazon-ecs-agent/ecs-agent/tmds/handlers/v4/state
github.com/aws/amazon-ecs-agent/ecs-agent/tmds/logging
github.com/aws/amazon-ecs-agent/ecs-agent/tmds/utils/mux
github.com/aws/amazon-ecs-agent/ecs-agent/tmds/utils/netconfig
github.com/aws/amazon-ecs-agent/ecs-agent/utils
github.com/aws/amazon-ecs-agent/ecs-agent/utils/arn
github.com/aws/amazon-ecs-agent/ecs-agent/utils/cipher
github.com/aws/amazon-ecs-agent/ecs-agent/utils/execwrapper
github.com/aws/amazon-ecs-agent/ecs-agent/utils/execwrapper/mocks
github.com/aws/amazon-ecs-agent/ecs-agent/utils/httpproxy
github.com/aws/amazon-ecs-agent/ecs-agent/utils/netlinkwrapper
github.com/aws/amazon-ecs-agent/ecs-agent/utils/netlinkwrapper/mocks
github.com/aws/amazon-ecs-agent/ecs-agent/utils/retry
github.com/aws/amazon-ecs-agent/ecs-agent/utils/retry/mock
github.com/aws/amazon-ecs-agent/ecs-agent/utils/ttime
Expand Down
2 changes: 1 addition & 1 deletion ecs-agent/tmds/handlers/fault/v1/handlers/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -933,7 +933,7 @@ func validateRequest(w http.ResponseWriter, request types.NetworkFaultRequest, r
func validateTaskMetadata(w http.ResponseWriter, agentState state.AgentState, requestType string, r *http.Request) (*state.TaskResponse, error) {
var taskMetadata state.TaskResponse
endpointContainerID := mux.Vars(r)[v4.EndpointContainerIDMuxName]
taskMetadata, err := agentState.GetTaskMetadataWithTaskNetworkConfig(endpointContainerID, nil)
taskMetadata, err := agentState.GetTaskMetadataWithTaskNetworkConfig(endpointContainerID, state.NewNetworkConfigClient())
if err != nil {
code, errResponse := getTaskMetadataErrorResponse(endpointContainerID, requestType, err)
responseBody := types.NewNetworkFaultInjectionErrorResponse(fmt.Sprintf("%v", errResponse))
Expand Down

0 comments on commit 2277f68

Please sign in to comment.