8000 fix: only check for CRD if we're dealing with CustomResources (#811) · Sgitario/java-operator-sdk@9c3f187 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9c3f187

Browse files
authored
fix: only check for CRD if we're dealing with CustomResources (operator-framework#811)
Fixes operator-framework#810
1 parent 9f829a6 commit 9c3f187

File tree

2 files changed

+84
-4
lines changed

2 files changed

+84
-4
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.fabric8.kubernetes.api.model.HasMetadata;
77
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
88
import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition;
9+
import io.fabric8.kubernetes.client.CustomResource;
910
import io.fabric8.kubernetes.client.KubernetesClient;
1011
import io.fabric8.kubernetes.client.dsl.MixedOperation;
1112
import io.fabric8.kubernetes.client.dsl.Resource;
@@ -167,10 +168,10 @@ public void start() throws OperatorException {
167168
try {
168169
// check that the custom resource is known by the cluster if configured that way
169170
final CustomResourceDefinition crd; // todo: check proper CRD spec version based on config
170-
if (configurationService().checkCRDAndValidateLocalModel()) {
171-
crd =
172-
kubernetesClient.apiextensions().v1().customResourceDefinitions().withName(crdName)
173-
.get();
171+
if (configurationService().checkCRDAndValidateLocalModel()
172+
&& CustomResource.class.isAssignableFrom(resClass)) {
173+
crd = kubernetesClient.apiextensions().v1().customResourceDefinitions().withName(crdName)
174+
.get();
174175
if (crd == null) {
175176
throwMissingCRDException(crdName, specVersion, controllerName);
176177
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package io.javaoperatorsdk.operator.processing;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import io.fabric8.kubernetes.api.model.Secret;
6+
import io.fabric8.kubernetes.client.KubernetesClient;
7+
import io.fabric8.kubernetes.client.V1ApiextensionAPIGroupDSL;
8+
import io.fabric8.kubernetes.client.dsl.ApiextensionsAPIGroupDSL;
9+
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
10+
import io.fabric8.kubernetes.client.dsl.Resource;
11+
import io.javaoperatorsdk.operator.MissingCRDException;
12+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
13+
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
14+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
15+
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
16+
17+
import static org.junit.jupiter.api.Assertions.assertThrows;
18+
import static org.mockito.ArgumentMatchers.any;
19+
import static org.mockito.Mockito.mock;
20+
import static org.mockito.Mockito.never;
21+
import static org.mockito.Mockito.times;
22+
import static org.mockito.Mockito.verify;
23+
import static org.mockito.Mockito.when;
24+
25+
class ControllerTest {
26+
27+
@Test
28+
void crdShouldNotBeCheckedForNativeResources() {
29+
final var client = mock(KubernetesClient.class);
30+
final var configurationService = mock(ConfigurationService.class);
31+
final var reconciler = mock(Reconciler.class);
32+
final var configuration = mock(ControllerConfiguration.class);
33+
when(configuration.getResourceClass()).thenReturn(Secret.class);
34+
when(configuration.getConfigurationService()).thenReturn(configurationService);
35+
36+
final var controller = new Controller<Secret>(reconciler, configuration, client);
37+
controller.start();
38+
verify(client, never()).apiextensions();
39+
}
40+
41+
@Test
42+
void crdShouldNotBeCheckedForCustomResourcesIfDisabled() {
43+
final var client = mock(KubernetesClient.class);
44+
final var configurationService = mock(ConfigurationService.class);
45+
when(configurationService.checkCRDAndValidateLocalModel()).thenReturn(false);
46+
final var reconciler = mock(Reconciler.class);
47+
final var configuration = mock(ControllerConfiguration.class);
48+
when(configuration.getResourceClass()).thenReturn(TestCustomResource.class);
49+
when(configuration.getConfigurationService()).thenReturn(configurationService);
50+
51+
final var controller = new Controller<TestCustomResource>(reconciler, configuration, client);
52+
controller.start();
53+
verify(client, never()).apiextensions();
54+
}
55+
56+
@Test
57+
void crdShouldBeCheckedForCustomResourcesByDefault() {
58+
final var client = mock(KubernetesClient.class);
59+
final var configurationService = mock(ConfigurationService.class);
60+
when(configurationService.checkCRDAndValidateLocalModel()).thenCallRealMethod();
61+
final var reconciler = mock(Reconciler.class);
62+
final var configuration = mock(ControllerConfiguration.class);
63+
when(configuration.getResourceClass()).thenReturn(TestCustomResource.class);
64+
when(configuration.getConfigurationService()).thenReturn(configurationService);
65+
final var apiGroupDSL = mock(ApiextensionsAPIGroupDSL.class);
66+
when(client.apiextensions()).thenReturn(apiGroupDSL);
67+
final var v1 = mock(V1ApiextensionAPIGroupDSL.class);
68+
when(apiGroupDSL.v1()).thenReturn(v1);
69+
final var operation = mock(NonNamespaceOperation.class);
70+
when(v1.customResourceDefinitions()).thenReturn(operation);
71+
when(operation.withName(any())).thenReturn(mock(Resource.class));
72+
73+
final var controller = new Controller<TestCustomResource>(reconciler, configuration, client);
74+
// since we're not really connected to a cluster and the CRD wouldn't be deployed anyway, we
75+
// expect a MissingCRDException to be thrown
76+
assertThrows(MissingCRDException.class, controller::start);
77+
verify(client, times(1)).apiextensions();
78+
}
79+
}

0 commit comments

Comments
 (0)
0