Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d2ed28e

Browse files
committed
Redo: support pidMode and ipcMode in ECS Params. Addresses aws#667
1 parent 0c45d5f commit d2ed28e

File tree

6 files changed

+93
-1
lines changed

6 files changed

+93
-1
lines changed

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,8 @@ task_definition:
444444
task_size: // Required for running tasks with Fargate launch type
445445
cpu_limit: string
446446
mem_limit: string
447+
pid_mode: string // Supported string values: task or host
448+
ipc_mode: string // Supported string values: task, host, or none
447449
services:
448450
<service_name>:
449451
essential: boolean
@@ -533,6 +535,10 @@ Fields listed under `task_definition` correspond to fields that will be included
533535

534536
* `task_size` Contains two fields, CPU and Memory. These fields are required for launching tasks with Fargate launch type. See [the documentation on ECS Task Definition Parameters](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html) for more information.
535537

538+
* `pid_mode` allows you to control the process namespace in which your containers run. Valid values are `task` or `host`. See the [ECS documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_definition_pidmode) for more information.
539+
540+
* `ipc_mode` allows you to control the IPC resource namespace in which your containers run. Valid values are `task`, `host`, or `none`. See the [ECS documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_definition_ipcmode) for more information.
541+
536542
**Run Params**
537543
Fields listed under `run_params` are for values needed as options to API calls not related to a Task Definition, such as `compose up` (RunTask) and `compose service up` (CreateService).
538544
Currently, the only parameter supported under `run_params` is `network_configuration`. This is required to run tasks with [Task Networking](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html), as well as with Fargate launch type.

ecs-cli/modules/cli/compose/entity/entity_helper.go

+2
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ func createRegisterTaskDefinitionRequest(taskDefinition *ecs.TaskDefinition) *ec
123123
TaskRoleArn: taskDefinition.TaskRoleArn,
124124
RequiresCompatibilities: taskDefinition.RequiresCompatibilities,
125125
ExecutionRoleArn: taskDefinition.ExecutionRoleArn,
126+
PidMode: taskDefinition.PidMode,
127+
IpcMode: taskDefinition.IpcMode,
126128
}
127129

128130
if networkMode := taskDefinition.NetworkMode; aws.StringValue(networkMode) != "" {

ecs-cli/modules/utils/compose/convert_task_definition.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ type TaskDefParams struct {
3434
taskRoleArn string
3535
cpu string
3636
memory string
37+
pidMode string
38+
ipcMode string
3739
containerDefs ContainerDefs
3840
executionRoleArn string
3941
}
@@ -123,6 +125,7 @@ func ConvertToTaskDefinition(params ConvertTaskDefParams) (*ecs.TaskDefinition,
123125
}
124126
}
125127

128+
// Note: this is later converted into an ecs.RegisterTaskDefinitionInput in entity_helper.go
126129
taskDefinition := &ecs.TaskDefinition{
127130
Family: aws.String(params.TaskDefName),
128131
ContainerDefinitions: containerDefinitions,
@@ -138,7 +141,12 @@ func ConvertToTaskDefinition(params ConvertTaskDefParams) (*ecs.TaskDefinition,
138141
if params.RequiredCompatibilites != "" {
139142
taskDefinition.RequiresCompatibilities = []*string{aws.String(params.RequiredCompatibilites)}
140143
}
141-
144+
if taskDefParams.pidMode != "" {
145+
taskDefinition.SetPidMode(taskDefParams.pidMode)
146+
}
147+
if taskDefParams.ipcMode != "" {
148+
taskDefinition.SetIpcMode(taskDefParams.ipcMode)
149+
}
142150
return taskDefinition, nil
143151
}
144152

@@ -449,6 +457,8 @@ func convertTaskDefParams(ecsParams *ECSParams) (params TaskDefParams, e error)
449457
params.cpu = taskDef.TaskSize.Cpu
450458
params.memory = taskDef.TaskSize.Memory
451459
params.executionRoleArn = taskDef.ExecutionRole
460+
params.ipcMode = taskDef.IPCMode
461+
params.pidMode = taskDef.PIDMode
452462

453463
return params, nil
454464
}

ecs-cli/modules/utils/compose/convert_task_definition_test.go

