From 3cff070a65196abf0c3035e9e498e01e4291f8f4 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Sat, 24 Dec 2022 00:09:19 +0530 Subject: [PATCH] feat (kubernetes-client) : Add DSL support for creating ConfigMap from file (#4184) Signed-off-by: Rohan Kumar --- .../kubernetes/client/KubernetesClient.java | 3 +- .../NamespacedKubernetesClientAdapter.java | 3 +- .../client/dsl/ConfigMapResource.java | 7 ++ .../client/dsl/FromFileCreatable.java | 11 ++ .../client/utils/KubernetesResourceUtil.java | 103 ++++++++++++++++++ .../resourcelock/ConfigMapLockTest.java | 14 ++- .../core/v1/ConfigMapOperationsImpl.java | 54 +++++++++ .../client/impl/KubernetesClientImpl.java | 7 +- .../client/impl/ConfigMapFromFileTest.java | 66 +++++++++++ .../configmap-from-file/game.properties | 7 ++ .../configmap-from-file/ui.properties | 4 + .../kubernetes/client/mock/ConfigMapTest.java | 4 +- .../server/mock/NamespacedItemTest.java | 3 +- 13 files changed, 273 insertions(+), 13 deletions(-) create mode 100644 kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ConfigMapResource.java create mode 100644 kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/FromFileCreatable.java create mode 100644 kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/ConfigMapOperationsImpl.java create mode 100644 kubernetes-client/src/test/java/io/fabric8/kubernetes/client/impl/ConfigMapFromFileTest.java create mode 100644 kubernetes-client/src/test/resources/configmap-from-file/game.properties create mode 100644 kubernetes-client/src/test/resources/configmap-from-file/ui.properties diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/KubernetesClient.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/KubernetesClient.java index 6d2f84ab984..8cd70fd2bda 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/KubernetesClient.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/KubernetesClient.java @@ -64,6 +64,7 @@ import io.fabric8.kubernetes.client.dsl.AutoscalingAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.BatchAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.CertificatesAPIGroupDSL; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; import io.fabric8.kubernetes.client.dsl.DiscoveryAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.EventingAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.ExtensionsAPIGroupDSL; @@ -450,7 +451,7 @@ NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable resourc * * @return MixedOperation object for ConfigMap related operations. */ - MixedOperation> configMaps(); + MixedOperation configMaps(); /** * API entrypoint for LimitRange related operations. LimitRange (core/v1) diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/NamespacedKubernetesClientAdapter.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/NamespacedKubernetesClientAdapter.java index 7bd8982778a..c2b89346f32 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/NamespacedKubernetesClientAdapter.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/NamespacedKubernetesClientAdapter.java @@ -64,6 +64,7 @@ import io.fabric8.kubernetes.client.dsl.AutoscalingAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.BatchAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.CertificatesAPIGroupDSL; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; import io.fabric8.kubernetes.client.dsl.DiscoveryAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.EventingAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.ExtensionsAPIGroupDSL; @@ -354,7 +355,7 @@ public NonNamespaceOperation> a } @Override - public MixedOperation> configMaps() { + public MixedOperation configMaps() { return getClient().configMaps(); } diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ConfigMapResource.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ConfigMapResource.java new file mode 100644 index 00000000000..dcb0bdb9302 --- /dev/null +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/ConfigMapResource.java @@ -0,0 +1,7 @@ +package io.fabric8.kubernetes.client.dsl; + +import io.fabric8.kubernetes.api.model.ConfigMap; + +public interface ConfigMapResource extends Resource, + FromFileCreatable> { +} diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/FromFileCreatable.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/FromFileCreatable.java new file mode 100644 index 00000000000..c2d3d7f1412 --- /dev/null +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/dsl/FromFileCreatable.java @@ -0,0 +1,11 @@ +package io.fabric8.kubernetes.client.dsl; + +public interface FromFileCreatable { + /** + * Create new ConfigMap from a directory or file contents. + * + * @param dirOrFilePath a file or directory path + * @return {@link Resource for operations to do with this ConfigMap + */ + T fromFile(String dirOrFilePath); +} diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/KubernetesResourceUtil.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/KubernetesResourceUtil.java index bf74d5a48b4..aad0de7a59a 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/KubernetesResourceUtil.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/utils/KubernetesResourceUtil.java @@ -18,6 +18,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import io.fabric8.kubernetes.api.builder.VisitableBuilder; +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ConfigMapBuilder; import io.fabric8.kubernetes.api.model.DefaultKubernetesResourceList; import io.fabric8.kubernetes.api.model.EnvVar; import io.fabric8.kubernetes.api.model.EnvVarBuilder; @@ -31,9 +33,18 @@ import io.fabric8.kubernetes.api.model.SecretBuilder; import io.fabric8.kubernetes.client.readiness.Readiness; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.CodingErrorAction; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.Paths; import java.time.Duration; import java.time.Instant; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.Base64; import java.util.Collections; @@ -43,6 +54,7 @@ import java.util.List; import java.util.Map; import java.util.regex.Pattern; +import java.util.stream.Stream; public class KubernetesResourceUtil { private KubernetesResourceUtil() { @@ -457,6 +469,97 @@ public static Secret createDockerRegistrySecret(String dockerServer, String user return createDockerSecret(secretName, dockerConfigAsStr); } + /** + * Create New ConfigMap from a file or a directory + * + * @param name name of the ConfigMap + * @param key (optional) if it's a file key for ConfigMap entry + * @param dirOrFilePath file or directory path + * @return a ConfigMap object + * @throws IOException in case of error while reading file + */ + public static ConfigMap createNewConfigMapFromDirOrFile(final String name, final String key, + final String dirOrFilePath) throws IOException { + final Path path = Paths.get(dirOrFilePath); + + if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) { + ConfigMapBuilder configMapBuilder = new ConfigMapBuilder() + .withNewMetadata().withName(name).endMetadata(); + addConfigMapEntriesFromDirectoryToExistingConfigMap(configMapBuilder, path); + return configMapBuilder.build(); + } else { + return createNewConfigMapFromFile(name, key, path); + } + } + + /** + * Create new ConfigMap from file contents + * @param name name of ConfigMap + * @param key key + * @param file file whose content would be used in ConfigMap entry + * @return a ConfigMap with data containing file contents + * @throws IOException in case of error while reading file + */ + public static ConfigMap createNewConfigMapFromFile(final String name, final String key, final Path file) + throws IOException { + ConfigMapBuilder configMapBuilder = new ConfigMapBuilder(); + configMapBuilder.withNewMetadata().withName(name).endMetadata(); + Map.Entry configMapEntry = createConfigMapEntry(key, file); + addConfigMapEntry(configMapBuilder, configMapEntry, file); + return configMapBuilder.build(); + } + + + /** + * Create a ConfigMap entry based on file contents + * @param key key for entry + * @param file file path whose contents would be used in value of entry + * @return an entry containing key and value + * @throws IOException in case of error while reading file + */ + public static Map.Entry createConfigMapEntry(final String key, final Path file) throws IOException { + final byte[] bytes = Files.readAllBytes(file); + if (isFileWithBinaryContent(file)) { + final String value = Base64.getEncoder().encodeToString(bytes); + return new AbstractMap.SimpleEntry<>(key, value); + } else { + return new AbstractMap.SimpleEntry<>(key, new String(bytes)); + } + } + + public static boolean isFileWithBinaryContent(final Path file) throws IOException { + final byte[] bytes = Files.readAllBytes(file); + try { + StandardCharsets.UTF_8.newDecoder() + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT) + .decode(ByteBuffer.wrap(bytes)); + return false; + } catch (CharacterCodingException e) { + return true; + } + } + + public static void addConfigMapEntriesFromDirectoryToExistingConfigMap(ConfigMapBuilder configMapBuilder, final Path path) throws IOException { + try (Stream files = Files.list(path)) { + files.filter(p -> !Files.isDirectory(p, LinkOption.NOFOLLOW_LINKS)).forEach(file -> { + try { + addConfigMapEntry(configMapBuilder, createConfigMapEntry(file.getFileName().toString(), file), file); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + }); + } + } + + public static void addConfigMapEntry(ConfigMapBuilder configMapBuilder, Map.Entry entry, final Path file) throws IOException { + if (isFileWithBinaryContent(file)) { + configMapBuilder.addToBinaryData(entry.getKey(), entry.getValue()); + } else { + configMapBuilder.addToData(entry.getKey(), entry.getValue()); + } + } + private static Map createDockerRegistryConfigMap(String dockerServer, String username, String password) { Map dockerConfigMap = new HashMap<>(); Map auths = new HashMap<>(); diff --git a/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/extended/leaderelection/resourcelock/ConfigMapLockTest.java b/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/extended/leaderelection/resourcelock/ConfigMapLockTest.java index a6f2bb8bc47..2867462e34f 100644 --- a/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/extended/leaderelection/resourcelock/ConfigMapLockTest.java +++ b/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/extended/leaderelection/resourcelock/ConfigMapLockTest.java @@ -20,15 +20,14 @@ import io.fabric8.kubernetes.api.model.ConfigMapList; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.ReplaceDeletable; -import io.fabric8.kubernetes.client.dsl.Resource; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; import org.mockito.Answers; -import org.mockito.ArgumentMatchers; import org.mockito.Mockito; import java.time.Duration; @@ -52,16 +51,19 @@ class ConfigMapLockTest { private KubernetesClient kc; - private MixedOperation> configMaps; + private MixedOperation configMaps; + private ConfigMapResource configMapResource; private ConfigMapBuilder configMapBuilder; private ConfigMapBuilder.MetadataNested metadata; @BeforeEach void setUp() { kc = mock(KubernetesClient.class, RETURNS_DEEP_STUBS); - configMaps = mock(MixedOperation.class, RETURNS_DEEP_STUBS); + configMaps = mock(MixedOperation.class); + configMapResource = mock(ConfigMapResource.class); configMapBuilder = Mockito.mock(ConfigMapBuilder.class, RETURNS_DEEP_STUBS); metadata = mock(ConfigMapBuilder.MetadataNested.class, RETURNS_DEEP_STUBS); + when(configMaps.withName("name")).thenReturn(configMapResource); when(kc.configMaps().inNamespace(anyString())).thenReturn(configMaps); when(configMapBuilder.editOrNewMetadata()).thenReturn(metadata); } @@ -102,7 +104,7 @@ void missingIdentityShouldThrowException() { void getWithExistingConfigMapShouldReturnLeaderElectionRecord() { // Given final ConfigMap cm = new ConfigMap(); - when(configMaps.withName(ArgumentMatchers.eq("name")).get()).thenReturn(cm); + when(configMapResource.get()).thenReturn(cm); cm.setMetadata(new ObjectMetaBuilder() .withAnnotations( Collections.singletonMap("control-plane.alpha.kubernetes.io/leader", @@ -125,6 +127,7 @@ void createWithValidLeaderElectionRecordShouldSendPostRequest() throws Exception final LeaderElectionRecord record = new LeaderElectionRecord( "1", Duration.ofSeconds(1), ZonedDateTime.now(), ZonedDateTime.now(), 0); final ConfigMapLock lock = new ConfigMapLock("namespace", "name", "1337"); + when(configMapResource.get()).thenReturn(new ConfigMap()); // When lock.create(kc, record); // Then @@ -134,7 +137,6 @@ void createWithValidLeaderElectionRecordShouldSendPostRequest() throws Exception @Test void updateWithValidLeaderElectionRecordShouldSendPutRequest() throws Exception { // Given - final Resource configMapResource = configMaps.withName("name"); final ReplaceDeletable replaceable = mock(ReplaceDeletable.class, Answers.RETURNS_DEEP_STUBS); when(configMapResource.lockResourceVersion(any())).thenReturn(replaceable); final ConfigMap configMapInTheCluster = new ConfigMap(); diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/ConfigMapOperationsImpl.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/ConfigMapOperationsImpl.java new file mode 100644 index 00000000000..66c88c18b67 --- /dev/null +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/dsl/internal/core/v1/ConfigMapOperationsImpl.java @@ -0,0 +1,54 @@ +package io.fabric8.kubernetes.client.dsl.internal.core.v1; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ConfigMapList; +import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.KubernetesClientException; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; +import io.fabric8.kubernetes.client.dsl.internal.HasMetadataOperation; +import io.fabric8.kubernetes.client.dsl.internal.HasMetadataOperationsImpl; +import io.fabric8.kubernetes.client.dsl.internal.OperationContext; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; + +import static io.fabric8.kubernetes.client.utils.KubernetesResourceUtil.createNewConfigMapFromDirOrFile; + +public class ConfigMapOperationsImpl extends HasMetadataOperation + implements ConfigMapResource { + + public ConfigMapOperationsImpl(Client client) { + this(HasMetadataOperationsImpl.defaultContext(client)); + } + + public ConfigMapOperationsImpl(OperationContext context) { + super(context.withPlural("configmaps"), ConfigMap.class, ConfigMapList.class); + } + + @Override + public ConfigMapOperationsImpl newInstance(OperationContext context) { + return new ConfigMapOperationsImpl(context); + } + + @Override + public ConfigMapResource fromFile(String dirOrFilePath) { + if (dirOrFilePath == null || dirOrFilePath.isEmpty()) { + throw new IllegalArgumentException("invalid file path provided"); + } + File file = Paths.get(dirOrFilePath).toFile(); + if (!file.exists()) { + throw new IllegalArgumentException(String.format("File %s doesn't exist", dirOrFilePath)); + } + + return resource(createNewConfigMap(file.getName(), dirOrFilePath)); + } + + private ConfigMap createNewConfigMap(String fileName, String dirOrFilePath) { + try { + return createNewConfigMapFromDirOrFile(name, fileName, dirOrFilePath); + } catch (IOException ioException) { + throw new KubernetesClientException("Unable to create ConfigMap " + name, ioException); + } + } +} diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/impl/KubernetesClientImpl.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/impl/KubernetesClientImpl.java index e5a7f72eec8..b306bfcb6b2 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/impl/KubernetesClientImpl.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/impl/KubernetesClientImpl.java @@ -97,6 +97,7 @@ import io.fabric8.kubernetes.client.dsl.AutoscalingAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.BatchAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.CertificatesAPIGroupDSL; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; import io.fabric8.kubernetes.client.dsl.DiscoveryAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.EventingAPIGroupDSL; import io.fabric8.kubernetes.client.dsl.ExtensionsAPIGroupDSL; @@ -141,6 +142,7 @@ import io.fabric8.kubernetes.client.dsl.internal.apps.v1.StatefulSetOperationsImpl; import io.fabric8.kubernetes.client.dsl.internal.batch.v1.JobOperationsImpl; import io.fabric8.kubernetes.client.dsl.internal.certificates.v1.CertificateSigningRequestOperationsImpl; +import io.fabric8.kubernetes.client.dsl.internal.core.v1.ConfigMapOperationsImpl; import io.fabric8.kubernetes.client.dsl.internal.core.v1.PodOperationsImpl; import io.fabric8.kubernetes.client.dsl.internal.core.v1.ReplicationControllerOperationsImpl; import io.fabric8.kubernetes.client.dsl.internal.core.v1.ServiceOperationsImpl; @@ -239,6 +241,7 @@ public KubernetesClientImpl(HttpClient httpClient, Config config, ExecutorSuppli this.getHandlers().register(Pod.class, PodOperationsImpl::new); this.getHandlers().register(Job.class, JobOperationsImpl::new); this.getHandlers().register(Service.class, ServiceOperationsImpl::new); + this.getHandlers().register(ConfigMap.class, ConfigMapOperationsImpl::new); this.getHandlers().register(Deployment.class, DeploymentOperationsImpl::new); this.getHandlers().register(io.fabric8.kubernetes.api.model.extensions.Deployment.class, io.fabric8.kubernetes.client.dsl.internal.extensions.v1beta1.DeploymentOperationsImpl::new); @@ -484,8 +487,8 @@ public NonNamespaceOperation> a * {@inheritDoc} */ @Override - public MixedOperation> configMaps() { - return resources(ConfigMap.class, ConfigMapList.class); + public MixedOperation configMaps() { + return new ConfigMapOperationsImpl(this); } /** diff --git a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/impl/ConfigMapFromFileTest.java b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/impl/ConfigMapFromFileTest.java new file mode 100644 index 00000000000..3aa7ecaf0dd --- /dev/null +++ b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/impl/ConfigMapFromFileTest.java @@ -0,0 +1,66 @@ +package io.fabric8.kubernetes.client.impl; + +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.utils.KubernetesResourceUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import java.net.URL; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mockStatic; + +class ConfigMapFromFileTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + void setUp() { + HttpClient mockClient = Mockito.mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @Test + void fromFile_withInvalidFilePath_shouldThrowException() { + // Given + ConfigMapResource configMapOp = kubernetesClient.configMaps() + .inNamespace("default") + .withName("game-config"); + + // When + assertThatIllegalArgumentException() + .isThrownBy(() -> configMapOp.fromFile("invalid-file")) + .withMessage("File invalid-file doesn't exist"); + } + + @Test + void fromFile_withValidFilePath_shouldDelegateCallToHelpermethod() { + try (MockedStatic kubernetesResourceUtilMockedStatic = mockStatic(KubernetesResourceUtil.class)) { + // Given + ConfigMapResource configMapOp = kubernetesClient.configMaps() + .inNamespace("default") + .withName("game-config"); + ArgumentCaptor filePathCaptor = ArgumentCaptor.forClass(String.class); + URL fileUrl = getClass().getResource("/test-config.yml"); + assertThat(fileUrl).isNotNull(); + + // When + configMapOp.fromFile(fileUrl.getFile()); + + // Then + kubernetesResourceUtilMockedStatic + .verify(() -> KubernetesResourceUtil.createNewConfigMapFromDirOrFile(eq("game-config"), eq("test-config.yml"), filePathCaptor.capture())); + assertThat(filePathCaptor.getValue()).isEqualTo(fileUrl.getFile()); + } + } + +} diff --git a/kubernetes-client/src/test/resources/configmap-from-file/game.properties b/kubernetes-client/src/test/resources/configmap-from-file/game.properties new file mode 100644 index 00000000000..80b40fb7a4c --- /dev/null +++ b/kubernetes-client/src/test/resources/configmap-from-file/game.properties @@ -0,0 +1,7 @@ +enemies=aliens +lives=3 +enemies.cheat=true +enemies.cheat.level=noGoodRotten +secret.code.passphrase=UUDDLRLRBABAS +secret.code.allowed=true +secret.code.lives=30 diff --git a/kubernetes-client/src/test/resources/configmap-from-file/ui.properties b/kubernetes-client/src/test/resources/configmap-from-file/ui.properties new file mode 100644 index 00000000000..487bea0347e --- /dev/null +++ b/kubernetes-client/src/test/resources/configmap-from-file/ui.properties @@ -0,0 +1,4 @@ +color.good=purple +color.bad=yellow +allow.textmode=true +how.nice.to.look=fairlyNice diff --git a/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/ConfigMapTest.java b/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/ConfigMapTest.java index a9b2942fe23..c0979e33773 100644 --- a/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/ConfigMapTest.java +++ b/kubernetes-tests/src/test/java/io/fabric8/kubernetes/client/mock/ConfigMapTest.java @@ -20,8 +20,8 @@ import io.fabric8.kubernetes.api.model.ConfigMapList; import io.fabric8.kubernetes.api.model.ConfigMapListBuilder; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; import io.fabric8.kubernetes.client.dsl.MixedOperation; -import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import org.junit.jupiter.api.Test; @@ -74,7 +74,7 @@ void testDeletes() throws InterruptedException { server.expect().withPath("/api/v1/namespaces/test/configmaps").andReturn(200, new ConfigMapListBuilder().withItems(cm).build()).always(); - MixedOperation> configMaps = client.configMaps(); + MixedOperation configMaps = client.configMaps(); assertTrue(configMaps.delete().size() == 1); server.expect().delete().withPath("/api/v1/namespaces/test/configmaps/cfg1").andReturn(200, diff --git a/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/NamespacedItemTest.java b/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/NamespacedItemTest.java index 8c0b1b26253..59db31597f8 100644 --- a/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/NamespacedItemTest.java +++ b/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/NamespacedItemTest.java @@ -22,6 +22,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.KubernetesClientException; import io.fabric8.kubernetes.client.NamespacedKubernetesClient; +import io.fabric8.kubernetes.client.dsl.ConfigMapResource; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.NamespaceListVisitFromServerGetDeleteRecreateWaitApplicable; import io.fabric8.kubernetes.client.dsl.Resource; @@ -118,7 +119,7 @@ void testClientNullNamespace() { @Test void testOperationNullNamespace() { - MixedOperation> configMaps = this.client.configMaps(); + MixedOperation configMaps = this.client.configMaps(); assertThrows(KubernetesClientException.class, () -> configMaps.inNamespace(null)); }