From 09edb3d24675d559ac4a61f6815c8dc3136435e5 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 12 Dec 2022 14:07:40 +0530 Subject: [PATCH] fix (extensions) : isSupported doesn't check all of the applicable API Groups (#4447) + 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 ++- .../camelk/client/DefaultCamelKClient.java | 2 +- .../camelk/client/CamelKClientAdaptTest.java | 82 +++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/chaosmesh/client/pom.xml | 12 ++- .../client/DefaultChaosMeshClient.java | 2 +- .../org.mockito.plugins.MockMaker | 1 + .../client/ChaosMeshClientAdaptTest.java | 81 ++++++++++++++++++ extensions/istio/client/pom.xml | 15 ++++ .../istio/client/DefaultIstioClient.java | 2 +- .../istio/client/IstioClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/knative/client/pom.xml | 12 ++- .../knative/client/DefaultKnativeClient.java | 2 +- .../client/KnativeClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + .../open-cluster-management/client/pom.xml | 12 ++- .../OpenClusterManagementClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/service-catalog/client/pom.xml | 12 ++- .../client/DefaultServiceCatalogClient.java | 2 +- .../client/ServiceCatalogClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/tekton/client/pom.xml | 12 ++- .../tekton/client/DefaultTektonClient.java | 2 +- .../tekton/client/TektonClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + .../verticalpodautoscaler/client/pom.xml | 12 ++- .../DefaultVerticalPodAutoscalerClient.java | 2 +- .../VerticalPodAutoscalerClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/volcano/client/pom.xml | 15 ++++ .../volcano/client/DefaultVolcanoClient.java | 2 +- .../client/VolcanoClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + extensions/volumesnapshot/client/pom.xml | 12 ++- .../client/DefaultVolumeSnapshotClient.java | 2 +- .../client/VolumeSnapshotClientAdaptTest.java | 81 ++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + 40 files changed, 949 insertions(+), 17 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/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 e5eaf45fa9..e90571a63f 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 f6a1d4c6e0..a038c36673 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/DefaultCamelKClient.java b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java index 313c2998ff..b68ae19564 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 @@ -62,7 +62,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 0000000000..99155c4001 --- /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.isAdaptable(CamelKClient.class)).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 0000000000..1f0955d450 --- /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/chaosmesh/client/pom.xml b/extensions/chaosmesh/client/pom.xml index d2f35dc872..bf0ad11524 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/DefaultChaosMeshClient.java b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java index 2093bc65b2..4bc531aab3 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 @@ -136,6 +136,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 0000000000..1f0955d450 --- /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 0000000000..6d8efa9532 --- /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.isAdaptable(ChaosMeshClient.class)).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 69e54afe58..aeb1263e9d 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 5d765fc50c..258fa30136 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 @@ -60,6 +60,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/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 0000000000..71eea5cc66 --- /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.isAdaptable(IstioClient.class)).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 0000000000..1f0955d450 --- /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 394c172fb3..87e5d1fdf9 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 6d971b18fb..812e20d7d0 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 @@ -241,6 +241,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/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 0000000000..ddb3bf8035 --- /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.isAdaptable(KnativeClient.class)).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 0000000000..1f0955d450 --- /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 2d097071b3..db99ec8b82 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/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 0000000000..4f1339f9b4 --- /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.isAdaptable(OpenClusterManagementClient.class)).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 0000000000..1f0955d450 --- /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 1973333e9e..86b6135fb5 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 a8efa61b47..b3a34c0349 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 @@ -114,6 +114,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/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 0000000000..8ecb6906aa --- /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.isAdaptable(ServiceCatalogClient.class)).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 0000000000..1f0955d450 --- /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 72c2f188c9..bbdd4e75b6 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 4d992425e6..b23f603891 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 @@ -62,7 +62,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/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 0000000000..515d6dce86 --- /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.isAdaptable(TektonClient.class)).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 0000000000..1f0955d450 --- /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 659cdd009c..19e36a35ef 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 b23be40334..18d56bc872 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 @@ -56,7 +56,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/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 0000000000..0f1215d79d --- /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.isAdaptable(VerticalPodAutoscalerClient.class)).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 0000000000..1f0955d450 --- /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 3cfd95f3a2..5e86cc627a 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 61ed326ac9..75a747da49 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 @@ -75,6 +75,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/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 0000000000..17c153d090 --- /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.isAdaptable(VolcanoClient.class)).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 0000000000..1f0955d450 --- /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 7baec1138d..ee817762a8 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 2f389016b0..70ea242ea2 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 @@ -73,6 +73,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/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 0000000000..3ab73a3587 --- /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.isAdaptable(VolumeSnapshotClient.class)).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 0000000000..1f0955d450 --- /dev/null +++ b/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline