From 89b105919a62bf5f8484e5c416da260f6cc1fed1 Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Tue, 10 May 2022 13:13:56 -0400 Subject: [PATCH 1/9] feat: add network config support to kura api's --- .../orchestration/ContainerConfiguration.java | 24 +++++ .../ContainerNetworkConfiguration.java | 102 ++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java index 77d43829eab..338920215a0 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java @@ -23,6 +23,7 @@ import java.util.Objects; import java.util.Optional; +import org.eclipse.kura.container.orchestration.ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder; import org.eclipse.kura.container.orchestration.ImageConfiguration.ImageConfigurationBuilder; import org.osgi.annotation.versioning.ProviderType; @@ -48,6 +49,7 @@ public class ContainerConfiguration { private Map containerLoggerParameters; private String containerLoggingType; private ImageConfiguration imageConfig; + private ContainerNetworkConfiguration networkConfiguration; private ContainerConfiguration() { } @@ -199,6 +201,16 @@ public Optional getRegistryCredentials() { public int getImageDownloadTimeoutSeconds() { return this.imageConfig.getimageDownloadTimeoutSeconds(); } + + /** + * return the container's network configuration as a {@link ContainerNetworkConfiguration}. + * + * @return + * @since 2.7 + */ + public ContainerNetworkConfiguration getContainerNetworkConfiguration() { + return this.networkConfiguration; + } /** * Creates a builder for creating a new {@link ContainerConfiguration} instance. @@ -251,6 +263,7 @@ public static final class ContainerConfigurationBuilder { private Map containerLoggerParameters; private String containerLoggingType; private ImageConfigurationBuilder imageConfigBuilder = new ImageConfiguration.ImageConfigurationBuilder(); + private ContainerNetworkConfigurationBuilder networkConfigurationBuilder = new ContainerNetworkConfigurationBuilder(); public ContainerConfigurationBuilder setContainerName(String serviceName) { this.containerName = serviceName; @@ -321,6 +334,16 @@ public ContainerConfigurationBuilder setImageDownloadTimeoutSeconds(int imageDow this.imageConfigBuilder.setImageDownloadTimeoutSeconds(imageDownloadTimeoutSeconds); return this; } + + /** + * Set the {@link NetworkConfiguration} + * + * @since 2.7 + */ + public ContainerConfigurationBuilder setContainerNetowrkConfiguration(ContainerNetworkConfiguration networkConfiguration) { + this.networkConfigurationBuilder.setNetworkMode(networkConfiguration.getNetworkMode()); + return this; + } /** * Set the {@link ImageConfiguration} @@ -349,6 +372,7 @@ public ContainerConfiguration build() { result.containerLoggerParameters = this.containerLoggerParameters; result.containerLoggingType = this.containerLoggingType; result.imageConfig = this.imageConfigBuilder.build(); + result.networkConfiguration = this.networkConfigurationBuilder.build(); return result; } diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java new file mode 100644 index 00000000000..64a7653dd66 --- /dev/null +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2022 Eurotech and/or its affiliates and others + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Eurotech + *******************************************************************************/ + +package org.eclipse.kura.container.orchestration; + +import static java.util.Objects.requireNonNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import org.eclipse.kura.container.orchestration.ImageConfiguration.ImageConfigurationBuilder; +import org.osgi.annotation.versioning.ProviderType; + +/** + * Object which represents a container network configuration used to when + * requesting the generation of a new container instance. + * + * @noimplement This interface is not intended to be implemented by clients. + * @since 2.7 + * + */ +@ProviderType +public class ContainerNetworkConfiguration { + + private String networkMode; + + private ContainerNetworkConfiguration() { + } + + /** + * + * returns the network mode a container will be created with. supported modes + * include: 'bridge', 'none', 'container:', 'host'. + * + * @return + */ + public String getNetworkMode() { + return this.networkMode; + } + + /** + * Creates a builder for creating a new {@link ContainerNetworkConfiguration} + * instance. + * + * @return the builder. + */ + public static ContainerNetworkConfigurationBuilder builder() { + return new ContainerNetworkConfigurationBuilder(); + } + + @Override + public int hashCode() { + return Objects.hash(this.networkMode); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof ContainerNetworkConfiguration)) { + return false; + } + ContainerNetworkConfiguration other = (ContainerNetworkConfiguration) obj; + return Objects.equals(this.networkMode, other.networkMode); + } + + public static final class ContainerNetworkConfigurationBuilder { + + private String networkMode = "bridge"; + + public ContainerNetworkConfigurationBuilder setNetworkMode(String networkMode) { + this.networkMode = networkMode; + return this; + } + + public ContainerNetworkConfiguration build() { + ContainerNetworkConfiguration result = new ContainerNetworkConfiguration(); + + result.networkMode = requireNonNull(this.networkMode, + "Requested Container Network Mode Name cannot be null"); + + return result; + } + + } +} From b39809c063b8723b24419ba264a1a418cc944564 Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Tue, 10 May 2022 13:55:39 -0400 Subject: [PATCH 2/9] feat: add network config support to container orch impl --- .../ContainerOrchestrationServiceImpl.java | 27 +++++++++++++++++++ ...a.container.provider.ContainerInstance.xml | 11 ++++++++ .../provider/ContainerInstanceOptions.java | 19 ++++++++++--- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java b/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java index 69032a22904..97b30aa2cbf 100644 --- a/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java +++ b/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java @@ -448,6 +448,8 @@ private String createContainer(ContainerConfiguration containerDescription) thro configuration = containerLogConfigurationHandler(containerDescription, configuration); + configuration = containerNetworkConfigurationHandler(containerDescription, configuration); + if (containerDescription.isContainerPrivileged()) { configuration = configuration.withPrivileged(containerDescription.isContainerPrivileged()); } @@ -519,6 +521,31 @@ private HostConfig containerLogConfigurationHandler(ContainerConfiguration conta return configuration; } + private HostConfig containerNetworkConfigurationHandler(ContainerConfiguration containerDescription, + HostConfig configuration) { + + String networkMode; + + switch (containerDescription.getContainerNetworkConfiguration().getNetworkMode().toLowerCase().trim()) { + case "none": + networkMode = "none"; + break; + case "container": + networkMode = "container"; + break; + case "host": + networkMode = "host"; + break; + default: + networkMode = "bridge"; + break; + } + + configuration.withNetworkMode(networkMode); + + return configuration; + } + private HostConfig containerPortManagementHandler(ContainerConfiguration containerDescription, HostConfig commandBuilder) { diff --git a/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml b/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml index 31b1e411f4d..13d794caa43 100644 --- a/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml +++ b/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml @@ -102,6 +102,17 @@ type="String" cardinality="1" required="false" default="" /> + + + REGISTRY_PASSWORD = new Property<>("registry.password", ""); private static final Property IMAGES_DOWNLOAD_TIMEOUT = new Property<>("container.image.download.timeout", 500); + private static final Property CONTAINER_NETWORKING_MODE = new Property<>("container.networkMode", "bridge"); private final boolean enabled; private final String image; @@ -74,6 +76,7 @@ public class ContainerInstanceOptions { private final Optional registryUsername; private final Optional registryPassword; private final int imageDownloadTimeout; + private final String containerNetworkingMode; public ContainerInstanceOptions(final Map properties) { if (isNull(properties)) { @@ -99,6 +102,7 @@ public ContainerInstanceOptions(final Map properties) { this.registryUsername = REGISTRY_USERNAME.getOptional(properties); this.registryPassword = REGISTRY_PASSWORD.getOptional(properties); this.imageDownloadTimeout = IMAGES_DOWNLOAD_TIMEOUT.get(properties); + this.containerNetworkingMode = CONTAINER_NETWORKING_MODE.get(properties); } private Map parseVolume(String volumeString) { @@ -223,6 +227,10 @@ public String getLoggingType() { public Map getLoggerParameters() { return this.containerLoggingParameters; } + + public String getContainerNetworkingMode() { + return this.containerNetworkingMode; + } public Optional getRegistryCredentials() { if (this.registryUsername.isPresent() && this.registryPassword.isPresent()) { @@ -236,6 +244,10 @@ public Optional getRegistryCredentials() { public int getImageDownloadTimeout() { return this.imageDownloadTimeout; } + + private ContainerNetworkConfiguration buildContainerNetworkConfig() { + return new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder().setNetworkMode(getContainerNetworkingMode()).build(); + } private ImageConfiguration buildImageConfig() { return new ImageConfiguration.ImageConfigurationBuilder().setImageName(image).setImageTag(imageTag) @@ -249,7 +261,7 @@ public ContainerConfiguration getContainerConfiguration() { .setInternalPorts(getContainerPortsInternal()).setEnvVars(getContainerEnvList()) .setVolumes(getContainerVolumeList()).setPrivilegedMode(this.privilegedMode) .setDeviceList(getContainerDeviceList()).setFrameworkManaged(true).setLoggingType(getLoggingType()) - .setLoggerParameters(getLoggerParameters()).build(); + .setLoggerParameters(getLoggerParameters()).setContainerNetowrkConfiguration(buildContainerNetworkConfig()).build(); } private List parsePortString(String ports) { @@ -271,7 +283,7 @@ public int hashCode() { this.containerLoggingParameters, this.containerName, this.containerVolumeString, this.containerVolumes, this.enabled, this.externalPorts, this.image, this.imageDownloadTimeout, this.imageTag, this.internalPorts, this.maxDownloadRetries, this.privilegedMode, this.registryPassword, - this.registryURL, this.registryUsername, this.retryInterval); + this.registryURL, this.registryUsername, this.retryInterval, this.containerNetworkingMode); } @Override @@ -298,7 +310,8 @@ public boolean equals(Object obj) { && Objects.equals(this.registryPassword, other.registryPassword) && Objects.equals(this.registryURL, other.registryURL) && Objects.equals(this.registryUsername, other.registryUsername) - && this.retryInterval == other.retryInterval; + && this.retryInterval == other.retryInterval + && Objects.equals(this.containerNetworkingMode, other.containerNetworkingMode); } } \ No newline at end of file From f12b6bfec733e56f463c94c5e4f891d02cf68c9f Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Thu, 12 May 2022 09:03:40 -0400 Subject: [PATCH 3/9] fix: added lint fixes - and minor implimentation changes --- .../orchestration/ContainerConfiguration.java | 10 +++++---- .../ContainerNetworkConfiguration.java | 7 ------- .../ContainerOrchestrationServiceImpl.java | 21 +++++-------------- ...a.container.provider.ContainerInstance.xml | 10 +++------ .../container/provider/ContainerInstance.java | 2 +- .../provider/ContainerInstanceOptions.java | 10 +++++---- 6 files changed, 21 insertions(+), 39 deletions(-) diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java index 338920215a0..481a12d61bf 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java @@ -201,9 +201,10 @@ public Optional getRegistryCredentials() { public int getImageDownloadTimeoutSeconds() { return this.imageConfig.getimageDownloadTimeoutSeconds(); } - + /** - * return the container's network configuration as a {@link ContainerNetworkConfiguration}. + * return the container's network configuration as a + * {@link ContainerNetworkConfiguration}. * * @return * @since 2.7 @@ -334,13 +335,14 @@ public ContainerConfigurationBuilder setImageDownloadTimeoutSeconds(int imageDow this.imageConfigBuilder.setImageDownloadTimeoutSeconds(imageDownloadTimeoutSeconds); return this; } - + /** * Set the {@link NetworkConfiguration} * * @since 2.7 */ - public ContainerConfigurationBuilder setContainerNetowrkConfiguration(ContainerNetworkConfiguration networkConfiguration) { + public ContainerConfigurationBuilder setContainerNetowrkConfiguration( + ContainerNetworkConfiguration networkConfiguration) { this.networkConfigurationBuilder.setNetworkMode(networkConfiguration.getNetworkMode()); return this; } diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java index 64a7653dd66..f1a6ef165e2 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java @@ -15,15 +15,8 @@ import static java.util.Objects.requireNonNull; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.Optional; -import org.eclipse.kura.container.orchestration.ImageConfiguration.ImageConfigurationBuilder; import org.osgi.annotation.versioning.ProviderType; /** diff --git a/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java b/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java index 97b30aa2cbf..6e6f3b06ac9 100644 --- a/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java +++ b/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java @@ -524,24 +524,13 @@ private HostConfig containerLogConfigurationHandler(ContainerConfiguration conta private HostConfig containerNetworkConfigurationHandler(ContainerConfiguration containerDescription, HostConfig configuration) { - String networkMode; - - switch (containerDescription.getContainerNetworkConfiguration().getNetworkMode().toLowerCase().trim()) { - case "none": - networkMode = "none"; - break; - case "container": - networkMode = "container"; - break; - case "host": - networkMode = "host"; - break; - default: - networkMode = "bridge"; - break; + if (containerDescription.getContainerNetworkConfiguration().getNetworkMode() == null + || containerDescription.getContainerNetworkConfiguration().getNetworkMode().trim().isEmpty()) { + return configuration; } - configuration.withNetworkMode(networkMode); + configuration.withNetworkMode( + containerDescription.getContainerNetworkConfiguration().getNetworkMode().toLowerCase().trim()); return configuration; } diff --git a/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml b/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml index 13d794caa43..422b3b0cce5 100644 --- a/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml +++ b/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml @@ -104,13 +104,9 @@ - update) { this.state = newState; } - + private Optional getExistingContainer(final String containerName) { return containerOrchestrationService.listContainerDescriptors().stream() .filter(c -> c.getContainerName().equals(containerName)).findAny(); diff --git a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java index ba6b2c343fc..59bede191f7 100644 --- a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java +++ b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java @@ -227,7 +227,7 @@ public String getLoggingType() { public Map getLoggerParameters() { return this.containerLoggingParameters; } - + public String getContainerNetworkingMode() { return this.containerNetworkingMode; } @@ -244,9 +244,10 @@ public Optional getRegistryCredentials() { public int getImageDownloadTimeout() { return this.imageDownloadTimeout; } - + private ContainerNetworkConfiguration buildContainerNetworkConfig() { - return new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder().setNetworkMode(getContainerNetworkingMode()).build(); + return new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder() + .setNetworkMode(getContainerNetworkingMode()).build(); } private ImageConfiguration buildImageConfig() { @@ -261,7 +262,8 @@ public ContainerConfiguration getContainerConfiguration() { .setInternalPorts(getContainerPortsInternal()).setEnvVars(getContainerEnvList()) .setVolumes(getContainerVolumeList()).setPrivilegedMode(this.privilegedMode) .setDeviceList(getContainerDeviceList()).setFrameworkManaged(true).setLoggingType(getLoggingType()) - .setLoggerParameters(getLoggerParameters()).setContainerNetowrkConfiguration(buildContainerNetworkConfig()).build(); + .setLoggerParameters(getLoggerParameters()) + .setContainerNetowrkConfiguration(buildContainerNetworkConfig()).build(); } private List parsePortString(String ports) { From f26225cc390c6d4e544de35b893de1c22232f983 Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Thu, 12 May 2022 13:19:33 -0400 Subject: [PATCH 4/9] fix: removed requirement on container ports. Ports can now be left empty --- .../org.eclipse.kura.container.provider.ContainerInstance.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml b/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml index 422b3b0cce5..0801b7e2b1e 100644 --- a/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml +++ b/kura/org.eclipse.kura.container.provider/OSGI-INF/metatype/org.eclipse.kura.container.provider.ContainerInstance.xml @@ -75,12 +75,12 @@ Date: Thu, 12 May 2022 13:52:30 -0400 Subject: [PATCH 5/9] test: added test coverage for the new class --- .../kura/container/provider/ContainerInstanceOptions.java | 2 +- .../orchestration/provider/ContainerConfigurationTest.java | 3 ++- .../container/provider/ContainerInstanceOptionsTest.java | 6 ++++++ .../kura/container/provider/ContainerInstanceTest.java | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java index 59bede191f7..c7cfc8fd288 100644 --- a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java +++ b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java @@ -55,7 +55,7 @@ public class ContainerInstanceOptions { private static final Property REGISTRY_PASSWORD = new Property<>("registry.password", ""); private static final Property IMAGES_DOWNLOAD_TIMEOUT = new Property<>("container.image.download.timeout", 500); - private static final Property CONTAINER_NETWORKING_MODE = new Property<>("container.networkMode", "bridge"); + private static final Property CONTAINER_NETWORKING_MODE = new Property<>("container.networkMode", ""); private final boolean enabled; private final String image; diff --git a/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java b/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java index bcf5fada3aa..54df5dfbd04 100644 --- a/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java +++ b/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java @@ -26,6 +26,7 @@ import org.eclipse.kura.configuration.Password; import org.eclipse.kura.container.orchestration.ContainerConfiguration; import org.eclipse.kura.container.orchestration.ContainerConfiguration.ContainerConfigurationBuilder; +import org.eclipse.kura.container.orchestration.ContainerNetworkConfiguration; import org.eclipse.kura.container.orchestration.ImageConfiguration; import org.eclipse.kura.container.orchestration.PasswordRegistryCredentials; import org.junit.Test; @@ -132,7 +133,7 @@ REGISTRY_USERNAME, new Password(REGISTRY_PASSWORD)))) .setInternalPorts(CONTAINER_PORTS_INTERNAL).setEnvVars(CONTAINER_ENV_VARS) .setDeviceList(CONTAINER_DEVICE_LIST).setVolumes(CONTAINER_VOLUMES).setPrivilegedMode(false) .setFrameworkManaged(false).setLoggerParameters(CONTAINER_LOGGER_PARAMETERS) - .setLoggingType(CONTAINER_LOGGER_TYPE); + .setLoggingType(CONTAINER_LOGGER_TYPE).setContainerNetowrkConfiguration(new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder().setNetworkMode("bridge").build()); } private void givenContainerOne() { diff --git a/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceOptionsTest.java b/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceOptionsTest.java index e9a0ade7ffe..89597fd316e 100644 --- a/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceOptionsTest.java +++ b/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceOptionsTest.java @@ -27,6 +27,7 @@ import org.eclipse.kura.container.orchestration.ContainerConfiguration; import org.eclipse.kura.container.orchestration.PasswordRegistryCredentials; +import org.eclipse.kura.util.configuration.Property; import org.junit.Test; public class ContainerInstanceOptionsTest { @@ -50,6 +51,7 @@ public class ContainerInstanceOptionsTest { private static final String DEFAULT_REGISTRY_USERNAME = ""; private static final String DEFAULT_REGISTRY_PASSWORD = ""; private static final int DEFAULT_IMAGES_DOWNLOAD_TIMEOUT = 500; + private static final String DEFAULT_CONTAINER_NETWORKING_MODE = ""; private static final String CONTAINER_ENV = "container.env"; private static final String CONTAINER_PORTS_INTERNAL = "container.ports.internal"; @@ -69,6 +71,8 @@ public class ContainerInstanceOptionsTest { private static final String REGISTRY_USERNAME = "registry.username"; private static final String REGISTRY_PASSWORD = "registry.password"; private static final String IMAGES_DOWNLOAD_TIMEOUT = "container.image.download.timeout"; + private static final String CONTAINER_NETWORKING_MODE = "container.networkMode"; + private Map properties; @@ -639,6 +643,7 @@ private void givenDefaultProperties() { this.properties.put(REGISTRY_USERNAME, DEFAULT_REGISTRY_USERNAME); this.properties.put(REGISTRY_PASSWORD, DEFAULT_REGISTRY_PASSWORD); this.properties.put(IMAGES_DOWNLOAD_TIMEOUT, DEFAULT_IMAGES_DOWNLOAD_TIMEOUT); + this.properties.put(CONTAINER_NETWORKING_MODE, DEFAULT_CONTAINER_NETWORKING_MODE); } private void givenDifferentProperties() { @@ -659,6 +664,7 @@ private void givenDifferentProperties() { this.newProperties.put(REGISTRY_USERNAME, "test"); this.newProperties.put(REGISTRY_PASSWORD, "test"); this.newProperties.put(IMAGES_DOWNLOAD_TIMEOUT, 100); + this.newProperties.put(CONTAINER_NETWORKING_MODE, "none"); } private void givenConfigurableGenericDockerServiceOptions() { diff --git a/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceTest.java b/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceTest.java index ab5a32b2c7b..4a4c1168ccc 100644 --- a/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceTest.java +++ b/kura/test/org.eclipse.kura.container.provider.test/src/test/java/org/eclipse/kura/container/provider/ContainerInstanceTest.java @@ -48,6 +48,7 @@ public class ContainerInstanceTest { private static final String CONTAINER_DEVICE = "container.Device"; private static final String CONTAINER_LOGGER_PARAMETERS = "container.loggerParameters"; private static final String CONTAINER_LOGGING_TYPE = "container.loggingType"; + private static final String CONTAINER_NETWORKING_MODE = "container.networkMode"; private ContainerOrchestrationService dockerService; private Map properties; @@ -199,6 +200,7 @@ private void givenFullProperties(boolean enabled) { this.properties.put(CONTAINER_DEVICE, ""); this.properties.put(CONTAINER_LOGGER_PARAMETERS, ""); this.properties.put(CONTAINER_LOGGING_TYPE, "default"); + this.properties.put(CONTAINER_NETWORKING_MODE, ""); } private void givenConfigurableGenericDockerService() { From f8fe65a1be5b90c0b231728d488e05321dbf2d4c Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Fri, 13 May 2022 09:34:14 -0400 Subject: [PATCH 6/9] fix: api versioning to match api package --- .../container/orchestration/ContainerConfiguration.java | 6 +++--- .../orchestration/ContainerNetworkConfiguration.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java index c96b8cec764..156b023b0f0 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerConfiguration.java @@ -208,7 +208,7 @@ public int getImageDownloadTimeoutSeconds() { * {@link ContainerNetworkConfiguration}. * * @return - * @since 2.7 + * @since 2.4 */ public ContainerNetworkConfiguration getContainerNetworkConfiguration() { return this.networkConfiguration; @@ -218,7 +218,7 @@ public ContainerNetworkConfiguration getContainerNetworkConfiguration() { * Returns a List of container entry points. An empty list can be returned if no entrypoints are specified. * * @return - * @since 2.6 + * @since 2.4 */ public List getEntryPoint() { return this.entryPoint; @@ -358,7 +358,7 @@ public ContainerConfigurationBuilder setEntryPoint(List entryPoint) { /** * Set the {@link NetworkConfiguration} * - * @since 2.7 + * @since 2.4 */ public ContainerConfigurationBuilder setContainerNetowrkConfiguration( ContainerNetworkConfiguration networkConfiguration) { diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java index f1a6ef165e2..243c8b2661f 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java @@ -24,7 +24,7 @@ * requesting the generation of a new container instance. * * @noimplement This interface is not intended to be implemented by clients. - * @since 2.7 + * @since 2.4 * */ @ProviderType From 49699efdba888143cd0c663d62fb64ebc1692780 Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Mon, 16 May 2022 10:34:38 -0400 Subject: [PATCH 7/9] fix: turned networkMode into a optional string --- .../ContainerNetworkConfiguration.java | 9 +++++---- .../impl/ContainerOrchestrationServiceImpl.java | 10 ++++------ .../provider/ContainerInstanceOptions.java | 13 ++++++------- .../provider/ContainerConfigurationTest.java | 4 +++- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java index 243c8b2661f..33c5e4cc472 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java @@ -16,6 +16,7 @@ import static java.util.Objects.requireNonNull; import java.util.Objects; +import java.util.Optional; import org.osgi.annotation.versioning.ProviderType; @@ -30,7 +31,7 @@ @ProviderType public class ContainerNetworkConfiguration { - private String networkMode; + private Optional networkMode; private ContainerNetworkConfiguration() { } @@ -42,7 +43,7 @@ private ContainerNetworkConfiguration() { * * @return */ - public String getNetworkMode() { + public Optional getNetworkMode() { return this.networkMode; } @@ -75,9 +76,9 @@ public boolean equals(Object obj) { public static final class ContainerNetworkConfigurationBuilder { - private String networkMode = "bridge"; + private Optional networkMode = Optional.empty(); - public ContainerNetworkConfigurationBuilder setNetworkMode(String networkMode) { + public ContainerNetworkConfigurationBuilder setNetworkMode(Optional networkMode) { this.networkMode = networkMode; return this; } diff --git a/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java b/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java index 425140b5a01..9b6f169bdfa 100644 --- a/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java +++ b/kura/org.eclipse.kura.container.orchestration.provider/src/main/java/org/eclipse/kura/container/orchestration/provider/impl/ContainerOrchestrationServiceImpl.java @@ -534,14 +534,12 @@ private HostConfig containerLogConfigurationHandler(ContainerConfiguration conta private HostConfig containerNetworkConfigurationHandler(ContainerConfiguration containerDescription, HostConfig configuration) { - if (containerDescription.getContainerNetworkConfiguration().getNetworkMode() == null - || containerDescription.getContainerNetworkConfiguration().getNetworkMode().trim().isEmpty()) { - return configuration; + if (containerDescription.getContainerNetworkConfiguration().getNetworkMode().isPresent() + && !containerDescription.getContainerNetworkConfiguration().getNetworkMode().get().trim().isEmpty()) { + configuration.withNetworkMode(containerDescription.getContainerNetworkConfiguration().getNetworkMode().get() + .toLowerCase().trim()); } - configuration.withNetworkMode( - containerDescription.getContainerNetworkConfiguration().getNetworkMode().toLowerCase().trim()); - return configuration; } diff --git a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java index 5eabf73cad5..ab762c83d5c 100644 --- a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java +++ b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java @@ -166,7 +166,7 @@ private List parseStringListSplitByComma(String stringToSplit) { for (String entry : stringToSplit.trim().split(",")) { if (entry.trim().length() > 0) { - stringList.add(entry.trim()); + stringList.add(entry.trim()); } } @@ -252,9 +252,9 @@ public int getImageDownloadTimeout() { private ContainerNetworkConfiguration buildContainerNetworkConfig() { return new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder() - .setNetworkMode(getContainerNetworkingMode()).build(); + .setNetworkMode(Optional.of(getContainerNetworkingMode())).build(); } - + public List getEntryPoint() { return this.containerEntryPoint; } @@ -272,8 +272,7 @@ public ContainerConfiguration getContainerConfiguration() { .setVolumes(getContainerVolumeList()).setPrivilegedMode(this.privilegedMode) .setDeviceList(getContainerDeviceList()).setFrameworkManaged(true).setLoggingType(getLoggingType()) .setContainerNetowrkConfiguration(buildContainerNetworkConfig()) - .setLoggerParameters(getLoggerParameters()) - .setEntryPoint(getEntryPoint()).build(); + .setLoggerParameters(getLoggerParameters()).setEntryPoint(getEntryPoint()).build(); } private List parsePortString(String ports) { @@ -295,8 +294,8 @@ public int hashCode() { this.containerLoggingParameters, this.containerName, this.containerVolumeString, this.containerVolumes, this.enabled, this.externalPorts, this.image, this.imageDownloadTimeout, this.imageTag, this.internalPorts, this.maxDownloadRetries, this.privilegedMode, this.registryPassword, - this.registryURL, this.registryUsername, this.retryInterval, - this.containerEntryPoint, this.containerNetworkingMode); + this.registryURL, this.registryUsername, this.retryInterval, this.containerEntryPoint, + this.containerNetworkingMode); } @Override diff --git a/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java b/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java index 54df5dfbd04..ed1d163c785 100644 --- a/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java +++ b/kura/test/org.eclipse.kura.container.orchestration.provider.test/src/test/java/org/eclipse/kura/container/orchestration/provider/ContainerConfigurationTest.java @@ -133,7 +133,9 @@ REGISTRY_USERNAME, new Password(REGISTRY_PASSWORD)))) .setInternalPorts(CONTAINER_PORTS_INTERNAL).setEnvVars(CONTAINER_ENV_VARS) .setDeviceList(CONTAINER_DEVICE_LIST).setVolumes(CONTAINER_VOLUMES).setPrivilegedMode(false) .setFrameworkManaged(false).setLoggerParameters(CONTAINER_LOGGER_PARAMETERS) - .setLoggingType(CONTAINER_LOGGER_TYPE).setContainerNetowrkConfiguration(new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder().setNetworkMode("bridge").build()); + .setLoggingType(CONTAINER_LOGGER_TYPE).setContainerNetowrkConfiguration( + new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder() + .setNetworkMode(Optional.of("bridge")).build()); } private void givenContainerOne() { From 118b7dfda39dc24b1aaab0e1ba719b2b0b9d334c Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Mon, 16 May 2022 10:49:09 -0400 Subject: [PATCH 8/9] fix: changed .get .getOptional --- .../kura/container/provider/ContainerInstanceOptions.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java index ab762c83d5c..0b2711604be 100644 --- a/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java +++ b/kura/org.eclipse.kura.container.provider/src/main/java/org/eclipse/kura/container/provider/ContainerInstanceOptions.java @@ -77,7 +77,7 @@ public class ContainerInstanceOptions { private final Optional registryUsername; private final Optional registryPassword; private final int imageDownloadTimeout; - private final String containerNetworkingMode; + private final Optional containerNetworkingMode; private final List containerEntryPoint; public ContainerInstanceOptions(final Map properties) { @@ -104,7 +104,7 @@ public ContainerInstanceOptions(final Map properties) { this.registryUsername = REGISTRY_USERNAME.getOptional(properties); this.registryPassword = REGISTRY_PASSWORD.getOptional(properties); this.imageDownloadTimeout = IMAGES_DOWNLOAD_TIMEOUT.get(properties); - this.containerNetworkingMode = CONTAINER_NETWORKING_MODE.get(properties); + this.containerNetworkingMode = CONTAINER_NETWORKING_MODE.getOptional(properties); this.containerEntryPoint = parseStringListSplitByComma(CONTAINER_ENTRY_POINT.get(properties)); } @@ -233,7 +233,7 @@ public Map getLoggerParameters() { return this.containerLoggingParameters; } - public String getContainerNetworkingMode() { + public Optional getContainerNetworkingMode() { return this.containerNetworkingMode; } @@ -252,7 +252,7 @@ public int getImageDownloadTimeout() { private ContainerNetworkConfiguration buildContainerNetworkConfig() { return new ContainerNetworkConfiguration.ContainerNetworkConfigurationBuilder() - .setNetworkMode(Optional.of(getContainerNetworkingMode())).build(); + .setNetworkMode(getContainerNetworkingMode()).build(); } public List getEntryPoint() { From 7c435dd05d5819958cf4bc7276cdd502b5378765 Mon Sep 17 00:00:00 2001 From: Gregory Ivo Date: Mon, 16 May 2022 12:29:10 -0400 Subject: [PATCH 9/9] fix: networkMode javaDoc refractor --- .../orchestration/ContainerNetworkConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java index 33c5e4cc472..77370f40354 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/container/orchestration/ContainerNetworkConfiguration.java @@ -38,8 +38,8 @@ private ContainerNetworkConfiguration() { /** * - * returns the network mode a container will be created with. supported modes - * include: 'bridge', 'none', 'container:', 'host'. + * Returns the network mode a container will be created with (e.g. 'bridge', + * 'none', 'container:', 'host'). * * @return */