diff --git a/CHANGELOG.md b/CHANGELOG.md index e5eaf45fa96..e90571a63f2 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/DefaultCamelKClient.java b/extensions/camel-k/client/src/main/java/io/fabric8/camelk/client/DefaultCamelKClient.java index 313c2998ff3..b68ae19564f 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 00000000000..99155c40012 --- /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 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/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/DefaultChaosMeshClient.java b/extensions/chaosmesh/client/src/main/java/io/fabric8/chaosmesh/client/DefaultChaosMeshClient.java index 2093bc65b29..4bc531aab3e 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 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..6d8efa95324 --- /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 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..258fa30136d 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 00000000000..71eea5cc66c --- /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 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..812e20d7d00 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 00000000000..ddb3bf80357 --- /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 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/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..4f1339f9b4a --- /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 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..b3a34c0349c 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 00000000000..8ecb6906aac --- /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 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..b23f603891f 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 00000000000..515d6dce865 --- /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 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..18d56bc872d 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 00000000000..0f1215d79da --- /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 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..75a747da492 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 00000000000..17c153d0907 --- /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 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..70ea242ea22 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 00000000000..3ab73a35877 --- /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 00000000000..1f0955d450f --- /dev/null +++ b/extensions/volumesnapshot/client/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline