Skip to content

Commit 9e7dfbe

Browse files
committed
Clean up code, add logs and tests
1 parent 10002ef commit 9e7dfbe

File tree

3 files changed

+315
-152
lines changed

3 files changed

+315
-152
lines changed

agent/api/task/task.go

+4
Original file line numberDiff line numberDiff line change
@@ -3443,6 +3443,10 @@ func (task *Task) IsServiceConnectEnabled() bool {
34433443
return task.GetServiceConnectContainer() != nil
34443444
}
34453445

3446+
func (task *Task) IsServiceConnectBridgeModeApplicationContainer(container *apicontainer.Container) bool {
3447+
return container.GetNetworkModeFromHostConfig() == "container" && task.IsServiceConnectEnabled()
3448+
}
3449+
34463450
// PopulateServiceConnectContainerMappingEnvVar populates APPNET_CONTAINER_IP_MAPPING env var for AppNet Agent container
34473451
// aka SC container
34483452
func (task *Task) PopulateServiceConnectContainerMappingEnvVar() error {

agent/engine/docker_task_engine.go

+61-50
Original file line numberDiff line numberDiff line change
@@ -1385,9 +1385,16 @@ func (engine *DockerTaskEngine) createContainer(task *apitask.Task, container *a
13851385
var err error
13861386
targetContainer, err = task.GetBridgeModePauseContainerForTaskContainer(targetContainer)
13871387
if err != nil {
1388+
logger.Error("Failed to create container", logger.Fields{
1389+
field.TaskID: task.GetID(),
1390+
field.Container: container.Name,
1391+
field.Error: errors.New(fmt.Sprintf(
1392+
"container uses awsfirelens log driver but we failed to resolve Firelens bridge IP: %v", err)),
1393+
})
13881394
return dockerapi.DockerContainerMetadata{
1389-
Error: dockerapi.CannotStartContainerError{FromError: errors.New(fmt.Sprintf(
1390-
"failed to start firelens container: %v", err))},
1395+
Error: dockerapi.CannotCreateContainerError{FromError: errors.New(fmt.Sprintf(
1396+
"failed to create container - container uses awsfirelens log driver but we failed to "+
1397+
"resolve Firelens bridge IP: %v", err))},
13911398
}
13921399
}
13931400
}
@@ -1647,60 +1654,64 @@ func (engine *DockerTaskEngine) startContainer(task *apitask.Task, container *ap
16471654
// For bridge-mode ServiceConnect-enabled tasks, we inject pause container for each application container
16481655
// including the firelens container. Therefore, when resolving the container IP, we should be checking that
16491656
// of the associated pause container. In such case, the firelens container has network mode "container" since it's
1650-
//launched into its pause container's network namespace.
1651-
if container.GetFirelensConfig() != nil {
1652-
if !task.IsNetworkModeAWSVPC() &&
1653-
(container.GetNetworkModeFromHostConfig() == "" ||
1654-
container.GetNetworkModeFromHostConfig() == apitask.BridgeNetworkMode ||
1655-
(container.GetNetworkModeFromHostConfig() == "container" && task.IsServiceConnectEnabled())) {
1656-
_, gotContainerIP := getContainerHostIP(dockerContainerMD.NetworkSettings)
1657-
if task.IsServiceConnectEnabled() {
1658-
targetContainer, err := task.GetBridgeModePauseContainerForTaskContainer(container)
1659-
if err != nil {
1660-
return dockerapi.DockerContainerMetadata{
1661-
Error: dockerapi.CannotStartContainerError{FromError: errors.New(fmt.Sprintf(
1662-
"failed to start firelens container: %v", err))},
1663-
}
1657+
// launched into its pause container's network namespace.
1658+
if container.GetFirelensConfig() != nil && task.IsNetworkModeBridge() {
1659+
_, gotContainerIP := getContainerHostIP(dockerContainerMD.NetworkSettings)
1660+
if task.IsServiceConnectEnabled() {
1661+
targetContainer, err := task.GetBridgeModePauseContainerForTaskContainer(container)
1662+
if err != nil {
1663+
logger.Error("Failed to start Firelens container", logger.Fields{
1664+
field.TaskID: task.GetID(),
1665+
field.Container: container.Name,
1666+
field.Error: err,
1667+
})
1668+
return dockerapi.DockerContainerMetadata{
1669+
Error: dockerapi.CannotStartContainerError{FromError: errors.New(fmt.Sprintf(
1670+
"failed to start firelens container: %v", err))},
16641671
}
1665-
_, gotContainerIP = getContainerHostIP(targetContainer.GetNetworkSettings())
16661672
}
1667-
1668-
if !gotContainerIP {
1669-
getIPBridgeBackoff := retry.NewExponentialBackoff(minGetIPBridgeTimeout, maxGetIPBridgeTimeout, getIPBridgeRetryJitterMultiplier, getIPBridgeRetryDelayMultiplier)
1670-
contextWithTimeout, cancel := context.WithTimeout(engine.ctx, time.Minute)
1671-
defer cancel()
1672-
err := retry.RetryWithBackoffCtx(contextWithTimeout, getIPBridgeBackoff, func() error {
1673-
gotIPBridge := false
1674-
if task.IsServiceConnectEnabled() {
1675-
targetContainer, err := task.GetBridgeModePauseContainerForTaskContainer(container)
1676-
if err != nil {
1677-
return err
1678-
}
1679-
_, gotIPBridge = getContainerHostIP(targetContainer.GetNetworkSettings())
1680-
if gotIPBridge {
1681-
return nil
1682-
}
1683-
} else {
1684-
inspectOutput, err := engine.client.InspectContainer(engine.ctx, dockerContainerMD.DockerID,
1685-
dockerclient.InspectContainerTimeout)
1686-
if err != nil {
1687-
return err
1688-
}
1689-
_, gotIPBridge = getContainerHostIP(inspectOutput.NetworkSettings)
1690-
if gotIPBridge {
1691-
dockerContainerMD.NetworkSettings = inspectOutput.NetworkSettings
1692-
return nil
1693-
}
1673+
_, gotContainerIP = getContainerHostIP(targetContainer.GetNetworkSettings())
1674+
}
1675+
1676+
if !gotContainerIP {
1677+
getIPBridgeBackoff := retry.NewExponentialBackoff(minGetIPBridgeTimeout, maxGetIPBridgeTimeout, getIPBridgeRetryJitterMultiplier, getIPBridgeRetryDelayMultiplier)
1678+
contextWithTimeout, cancel := context.WithTimeout(engine.ctx, time.Minute)
1679+
defer cancel()
1680+
err := retry.RetryWithBackoffCtx(contextWithTimeout, getIPBridgeBackoff, func() error {
1681+
gotIPBridge := false
1682+
if task.IsServiceConnectEnabled() {
1683+
targetContainer, err := task.GetBridgeModePauseContainerForTaskContainer(container)
1684+
if err != nil {
1685+
return err
16941686
}
1695-
return errors.New("Bridge IP not available to use for firelens")
1696-
})
1697-
if err != nil {
1698-
return dockerapi.DockerContainerMetadata{
1699-
Error: dockerapi.CannotStartContainerError{FromError: err},
1687+
_, gotIPBridge = getContainerHostIP(targetContainer.GetNetworkSettings())
1688+
if gotIPBridge {
1689+
return nil
1690+
}
1691+
} else {
1692+
inspectOutput, err := engine.client.InspectContainer(engine.ctx, dockerContainerMD.DockerID,
1693+
dockerclient.InspectContainerTimeout)
1694+
if err != nil {
1695+
return err
17001696
}
1697+
_, gotIPBridge = getContainerHostIP(inspectOutput.NetworkSettings)
1698+
if gotIPBridge {
1699+
dockerContainerMD.NetworkSettings = inspectOutput.NetworkSettings
1700+
return nil
1701+
}
1702+
}
1703+
return errors.New("Bridge IP not available to use for firelens")
1704+
})
1705+
if err != nil {
1706+
logger.Error("Failed to start Firelens container", logger.Fields{
1707+
field.TaskID: task.GetID(),
1708+
field.Container: container.Name,
1709+
field.Error: err,
1710+
})
1711+
return dockerapi.DockerContainerMetadata{
1712+
Error: dockerapi.CannotStartContainerError{FromError: err},
17011713
}
17021714
}
1703-
17041715
}
17051716
}
17061717
if execcmd.IsExecEnabledContainer(container) {

0 commit comments

Comments
 (0)