From 705ba06d40e974e72af395aafef2deb745e2e356 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 1 Dec 2022 19:05:33 +0530 Subject: [PATCH] fix (extensions) : isSupported doesn't check all of the applicable API Groups (#4447) + Extension client interfaces should extend SupportTestingClient rather than implementations + Disable exact apiGroup match in isSupported method call in extension clients which use more than one apiGroup. This effects Istio, Knative and Tekton extensions that use more than one apiGroups Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + extensions/camel-k/client/pom.xml | 12 ++- .../fabric8/camelk/client/CamelKClient.java | 3 +- .../camelk/client/DefaultCamelKClient.java | 5 +- .../camelk/client/CamelKClientAdaptTest.java | 82 +++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/certmanager/client/pom.xml | 12 ++- .../certmanager/client/CertManagerClient.java | 3 +- .../client/DefaultCertManagerClient.java | 4 + .../client/CertManagerClientAdaptTest.java | 82 +++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/chaosmesh/client/pom.xml | 12 ++- .../chaosmesh/client/ChaosMeshClient.java | 3 +- .../client/DefaultChaosMeshClient.java | 5 +- .../org.mockito.plugins.MockMaker | 1 + .../client/ChaosMeshClientAdaptTest.java | 81 ++++++++++++++++++ extensions/istio/client/pom.xml | 15 ++++ .../istio/client/DefaultIstioClient.java | 5 +- .../io/fabric8/istio/client/IstioClient.java | 3 +- .../istio/client/IstioClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/knative/client/pom.xml | 12 ++- .../knative/client/DefaultKnativeClient.java | 5 +- .../fabric8/knative/client/KnativeClient.java | 3 +- .../client/KnativeClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + .../open-cluster-management/client/pom.xml | 12 ++- .../DefaultOpenClusterManagementClient.java | 3 +- .../client/OpenClusterManagementClient.java | 3 +- .../OpenClusterManagementClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/service-catalog/client/pom.xml | 12 ++- .../client/DefaultServiceCatalogClient.java | 5 +- .../client/ServiceCatalogClient.java | 3 +- .../client/ServiceCatalogClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/tekton/client/pom.xml | 12 ++- .../tekton/client/DefaultTektonClient.java | 5 +- .../fabric8/tekton/client/TektonClient.java | 3 +- .../tekton/client/TektonClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + .../verticalpodautoscaler/client/pom.xml | 12 ++- .../DefaultVerticalPodAutoscalerClient.java | 5 +- .../client/VerticalPodAutoscalerClient.java | 3 +- .../VerticalPodAutoscalerClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/volcano/client/pom.xml | 15 ++++ .../volcano/client/DefaultVolcanoClient.java | 5 +- .../fabric8/volcano/client/VolcanoClient.java | 3 +- .../client/VolcanoClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/volumesnapshot/client/pom.xml | 12 ++- .../client/DefaultVolumeSnapshotClient.java | 5 +- .../client/VolumeSnapshotClient.java | 3 +- .../client/VolumeSnapshotClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + 56 files changed, 1079 insertions(+), 49 deletions(-) create mode 100644 extensions/camel-k/client/src/test/java/io/fabric8/camelk/client/CamelKClientAdaptTest.java create mode 100644 extensions/camel-k/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/certmanager/client/src/test/java/io/fabric8/certmanager/client/CertManagerClientAdaptTest.java create mode 100644 extensions/certmanager/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/chaosmesh/client/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/chaosmesh/client/src/test/java/io/fabric8/chaosmesh/client/ChaosMeshClientAdaptTest.java create mode 100644 extensions/istio/client/src/test/java/io/fabric8/istio/client/IstioClientAdaptTest.java create mode 100644 extensions/istio/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/knative/client/src/test/java/io/fabric8/knative/client/KnativeClientAdaptTest.java create mode 100644 extensions/knative/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/open-cluster-management/client/src/test/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClientAdaptTest.java create mode 100644 extensions/open-cluster-management/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/service-catalog/client/src/test/java/io/fabric8/servicecatalog/client/ServiceCatalogClientAdaptTest.java create mode 100644 extensions/service-catalog/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/tekton/client/src/test/java/io/fabric8/tekton/client/TektonClientAdaptTest.java create mode 100644 extensions/tekton/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/verticalpodautoscaler/client/src/test/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClientAdaptTest.java create mode 100644 extensions/verticalpodautoscaler/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/volcano/client/src/test/java/io/fabric8/volcano/client/VolcanoClientAdaptTest.java create mode 100644 extensions/volcano/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker create mode 100644 extensions/volumesnapshot/client/src/test/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClientAdaptTest.java create mode 100644 extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f26b86096d..c3885deb9b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ #### Bugs * Fix #4590: only using a builder if there are visitors * Fix #4159: ensure the token refresh obeys how the Config was created +* Fix #4447: `isSupported` doesn't check all of the applicable API Groups * Fix #4491: added a more explicit shutdown exception for okhttp * Fix #4510: Fix StackOverflow on cyclic references involving collections. * Fix #4534: Java Generator CLI default handling of skipGeneratedAnnotations diff --git a/extensions/camel-k/client/pom.xml b/extensions/camel-k/client/pom.xml index f6a1d4c6e0b..a038c366735 100644 --- a/extensions/camel-k/client/pom.xml +++ b/extensions/camel-k/client/pom.xml @@ -84,7 +84,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java index 3ecd8096b56..d2c386bce70 100644 --- a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java +++ b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/CamelKClient.java @@ -18,11 +18,12 @@ import io.fabric8.camelk.client.dsl.V1APIGroupDSL; import io.fabric8.camelk.client.dsl.V1alpha1APIGroupDSL; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for CamelK client library. */ -public interface CamelKClient extends Client { +public interface CamelKClient extends Client, SupportTestingClient { /** * API entrypoint for camel.apache.org/v1 API group resources * diff --git a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java index 313c2998ff3..97a4d78ca1a 100644 --- a/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java +++ b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java @@ -23,10 +23,9 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultCamelKClient extends ExtensionRootClientAdapter - implements NamespacedCamelKClient, SupportTestingClient { + implements NamespacedCamelKClient { public DefaultCamelKClient() { super(); @@ -62,7 +61,7 @@ public V1alpha1APIGroupDSL v1alpha1() { @Override public boolean isSupported() { - return hasApiGroup("camel.apache.org", true); + return hasApiGroup("camel.apache.org", false); } } diff --git a/extensions/camel-k/client/src/test/java/io/fabric8/camelk/client/CamelKClientAdaptTest.java b/extensions/camel-k/client/src/test/java/io/fabric8/camelk/client/CamelKClientAdaptTest.java new file mode 100644 index 00000000000..d146f2fefe8 --- /dev/null +++ b/extensions/camel-k/client/src/test/java/io/fabric8/camelk/client/CamelKClientAdaptTest.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.camelk.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class CamelKClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(CamelKClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("camel.apache.org", true), + Arguments.of("test.camel.apache.org", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/camel-k/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/camel-k/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/camel-k/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/certmanager/client/pom.xml b/extensions/certmanager/client/pom.xml index 9ed649cf928..502f406ee42 100644 --- a/extensions/certmanager/client/pom.xml +++ b/extensions/certmanager/client/pom.xml @@ -93,7 +93,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java index 9c582f0dec3..bb0805a5ae7 100644 --- a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java +++ b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/CertManagerClient.java @@ -20,11 +20,12 @@ import io.fabric8.certmanager.client.dsl.V1alpha3APIGroupDSL; import io.fabric8.certmanager.client.dsl.V1beta1APIGroupDSL; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for CertManager Client library. */ -public interface CertManagerClient extends Client { +public interface CertManagerClient extends Client, SupportTestingClient { V1APIGroupDSL v1(); V1alpha2APIGroupDSL v1alpha2(); diff --git a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java index d173321f123..2694ba01f4e 100644 --- a/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java +++ b/extensions/certmanager/client/src/main/java/io/fabric8/certmanager/client/DefaultCertManagerClient.java @@ -71,4 +71,8 @@ public V1beta1APIGroupDSL v1beta1() { return adapt(V1beta1APIGroupClient.class); } + @Override + public boolean isSupported() { + return hasApiGroup("cert-manager.io", false); + } } diff --git a/extensions/certmanager/client/src/test/java/io/fabric8/certmanager/client/CertManagerClientAdaptTest.java b/extensions/certmanager/client/src/test/java/io/fabric8/certmanager/client/CertManagerClientAdaptTest.java new file mode 100644 index 00000000000..dc45a581ba0 --- /dev/null +++ b/extensions/certmanager/client/src/test/java/io/fabric8/certmanager/client/CertManagerClientAdaptTest.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.certmanager.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class CertManagerClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public void setUp() { + HttpClient mockClient = mock(HttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Config config = new ConfigBuilder().withMasterUrl("https://localhost:8443/").build(); + kubernetesClient = new KubernetesClientImpl(mockClient, config); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(CertManagerClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("cert-manager.io", true), + Arguments.of("test.cert-manager.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/certmanager/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/certmanager/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/certmanager/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/chaosmesh/client/pom.xml b/extensions/chaosmesh/client/pom.xml index d2f35dc8720..bf0ad115244 100644 --- a/extensions/chaosmesh/client/pom.xml +++ b/extensions/chaosmesh/client/pom.xml @@ -95,7 +95,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java index eaca971802f..6cc3bae49b7 100644 --- a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java +++ b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/ChaosMeshClient.java @@ -42,11 +42,12 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for Chaos Mesh Client. */ -public interface ChaosMeshClient extends Client { +public interface ChaosMeshClient extends Client, SupportTestingClient { // Serving /** diff --git a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java index 2093bc65b29..7b9ba9eeab3 100644 --- a/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java +++ b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java @@ -47,10 +47,9 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultChaosMeshClient extends ExtensionRootClientAdapter - implements NamespacedChaosMeshClient, SupportTestingClient { + implements NamespacedChaosMeshClient { public DefaultChaosMeshClient() { super(); @@ -136,6 +135,6 @@ public MixedOperation> awsChaos() { @Override public boolean isSupported() { - return hasApiGroup("chaos-mesh.org", true); + return hasApiGroup("chaos-mesh.org", false); } } diff --git a/extensions/chaosmesh/client/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/chaosmesh/client/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/chaosmesh/client/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/chaosmesh/client/src/test/java/io/fabric8/chaosmesh/client/ChaosMeshClientAdaptTest.java b/extensions/chaosmesh/client/src/test/java/io/fabric8/chaosmesh/client/ChaosMeshClientAdaptTest.java new file mode 100644 index 00000000000..6399195f6e1 --- /dev/null +++ b/extensions/chaosmesh/client/src/test/java/io/fabric8/chaosmesh/client/ChaosMeshClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.chaosmesh.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class ChaosMeshClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(ChaosMeshClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("chaos-mesh.org", true), + Arguments.of("test.chaos-mesh.org", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/istio/client/pom.xml b/extensions/istio/client/pom.xml index 69e54afe582..aeb1263e9d9 100755 --- a/extensions/istio/client/pom.xml +++ b/extensions/istio/client/pom.xml @@ -82,6 +82,21 @@ junit-jupiter-engine test + + org.junit.jupiter + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core + test + org.projectlombok lombok diff --git a/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java b/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java index 5d765fc50cb..bd572066802 100644 --- a/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java +++ b/extensions/istio/client/src/main/java/io/fabric8/istio/client/DefaultIstioClient.java @@ -21,10 +21,9 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultIstioClient extends ExtensionRootClientAdapter - implements NamespacedIstioClient, SupportTestingClient { + implements NamespacedIstioClient { public DefaultIstioClient() { super(); @@ -60,6 +59,6 @@ public V1beta1APIGroupDSL v1beta1() { @Override public boolean isSupported() { - return hasApiGroup("networking.istio.io", true); + return hasApiGroup("istio.io", false); } } diff --git a/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java b/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java index b5ccc75be06..9dda03d635b 100644 --- a/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java +++ b/extensions/istio/client/src/main/java/io/fabric8/istio/client/IstioClient.java @@ -16,11 +16,12 @@ package io.fabric8.istio.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for Istio Client. */ -public interface IstioClient extends Client { +public interface IstioClient extends Client, SupportTestingClient { /** * API entrypoint for istio.io/v1beta1 API group resources * diff --git a/extensions/istio/client/src/test/java/io/fabric8/istio/client/IstioClientAdaptTest.java b/extensions/istio/client/src/test/java/io/fabric8/istio/client/IstioClientAdaptTest.java new file mode 100644 index 00000000000..60e24c823f1 --- /dev/null +++ b/extensions/istio/client/src/test/java/io/fabric8/istio/client/IstioClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.istio.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class IstioClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(IstioClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("istio.io", true), + Arguments.of("security.istio.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/istio/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/istio/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/istio/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/knative/client/pom.xml b/extensions/knative/client/pom.xml index 394c172fb3f..87e5d1fdf94 100755 --- a/extensions/knative/client/pom.xml +++ b/extensions/knative/client/pom.xml @@ -80,7 +80,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java b/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java index 6d971b18fb5..5570179d94b 100644 --- a/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java +++ b/extensions/knative/client/src/main/java/io/fabric8/knative/client/DefaultKnativeClient.java @@ -77,10 +77,9 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; public class DefaultKnativeClient extends ExtensionRootClientAdapter - implements NamespacedKnativeClient, SupportTestingClient { + implements NamespacedKnativeClient { public DefaultKnativeClient() { super(); @@ -241,6 +240,6 @@ public MixedOperation> ka @Override public boolean isSupported() { - return hasApiGroup("knative.dev", true); + return hasApiGroup("knative.dev", false); } } diff --git a/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java b/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java index de3dd88afe8..70d2bd66513 100644 --- a/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java +++ b/extensions/knative/client/src/main/java/io/fabric8/knative/client/KnativeClient.java @@ -72,11 +72,12 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; /** * Main interface for Knative Client. */ -public interface KnativeClient extends Client { +public interface KnativeClient extends Client, SupportTestingClient { // Serving /** diff --git a/extensions/knative/client/src/test/java/io/fabric8/knative/client/KnativeClientAdaptTest.java b/extensions/knative/client/src/test/java/io/fabric8/knative/client/KnativeClientAdaptTest.java new file mode 100644 index 00000000000..85af11902b1 --- /dev/null +++ b/extensions/knative/client/src/test/java/io/fabric8/knative/client/KnativeClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.knative.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class KnativeClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(KnativeClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("knative.dev", true), + Arguments.of("serving.knative.dev", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/knative/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/knative/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/knative/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/open-cluster-management/client/pom.xml b/extensions/open-cluster-management/client/pom.xml index 2d097071b3c..db99ec8b824 100644 --- a/extensions/open-cluster-management/client/pom.xml +++ b/extensions/open-cluster-management/client/pom.xml @@ -127,7 +127,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java index 5e2c52e9e3a..129b0e88a51 100644 --- a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java +++ b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/DefaultOpenClusterManagementClient.java @@ -21,7 +21,6 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAgentAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAppsAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementClustersAPIGroupDSL; @@ -31,7 +30,7 @@ import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementSearchAPIGroupDSL; public class DefaultOpenClusterManagementClient extends ExtensionRootClientAdapter - implements NamespacedOpenClusterManagementClient, SupportTestingClient { + implements NamespacedOpenClusterManagementClient { public DefaultOpenClusterManagementClient() { super(); diff --git a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java index b5f6ef5c763..2e4d5f232a7 100644 --- a/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java +++ b/extensions/open-cluster-management/client/src/main/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClient.java @@ -16,6 +16,7 @@ package io.fabric8.openclustermanagement.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAgentAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementAppsAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementClustersAPIGroupDSL; @@ -24,7 +25,7 @@ import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementPolicyAPIGroupDSL; import io.fabric8.openclustermanagement.client.dsl.OpenClusterManagementSearchAPIGroupDSL; -public interface OpenClusterManagementClient extends Client { +public interface OpenClusterManagementClient extends Client, SupportTestingClient { /** * API entrypoint for resources in apps.open-cluster-management.io apiGroup * diff --git a/extensions/open-cluster-management/client/src/test/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClientAdaptTest.java b/extensions/open-cluster-management/client/src/test/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClientAdaptTest.java new file mode 100644 index 00000000000..74c4a9a059f --- /dev/null +++ b/extensions/open-cluster-management/client/src/test/java/io/fabric8/openclustermanagement/client/OpenClusterManagementClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.openclustermanagement.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class OpenClusterManagementClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(OpenClusterManagementClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("open-cluster-management.io", true), + Arguments.of("operator.open-cluster-management.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/open-cluster-management/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/open-cluster-management/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/open-cluster-management/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/service-catalog/client/pom.xml b/extensions/service-catalog/client/pom.xml index 1973333e9e8..86b6135fb58 100644 --- a/extensions/service-catalog/client/pom.xml +++ b/extensions/service-catalog/client/pom.xml @@ -94,7 +94,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java index a8efa61b474..d9315a5431e 100644 --- a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java +++ b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/DefaultServiceCatalogClient.java @@ -24,7 +24,6 @@ import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.servicecatalog.api.model.ClusterServiceBroker; import io.fabric8.servicecatalog.api.model.ClusterServiceBrokerList; import io.fabric8.servicecatalog.api.model.ClusterServiceClass; @@ -48,7 +47,7 @@ import io.fabric8.servicecatalog.client.dsl.ServiceInstanceResource; public class DefaultServiceCatalogClient extends ExtensionRootClientAdapter - implements NamespacedServiceCatalogClient, SupportTestingClient { + implements NamespacedServiceCatalogClient { public DefaultServiceCatalogClient() { super(); @@ -114,6 +113,6 @@ public FunctionCallable withRequestConfig(Reques @Override public boolean isSupported() { - return hasApiGroup("servicecatalog.k8s.io", true); + return hasApiGroup("servicecatalog.k8s.io", false); } } diff --git a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java index 937c34d1778..8256a322049 100644 --- a/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java +++ b/extensions/service-catalog/client/src/main/java/io/fabric8/servicecatalog/client/ServiceCatalogClient.java @@ -19,6 +19,7 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.servicecatalog.api.model.ClusterServiceBroker; import io.fabric8.servicecatalog.api.model.ClusterServiceBrokerList; import io.fabric8.servicecatalog.api.model.ClusterServiceClass; @@ -44,7 +45,7 @@ /** * Main interface for Service Catalog Client. */ -public interface ServiceCatalogClient extends Client { +public interface ServiceCatalogClient extends Client, SupportTestingClient { /** * API entrypoint for ClusterServiceBroker(servicecatalog.k8s.io/v1beta1) diff --git a/extensions/service-catalog/client/src/test/java/io/fabric8/servicecatalog/client/ServiceCatalogClientAdaptTest.java b/extensions/service-catalog/client/src/test/java/io/fabric8/servicecatalog/client/ServiceCatalogClientAdaptTest.java new file mode 100644 index 00000000000..1f3e751b686 --- /dev/null +++ b/extensions/service-catalog/client/src/test/java/io/fabric8/servicecatalog/client/ServiceCatalogClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.servicecatalog.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class ServiceCatalogClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(ServiceCatalogClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("servicecatalog.k8s.io", true), + Arguments.of("test.servicecatalog.k8s.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/service-catalog/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/service-catalog/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/service-catalog/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/tekton/client/pom.xml b/extensions/tekton/client/pom.xml index 72c2f188c92..bbdd4e75b60 100644 --- a/extensions/tekton/client/pom.xml +++ b/extensions/tekton/client/pom.xml @@ -92,7 +92,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java index 4d992425e68..26f8305f415 100644 --- a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java +++ b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/DefaultTektonClient.java @@ -21,12 +21,11 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.tekton.client.dsl.V1alpha1APIGroupDSL; import io.fabric8.tekton.client.dsl.V1beta1APIGroupDSL; public class DefaultTektonClient extends ExtensionRootClientAdapter - implements NamespacedTektonClient, SupportTestingClient { + implements NamespacedTektonClient { public DefaultTektonClient() { super(); @@ -62,7 +61,7 @@ public V1alpha1APIGroupDSL v1alpha1() { @Override public boolean isSupported() { - return hasApiGroup("tekton.dev", true); + return hasApiGroup("tekton.dev", false); } } diff --git a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java index 5e81e589c11..be2d5b61328 100644 --- a/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java +++ b/extensions/tekton/client/src/main/java/io/fabric8/tekton/client/TektonClient.java @@ -16,13 +16,14 @@ package io.fabric8.tekton.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.tekton.client.dsl.V1alpha1APIGroupDSL; import io.fabric8.tekton.client.dsl.V1beta1APIGroupDSL; /** * Main interface for Tekton client library. */ -public interface TektonClient extends Client { +public interface TektonClient extends Client, SupportTestingClient { /** * API entrypoint for tekton.dev/v1beta1 API group resources * diff --git a/extensions/tekton/client/src/test/java/io/fabric8/tekton/client/TektonClientAdaptTest.java b/extensions/tekton/client/src/test/java/io/fabric8/tekton/client/TektonClientAdaptTest.java new file mode 100644 index 00000000000..7de4f8311a8 --- /dev/null +++ b/extensions/tekton/client/src/test/java/io/fabric8/tekton/client/TektonClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.tekton.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class TektonClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(TektonClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("tekton.dev", true), + Arguments.of("triggers.tekton.dev", true), + Arguments.of("knative.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/tekton/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/tekton/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/tekton/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/verticalpodautoscaler/client/pom.xml b/extensions/verticalpodautoscaler/client/pom.xml index 659cdd009ca..19e36a35ef8 100644 --- a/extensions/verticalpodautoscaler/client/pom.xml +++ b/extensions/verticalpodautoscaler/client/pom.xml @@ -81,7 +81,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java index b23be40334c..aa8ee877bef 100644 --- a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java +++ b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/DefaultVerticalPodAutoscalerClient.java @@ -21,11 +21,10 @@ import io.fabric8.kubernetes.client.WithRequestCallable; import io.fabric8.kubernetes.client.dsl.FunctionCallable; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.verticalpodautoscaler.client.dsl.V1APIGroupDSL; public class DefaultVerticalPodAutoscalerClient extends ExtensionRootClientAdapter - implements NamespacedVerticalPodAutoscalerClient, SupportTestingClient { + implements NamespacedVerticalPodAutoscalerClient { public DefaultVerticalPodAutoscalerClient() { super(); @@ -56,7 +55,7 @@ public V1APIGroupDSL v1() { @Override public boolean isSupported() { - return getClient().hasApiGroup(VerticalPodAutoscalerExtensionAdapter.API_GROUP, true); + return getClient().hasApiGroup(VerticalPodAutoscalerExtensionAdapter.API_GROUP, false); } } diff --git a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java index f01ff72eb87..ef2c70c3c86 100644 --- a/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java +++ b/extensions/verticalpodautoscaler/client/src/main/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClient.java @@ -16,8 +16,9 @@ package io.fabric8.verticalpodautoscaler.client; import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.verticalpodautoscaler.client.dsl.V1APIGroupDSL; -public interface VerticalPodAutoscalerClient extends Client { +public interface VerticalPodAutoscalerClient extends Client, SupportTestingClient { V1APIGroupDSL v1(); } diff --git a/extensions/verticalpodautoscaler/client/src/test/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClientAdaptTest.java b/extensions/verticalpodautoscaler/client/src/test/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClientAdaptTest.java new file mode 100644 index 00000000000..77f0f45a022 --- /dev/null +++ b/extensions/verticalpodautoscaler/client/src/test/java/io/fabric8/verticalpodautoscaler/client/VerticalPodAutoscalerClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.verticalpodautoscaler.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class VerticalPodAutoscalerClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(VerticalPodAutoscalerClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("autoscaling.k8s.io", true), + Arguments.of("test.autoscaling.k8s.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/verticalpodautoscaler/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/verticalpodautoscaler/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/verticalpodautoscaler/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/volcano/client/pom.xml b/extensions/volcano/client/pom.xml index 3cfd95f3a2a..5e86cc627ab 100644 --- a/extensions/volcano/client/pom.xml +++ b/extensions/volcano/client/pom.xml @@ -79,6 +79,21 @@ junit-jupiter-engine test + + org.junit.jupiter + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core + test + org.projectlombok lombok diff --git a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java index 61ed326ac9e..e333da9c2fa 100644 --- a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java +++ b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/DefaultVolcanoClient.java @@ -23,7 +23,6 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volcano.client.dsl.V1beta1APIGroupDSL; import io.fabric8.volcano.scheduling.v1beta1.PodGroup; import io.fabric8.volcano.scheduling.v1beta1.PodGroupList; @@ -31,7 +30,7 @@ import io.fabric8.volcano.scheduling.v1beta1.QueueList; public class DefaultVolcanoClient extends ExtensionRootClientAdapter - implements NamespacedVolcanoClient, SupportTestingClient { + implements NamespacedVolcanoClient { public DefaultVolcanoClient() { super(); @@ -75,6 +74,6 @@ public V1beta1APIGroupDSL v1beta1() { @Override public boolean isSupported() { - return getClient().hasApiGroup(VolcanoExtensionAdapter.API_GROUP, true); + return getClient().hasApiGroup(VolcanoExtensionAdapter.API_GROUP, false); } } diff --git a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java index 841752c102d..071d3f70997 100644 --- a/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java +++ b/extensions/volcano/client/src/main/java/io/fabric8/volcano/client/VolcanoClient.java @@ -18,6 +18,7 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volcano.client.dsl.V1beta1APIGroupDSL; import io.fabric8.volcano.scheduling.v1beta1.PodGroup; import io.fabric8.volcano.scheduling.v1beta1.PodGroupList; @@ -27,7 +28,7 @@ /** * Main interface for Volcano client library. */ -public interface VolcanoClient extends Client { +public interface VolcanoClient extends Client, SupportTestingClient { MixedOperation> podGroups(); MixedOperation> queues(); diff --git a/extensions/volcano/client/src/test/java/io/fabric8/volcano/client/VolcanoClientAdaptTest.java b/extensions/volcano/client/src/test/java/io/fabric8/volcano/client/VolcanoClientAdaptTest.java new file mode 100644 index 00000000000..add33604af6 --- /dev/null +++ b/extensions/volcano/client/src/test/java/io/fabric8/volcano/client/VolcanoClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.volcano.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class VolcanoClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(VolcanoClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("scheduling.volcano.sh", true), + Arguments.of("test.scheduling.volcano.sh", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/volcano/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/volcano/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/volcano/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline diff --git a/extensions/volumesnapshot/client/pom.xml b/extensions/volumesnapshot/client/pom.xml index 7baec1138d2..ee817762a8b 100644 --- a/extensions/volumesnapshot/client/pom.xml +++ b/extensions/volumesnapshot/client/pom.xml @@ -94,7 +94,17 @@ org.junit.jupiter - junit-jupiter-migrationsupport + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core test diff --git a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java index 2f389016b0d..bc9114f85e0 100644 --- a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java +++ b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/DefaultVolumeSnapshotClient.java @@ -23,7 +23,6 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; import io.fabric8.kubernetes.client.extension.ExtensionRootClientAdapter; -import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volumesnapshot.api.model.VolumeSnapshot; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClass; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClassList; @@ -32,7 +31,7 @@ import io.fabric8.volumesnapshot.api.model.VolumeSnapshotList; public class DefaultVolumeSnapshotClient extends ExtensionRootClientAdapter - implements NamespacedVolumeSnapshotClient, SupportTestingClient { + implements NamespacedVolumeSnapshotClient { public DefaultVolumeSnapshotClient() { super(); @@ -73,6 +72,6 @@ public FunctionCallable withRequestConfig(Reques @Override public boolean isSupported() { - return getClient().hasApiGroup(VolumeSnapshotExtensionAdapter.API_GROUP, true); + return getClient().hasApiGroup(VolumeSnapshotExtensionAdapter.API_GROUP, false); } } diff --git a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java index b0047f086af..6d0317ed1a0 100644 --- a/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java +++ b/extensions/volumesnapshot/client/src/main/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClient.java @@ -18,6 +18,7 @@ import io.fabric8.kubernetes.client.Client; import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation; +import io.fabric8.kubernetes.client.extension.SupportTestingClient; import io.fabric8.volumesnapshot.api.model.VolumeSnapshot; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClass; import io.fabric8.volumesnapshot.api.model.VolumeSnapshotClassList; @@ -28,7 +29,7 @@ /** * Main interface for VolumeSnapshot Client library. */ -public interface VolumeSnapshotClient extends Client { +public interface VolumeSnapshotClient extends Client, SupportTestingClient { /** * API entrypoint for dealing with VolumeSnapshotClass(snapshot.storage.k8s.io/v1) diff --git a/extensions/volumesnapshot/client/src/test/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClientAdaptTest.java b/extensions/volumesnapshot/client/src/test/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClientAdaptTest.java new file mode 100644 index 00000000000..ad9b1d8056f --- /dev/null +++ b/extensions/volumesnapshot/client/src/test/java/io/fabric8/volumesnapshot/client/VolumeSnapshotClientAdaptTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2015 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.fabric8.volumesnapshot.client; + +import io.fabric8.kubernetes.api.model.APIGroup; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.internal.OperationSupport; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.impl.KubernetesClientImpl; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mockConstruction; +import static org.mockito.Mockito.when; + +class VolumeSnapshotClientAdaptTest { + private KubernetesClient kubernetesClient; + + @BeforeEach + public 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); + } + + @AfterEach + void tearDown() { + kubernetesClient.close(); + kubernetesClient = null; + } + + @ParameterizedTest + @MethodSource("getInputData") + void isSupported_withGivenApiGroup_shouldValidateSupport(String apiGroupName, boolean expectedResult) { + try (MockedConstruction ignored = mockConstruction(OperationSupport.class, (mock, ctx) -> { + givenApiGroupsCallReturns(mock, new APIGroupBuilder().withName(apiGroupName).build()); + })) { + assertThat(kubernetesClient.adapt(VolumeSnapshotClient.class).isSupported()).isEqualTo(expectedResult); + } + } + + private static Stream getInputData() { + return Stream.of( + Arguments.of("snapshot.storage.k8s.io", true), + Arguments.of("serving.snapshot.storage.k8s.io", true), + Arguments.of("tekton.dev", false)); + } + + private void givenApiGroupsCallReturns(OperationSupport operationSupport, APIGroup apiGroup) { + when(operationSupport.restCall(APIGroupList.class, "/apis")) + .thenReturn(new APIGroupListBuilder() + .addToGroups(apiGroup) + .build()); + } +} diff --git a/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000000..1f0955d450f --- /dev/null +++ b/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline