Skip to content

Commit c52ec5a

Browse files
committed
Fix #34700: support repositoryCredentials in ECS
1 parent abbc749 commit c52ec5a

3 files changed

Lines changed: 28 additions & 14 deletions

File tree

src/main/java/eu/openanalytics/containerproxy/backend/ecs/EcsBackend.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import software.amazon.awssdk.services.ecs.model.NetworkMode;
6565
import software.amazon.awssdk.services.ecs.model.PropagateTags;
6666
import software.amazon.awssdk.services.ecs.model.RegisterTaskDefinitionResponse;
67+
import software.amazon.awssdk.services.ecs.model.RepositoryCredentials;
6768
import software.amazon.awssdk.services.ecs.model.RunTaskResponse;
6869
import software.amazon.awssdk.services.ecs.model.RuntimePlatform;
6970
import software.amazon.awssdk.services.ecs.model.Tag;
@@ -108,6 +109,7 @@ public class EcsBackend extends AbstractContainerBackend {
108109
private List<String> securityGroups;
109110
private int totalWaitMs;
110111
private String cluster;
112+
private String defaultRepositoryCredentialsParameter;
111113

112114
@Inject
113115
private IProxySpecProvider proxySpecProvider;
@@ -134,7 +136,8 @@ public void initialize() {
134136
enableCloudWatch = environment.getProperty("proxy.ecs.enable-cloudwatch", Boolean.class, false);
135137
cloudWatchGroupPrefix = environment.getProperty("proxy.ecs.cloud-watch-group-prefix", String.class, "/ecs/");
136138
cloudWatchRegion = environment.getProperty("proxy.ecs.cloud-watch-region", String.class, getProperty(PROPERTY_REGION));
137-
cloudWatchStreamPrefix = environment.getProperty("proxy.ecs.cloud-watch-stream-prefix", String.class, "ecs");
139+
cloudWatchStreamPrefix = environment.getProperty("proxy.ecs.cloud-watch-stream-prefix", String.class, "ecs");
140+
defaultRepositoryCredentialsParameter = environment.getProperty("proxy.ecs.default-repository-credentials-parameter", String.class);
138141

139142
if (cluster == null) {
140143
throw new IllegalStateException("Error in configuration of ECS backend: proxy.ecs.cluster not set to name of cluster");
@@ -242,7 +245,8 @@ public Proxy startContainer(Authentication user, Container initialContainer, Con
242245
if (task.lastStatus().equals("RUNNING")) {
243246
return Retrying.SUCCESS;
244247
} else if (!STARTING_STATES.contains(task.lastStatus()) || !task.desiredStatus().equals("RUNNING")) {
245-
slog.warn(proxy, String.format("ECS container failed: task not running, stopCode: '%s', stoppingAt: '%s', stoppedAt: '%s', stoppedReason: '%s'", task.stopCode(), task.stoppingAt(), task.stoppedAt(), task.stoppedReason()));
248+
slog.warn(proxy, String.format("ECS container failed: task not running, stopCode: '%s', stoppingAt: '%s', stoppedAt: '%s', stoppedReason: '%s'", task.stopCode(), task.stoppingAt(), task.stoppedAt(),
249+
task.stoppedReason()));
246250
return new Retrying.Result(false, false);
247251
}
248252
}
@@ -300,18 +304,24 @@ private String getTaskDefinition(Authentication user, ContainerSpec spec, EcsSpe
300304
// automatically used in the cloudwatch stream name
301305
String containerName = StringUtils.left(spec.getResourceName().getValueOrDefault("sp-container-" + proxy.getId() + "-" + initialContainer.getIndex()), 255);
302306

303-
RegisterTaskDefinitionResponse registerTaskDefinitionResponse = ecsClient.registerTaskDefinition(builder -> builder
307+
ContainerDefinition.Builder containerDefinitionBuilder = ContainerDefinition.builder()
308+
.name(containerName)
309+
.image(spec.getImage().getValue())
310+
.command(spec.getCmd().getValueOrNull())
311+
.environment(env)
312+
.stopTimeout(2)
313+
.dockerLabels(dockerLabels)
314+
.logConfiguration(getLogConfiguration(proxy.getSpecId()))
315+
.mountPoints(volumes.getSecond());
316+
317+
String credentials = specExtension.getEcsRepositoryCredentialsParameter().getValueOrDefault(defaultRepositoryCredentialsParameter);
318+
if (credentials != null && !credentials.isBlank()) {
319+
containerDefinitionBuilder.repositoryCredentials(RepositoryCredentials.builder().credentialsParameter(credentials).build());
320+
}
321+
322+
RegisterTaskDefinitionResponse registerTaskDefinitionResponse = ecsClient.registerTaskDefinition(builder -> builder
304323
.family("sp-task-definition-" + proxy.getId()) // family is a name for the task definition
305-
.containerDefinitions(ContainerDefinition.builder()
306-
.name(containerName)
307-
.image(spec.getImage().getValue())
308-
.command(spec.getCmd().getValueOrNull())
309-
.environment(env)
310-
.stopTimeout(2)
311-
.dockerLabels(dockerLabels)
312-
.logConfiguration(getLogConfiguration(proxy.getSpecId()))
313-
.mountPoints(volumes.getSecond())
314-
.build())
324+
.containerDefinitions(containerDefinitionBuilder.build())
315325
.networkMode(NetworkMode.AWSVPC) // only option when using fargate
316326
.requiresCompatibilities(Compatibility.FARGATE)
317327
.cpu(spec.getCpuRequest().getValue()) // required by fargate

src/main/java/eu/openanalytics/containerproxy/backend/ecs/EcsSpecExtension.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ public class EcsSpecExtension extends AbstractSpecExtension {
6868
@Builder.Default
6969
SpelField.Boolean ecsEnableExecuteCommand = new SpelField.Boolean();
7070

71+
@Builder.Default
72+
SpelField.String ecsRepositoryCredentialsParameter = new SpelField.String();
73+
7174
@Override
7275
public ISpecExtension firstResolve(SpecExpressionResolver resolver, SpecExpressionContext context) {
7376
return toBuilder()
@@ -78,6 +81,7 @@ public ISpecExtension firstResolve(SpecExpressionResolver resolver, SpecExpressi
7881
.ecsEphemeralStorageSize(ecsEphemeralStorageSize.resolve(resolver, context))
7982
.ecsEfsVolumes(ecsEfsVolumes.stream().map(p -> p.resolve(resolver, context)).collect(Collectors.toList()))
8083
.ecsEnableExecuteCommand(ecsEnableExecuteCommand.resolve(resolver, context))
84+
.ecsRepositoryCredentialsParameter(ecsRepositoryCredentialsParameter.resolve(resolver, context))
8185
.build();
8286
}
8387

src/test/java/eu/openanalytics/containerproxy/test/proxy/TestIntegrationOnEcs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public void launchProxyWithRoles() {
155155
LogConfiguration logConfiguration = containerDefinition.logConfiguration();
156156
Assertions.assertNotNull(logConfiguration);
157157
Assertions.assertEquals(LogDriver.AWSLOGS, logConfiguration.logDriver());
158-
Assertions.assertEquals("/ecs/sp-" + proxy.getId(), logConfiguration.options().get("awslogs-group"));
158+
Assertions.assertEquals("/ecs/sp-" + proxy.getSpecId(), logConfiguration.options().get("awslogs-group"));
159159
Assertions.assertEquals(System.getenv("ITEST_ECS_REGION"), logConfiguration.options().get("awslogs-region"));
160160
Assertions.assertEquals("true", logConfiguration.options().get("awslogs-create-group"));
161161
Assertions.assertEquals("ecs", logConfiguration.options().get("awslogs-stream-prefix"));

0 commit comments

Comments
 (0)