+44
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ func TestConvertToTaskDefinition(t *testing.T) {
239239
// verify task def fields
240240
assert.Equal(t, taskRoleArn, aws.StringValue(taskDefinition.TaskRoleArn), "Expected taskRoleArn to match")
241241
assert.Empty(t, taskDefinition.RequiresCompatibilities, "Did not expect RequiresCompatibilities to be set")
242+
// PID and IPC should be unset
243+
assert.Nil(t, taskDefinition.IpcMode, "Expected IpcMode to be nil")
244+
assert.Nil(t, taskDefinition.PidMode, "Expected PidMode to be nil")
242245

243246
// verify container def fields
244247
assert.Equal(t, aws.String(name), containerDef.Name, "Expected container def name to match")
@@ -432,6 +435,10 @@ task_definition:
432435
taskDefinition, err := convertToTaskDefinitionForTest(t, containerConfigs, "", "", ecsParams, nil)
433436

434437
if assert.NoError(t, err) {
438+
// PID and IPC should be unset
439+
assert.Nil(t, taskDefinition.IpcMode, "Expected IpcMode to be nil")
440+
assert.Nil(t, taskDefinition.PidMode, "Expected PidMode to be nil")
441+
435442
assert.Equal(t, "host", aws.StringValue(taskDefinition.NetworkMode), "Expected network mode to match")
436443
assert.Equal(t, "arn:aws:iam::123456789012:role/my_role", aws.StringValue(taskDefinition.TaskRoleArn), "Expected task role ARN to match")
437444

@@ -1201,6 +1208,43 @@ func TestMemReservationHigherThanMemLimit(t *testing.T) {
12011208
assert.EqualError(t, err, "mem_limit must be greater than mem_reservation")
12021209
}
12031210

1211+
func TestConvertToTaskDefinitionWithECSParams_PIDandIPC(t *testing.T) {
1212+
containerConfig := &adapter.ContainerConfig{
1213+
Name: "web",
1214+
Image: "httpd",
1215+
}
1216+
1217+
ecsParamsString := `version: 1
1218+
task_definition:
1219+
pid_mode: task
1220+
ipc_mode: host`
1221+
1222+
content := []byte(ecsParamsString)
1223+
1224+
tmpfile, err := ioutil.TempFile("", "ecs-params")
1225+
assert.NoError(t, err, "Could not create ecs params tempfile")
1226+
1227+
defer os.Remove(tmpfile.Name())
1228+
1229+
_, err = tmpfile.Write(content)
1230+
assert.NoError(t, err, "Could not write data to ecs params tempfile")
1231+
1232+
err = tmpfile.Close()
1233+
assert.NoError(t, err, "Could not close tempfile")
1234+
1235+
ecsParamsFileName := tmpfile.Name()
1236+
ecsParams, err := ReadECSParams(ecsParamsFileName)
1237+
assert.NoError(t, err, "Could not read ECS Params file")
1238+
1239+
containerConfigs := []adapter.ContainerConfig{*containerConfig}
1240+
taskDefinition, err := convertToTaskDefinitionForTest(t, containerConfigs, "", "", ecsParams, nil)
1241+
1242+
if assert.NoError(t, err) {
1243+
assert.Equal(t, "task", aws.StringValue(taskDefinition.PidMode))
1244+
assert.Equal(t, "host", aws.StringValue(taskDefinition.IpcMode))
1245+
}
1246+
}
1247+
12041248
func TestConvertToTaskDefinitionWithVolumes(t *testing.T) {
12051249
volumeConfigs := &adapter.Volumes{
12061250
VolumeWithHost: map[string]string{

ecs-cli/modules/utils/compose/ecs_params_reader.go

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ type ECSParams struct {
4545
type EcsTaskDef struct {
4646
NetworkMode string `yaml:"ecs_network_mode"`
4747
TaskRoleArn string `yaml:"task_role_arn"`
48+
PIDMode string `yaml:"pid_mode"`
49+
IPCMode string `yaml:"ipc_mode"`
4850
ContainerDefinitions ContainerDefs `yaml:"services"`
4951
ExecutionRole string `yaml:"task_execution_role"`
5052
TaskSize TaskSize `yaml:"task_size"` // Needed to run FARGATE tasks

ecs-cli/modules/utils/compose/ecs_params_reader_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,34 @@ task_definition:
356356
}
357357
}
358358

359+
func TestReadECSParams_WithPIDandIPC(t *testing.T) {
360+
ecsParamsString := `version: 1
361+
task_definition:
362+
pid_mode: host
363+
ipc_mode: task`
364+
365+
content := []byte(ecsParamsString)
366+
367+
tmpfile, err := ioutil.TempFile("", "ecs-params")
368+
assert.NoError(t, err, "Could not create ecs-params tempfile")
369+
370+
ecsParamsFileName := tmpfile.Name()
371+
defer os.Remove(ecsParamsFileName)
372+
373+
_, err = tmpfile.Write(content)
374+
assert.NoError(t, err, "Could not write data to ecs-params tempfile")
375+
376+
err = tmpfile.Close()
377+
assert.NoError(t, err, "Could not close tempfile")
378+
379+
ecsParams, err := ReadECSParams(ecsParamsFileName)
380+
381+
if assert.NoError(t, err) {
382+
assert.Equal(t, "host", ecsParams.TaskDefinition.PIDMode, "Expected PIDMode to be set")
383+
assert.Equal(t, "task", ecsParams.TaskDefinition.IPCMode, "Expected IPCMode to be set")
384+
}
385+
}
386+
359387
/** ConvertToECSNetworkConfiguration tests **/
360388

361389
func TestConvertToECSNetworkConfiguration(t *testing.T) {

0 commit comments

Comments
 (0)