Skip to content

Commit 61ff422

Browse files
saurabhc123singholt
authored andcommitted
Added the changes to safely parse the SSM parameters for windows containers. (#3)
* First cut of the changes. * Intermediate check-in before refactoring to hashing the paths. * Refactored the code to use a concatenated hashed value for the CredSpec filename. * Cleaning the cruft. * Simplified the code a bit and incorporated the first round of PR review comments. * Arranged the imports as per the language spec. * Fixed a broken test. * Fixed a few more broken tests. * Refactored the code to only use the credspecContainer Map. * Fixed more references and tests. * Fixed more tests. * Fixed more tests. * Fixed more tests. * Fixed more tests. * Improved the documentation for the member variable. * Incorporated some review comments. * Removed the unnecessary method and cleaned up the code a bit. * Some more clean-up of the code. * Tidying the imports.
1 parent 966524c commit 61ff422

File tree

8 files changed

+244
-164
lines changed

8 files changed

+244
-164
lines changed

agent/api/task/task_windows.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ func (task *Task) requiresCredentialSpecResource() bool {
141141
// initializeCredentialSpecResource builds the resource dependency map for the credentialspec resource
142142
func (task *Task) initializeCredentialSpecResource(config *config.Config, credentialsManager credentials.Manager,
143143
resourceFields *taskresource.ResourceFields) error {
144-
credentialspecResource, err := credentialspec.NewCredentialSpecResource(task.Arn, config.AWSRegion, task.getAllCredentialSpecRequirements(),
145-
task.ExecutionCredentialsID, credentialsManager, resourceFields.SSMClientCreator, resourceFields.S3ClientCreator)
144+
credspecContainerMapping := task.getAllCredentialSpecRequirements()
145+
credentialspecResource, err := credentialspec.NewCredentialSpecResource(task.Arn, config.AWSRegion, task.ExecutionCredentialsID,
146+
credentialsManager, resourceFields.SSMClientCreator, resourceFields.S3ClientCreator, credspecContainerMapping)
146147
if err != nil {
147148
return err
148149
}
@@ -162,17 +163,15 @@ func (task *Task) initializeCredentialSpecResource(config *config.Config, creden
162163
}
163164

164165
// getAllCredentialSpecRequirements is used to build all the credential spec requirements for the task
165-
func (task *Task) getAllCredentialSpecRequirements() []string {
166-
reqs := []string{}
167-
166+
func (task *Task) getAllCredentialSpecRequirements() map[string]string {
167+
reqsContainerMap := make(map[string]string)
168168
for _, container := range task.Containers {
169169
credentialSpec, err := container.GetCredentialSpec()
170-
if err == nil && credentialSpec != "" && !utils.StrSliceContains(reqs, credentialSpec) {
171-
reqs = append(reqs, credentialSpec)
170+
if err == nil && credentialSpec != "" {
171+
reqsContainerMap[credentialSpec] = container.Name
172172
}
173173
}
174-
175-
return reqs
174+
return reqsContainerMap
176175
}
177176

178177
// GetCredentialSpecResource retrieves credentialspec resource from resource map

agent/api/task/task_windows_test.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package task
1919
import (
2020
"encoding/json"
2121
"fmt"
22+
"reflect"
2223
"runtime"
2324
"testing"
2425

@@ -396,70 +397,70 @@ func TestRequiresCredentialSpecResource(t *testing.T) {
396397

397398
func TestGetAllCredentialSpecRequirements(t *testing.T) {
398399
hostConfig := "{\"SecurityOpt\": [\"credentialspec:file://gmsa_gmsa-acct.json\"]}"
399-
container := &apicontainer.Container{}
400+
container := &apicontainer.Container{Name: "webapp1"}
400401
container.DockerConfig.HostConfig = &hostConfig
401402

402403
task := &Task{
403404
Arn: "test",
404405
Containers: []*apicontainer.Container{container},
405406
}
406407

407-
allCredSpecReq := task.getAllCredentialSpecRequirements()
408+
credentialSpecContainerMap := task.getAllCredentialSpecRequirements()
408409

409-
credentialspec := "credentialspec:file://gmsa_gmsa-acct.json"
410-
expectedCredSpecReq := []string{credentialspec}
410+
credentialspecFileLocation := "credentialspec:file://gmsa_gmsa-acct.json"
411+
expectedCredentialSpecContainerMap := map[string]string{credentialspecFileLocation: "webapp1"}
411412

412-
assert.EqualValues(t, expectedCredSpecReq, allCredSpecReq)
413+
assert.True(t, reflect.DeepEqual(expectedCredentialSpecContainerMap, credentialSpecContainerMap))
413414
}
414415

415416
func TestGetAllCredentialSpecRequirementsWithMultipleContainersUsingSameSpec(t *testing.T) {
416417
hostConfig := "{\"SecurityOpt\": [\"credentialspec:file://gmsa_gmsa-acct.json\"]}"
417-
c1 := &apicontainer.Container{}
418+
c1 := &apicontainer.Container{Name: "webapp1"}
418419
c1.DockerConfig.HostConfig = &hostConfig
419420

420-
c2 := &apicontainer.Container{}
421+
c2 := &apicontainer.Container{Name: "webapp2"}
421422
c2.DockerConfig.HostConfig = &hostConfig
422423

423424
task := &Task{
424425
Arn: "test",
425426
Containers: []*apicontainer.Container{c1, c2},
426427
}
427428

428-
allCredSpecReq := task.getAllCredentialSpecRequirements()
429+
credentialSpecContainerMap := task.getAllCredentialSpecRequirements()
429430

430-
credentialspec := "credentialspec:file://gmsa_gmsa-acct.json"
431-
expectedCredSpecReq := []string{credentialspec}
431+
credentialspecFileLocation := "credentialspec:file://gmsa_gmsa-acct.json"
432+
expectedCredentialSpecContainerMap := map[string]string{credentialspecFileLocation: "webapp2"}
432433

433-
assert.Equal(t, len(expectedCredSpecReq), len(allCredSpecReq))
434-
assert.EqualValues(t, expectedCredSpecReq, allCredSpecReq)
434+
assert.Equal(t, len(expectedCredentialSpecContainerMap), len(credentialSpecContainerMap))
435+
assert.True(t, reflect.DeepEqual(expectedCredentialSpecContainerMap, credentialSpecContainerMap))
435436
}
436437

437438
func TestGetAllCredentialSpecRequirementsWithMultipleContainers(t *testing.T) {
438439
hostConfig1 := "{\"SecurityOpt\": [\"credentialspec:file://gmsa_gmsa-acct-1.json\"]}"
439440
hostConfig2 := "{\"SecurityOpt\": [\"credentialspec:file://gmsa_gmsa-acct-2.json\"]}"
440441

441-
c1 := &apicontainer.Container{}
442+
c1 := &apicontainer.Container{Name: "webapp1"}
442443
c1.DockerConfig.HostConfig = &hostConfig1
443444

444-
c2 := &apicontainer.Container{}
445+
c2 := &apicontainer.Container{Name: "webapp2"}
445446
c2.DockerConfig.HostConfig = &hostConfig1
446447

447-
c3 := &apicontainer.Container{}
448+
c3 := &apicontainer.Container{Name: "webapp3"}
448449
c3.DockerConfig.HostConfig = &hostConfig2
449450

450451
task := &Task{
451452
Arn: "test",
452453
Containers: []*apicontainer.Container{c1, c2, c3},
453454
}
454455

455-
allCredSpecReq := task.getAllCredentialSpecRequirements()
456+
credentialSpecContainerMap := task.getAllCredentialSpecRequirements()
456457

457458
credentialspec1 := "credentialspec:file://gmsa_gmsa-acct-1.json"
458459
credentialspec2 := "credentialspec:file://gmsa_gmsa-acct-2.json"
459460

460-
expectedCredSpecReq := []string{credentialspec1, credentialspec2}
461+
expectedCredentialSpecContainerMap := map[string]string{credentialspec1: "webapp2", credentialspec2: "webapp3"}
461462

462-
assert.EqualValues(t, expectedCredSpecReq, allCredSpecReq)
463+
assert.True(t, reflect.DeepEqual(expectedCredentialSpecContainerMap, credentialSpecContainerMap))
463464
}
464465

465466
func TestInitializeAndGetCredentialSpecResource(t *testing.T) {

agent/engine/docker_task_engine.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ import (
2525
"sync"
2626
"time"
2727

28-
"github.com/aws/aws-sdk-go/aws"
29-
30-
"github.com/aws/amazon-ecs-agent/agent/logger"
31-
"github.com/aws/amazon-ecs-agent/agent/logger/field"
32-
3328
"github.com/aws/amazon-ecs-agent/agent/api"
3429
apicontainer "github.com/aws/amazon-ecs-agent/agent/api/container"
3530
apicontainerstatus "github.com/aws/amazon-ecs-agent/agent/api/container/status"
@@ -47,6 +42,8 @@ import (
4742
"github.com/aws/amazon-ecs-agent/agent/engine/dockerstate"
4843
"github.com/aws/amazon-ecs-agent/agent/engine/execcmd"
4944
"github.com/aws/amazon-ecs-agent/agent/eventstream"
45+
"github.com/aws/amazon-ecs-agent/agent/logger"
46+
"github.com/aws/amazon-ecs-agent/agent/logger/field"
5047
"github.com/aws/amazon-ecs-agent/agent/metrics"
5148
"github.com/aws/amazon-ecs-agent/agent/statechange"
5249
"github.com/aws/amazon-ecs-agent/agent/taskresource"
@@ -56,9 +53,9 @@ import (
5653
"github.com/aws/amazon-ecs-agent/agent/utils/retry"
5754
utilsync "github.com/aws/amazon-ecs-agent/agent/utils/sync"
5855
"github.com/aws/amazon-ecs-agent/agent/utils/ttime"
59-
dockercontainer "github.com/docker/docker/api/types/container"
60-
56+
"github.com/aws/aws-sdk-go/aws"
6157
"github.com/docker/docker/api/types"
58+
dockercontainer "github.com/docker/docker/api/types/container"
6259
"github.com/pkg/errors"
6360
)
6461

agent/engine/docker_task_engine_windows.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ package engine
1919
import (
2020
"time"
2121

22-
"github.com/aws/amazon-ecs-agent/agent/logger"
23-
"github.com/aws/amazon-ecs-agent/agent/logger/field"
24-
2522
apicontainer "github.com/aws/amazon-ecs-agent/agent/api/container"
2623
apitask "github.com/aws/amazon-ecs-agent/agent/api/task"
24+
"github.com/aws/amazon-ecs-agent/agent/logger"
25+
"github.com/aws/amazon-ecs-agent/agent/logger/field"
2726
"github.com/pkg/errors"
2827
)
2928

agent/engine/docker_task_engine_windows_test.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import (
3838
mock_ssm_factory "github.com/aws/amazon-ecs-agent/agent/ssm/factory/mocks"
3939
"github.com/aws/amazon-ecs-agent/agent/taskresource"
4040
"github.com/aws/amazon-ecs-agent/agent/taskresource/credentialspec"
41-
4241
"github.com/aws/aws-sdk-go/aws"
4342
"github.com/docker/docker/api/types"
4443
dockercontainer "github.com/docker/docker/api/types/container"
@@ -134,16 +133,14 @@ func TestCredentialSpecResourceTaskFile(t *testing.T) {
134133
ssmClientCreator := mock_ssm_factory.NewMockSSMClientCreator(ctrl)
135134
s3ClientCreator := mock_s3_factory.NewMockS3ClientCreator(ctrl)
136135

137-
credentialSpecReq := []string{credentialspecFile}
138-
139136
credentialSpecRes, cerr := credentialspec.NewCredentialSpecResource(
140137
testTask.Arn,
141138
defaultConfig.AWSRegion,
142-
credentialSpecReq,
143139
credentialsID,
144140
credentialsManager,
145141
ssmClientCreator,
146-
s3ClientCreator)
142+
s3ClientCreator,
143+
nil)
147144
assert.NoError(t, cerr)
148145

149146
credSpecdata := map[string]string{
@@ -215,16 +212,14 @@ func TestCredentialSpecResourceTaskFileErr(t *testing.T) {
215212
ssmClientCreator := mock_ssm_factory.NewMockSSMClientCreator(ctrl)
216213
s3ClientCreator := mock_s3_factory.NewMockS3ClientCreator(ctrl)
217214

218-
credentialSpecReq := []string{credentialspecFile}
219-
220215
credentialSpecRes, cerr := credentialspec.NewCredentialSpecResource(
221216
testTask.Arn,
222217
defaultConfig.AWSRegion,
223-
credentialSpecReq,
224218
credentialsID,
225219
credentialsManager,
226220
ssmClientCreator,
227-
s3ClientCreator)
221+
s3ClientCreator,
222+
nil)
228223
assert.NoError(t, cerr)
229224

230225
credSpecdata := map[string]string{

agent/engine/engine_windows_integ_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@ import (
2929
"testing"
3030
"time"
3131

32-
"github.com/aws/amazon-ecs-agent/agent/ecs_client/model/ecs"
33-
34-
"github.com/cihub/seelog"
35-
36-
"github.com/docker/docker/api/types"
37-
3832
"github.com/aws/amazon-ecs-agent/agent/api"
3933
apicontainer "github.com/aws/amazon-ecs-agent/agent/api/container"
4034
apicontainerstatus "github.com/aws/amazon-ecs-agent/agent/api/container/status"
@@ -47,6 +41,7 @@ import (
4741
"github.com/aws/amazon-ecs-agent/agent/dockerclient/dockerapi"
4842
"github.com/aws/amazon-ecs-agent/agent/dockerclient/sdkclientfactory"
4943
"github.com/aws/amazon-ecs-agent/agent/ec2"
44+
"github.com/aws/amazon-ecs-agent/agent/ecs_client/model/ecs"
5045
"github.com/aws/amazon-ecs-agent/agent/engine/dockerstate"
5146
"github.com/aws/amazon-ecs-agent/agent/engine/execcmd"
5247
"github.com/aws/amazon-ecs-agent/agent/eventstream"
@@ -56,6 +51,8 @@ import (
5651
taskresourcevolume "github.com/aws/amazon-ecs-agent/agent/taskresource/volume"
5752
"github.com/aws/amazon-ecs-agent/agent/utils"
5853
"github.com/aws/aws-sdk-go/aws"
54+
"github.com/cihub/seelog"
55+
"github.com/docker/docker/api/types"
5956
sdkClient "github.com/docker/docker/client"
6057
"github.com/stretchr/testify/assert"
6158
"github.com/stretchr/testify/require"

0 commit comments

Comments
 (0)