Skip to content

Commit 463c2ff

Browse files
committed
refactor, fixes
1 parent 352023d commit 463c2ff

File tree

5 files changed

+189
-112
lines changed

5 files changed

+189
-112
lines changed

operator-framework/src/main/java/com/github/containersolutions/operator/processing/EventDispatcher.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class EventDispatcher<R extends CustomResource> {
2929
public EventDispatcher(ResourceController<R> controller,
3030
CustomResourceOperationsImpl<R, CustomResourceList<R>, CustomResourceDoneable<R>> resourceOperation,
3131
NonNamespaceOperation<R, CustomResourceList<R>, CustomResourceDoneable<R>,
32-
Resource<R, CustomResourceDoneable<R>>> resourceClient, KubernetesClient k8sClient,
32+
Resource<R, CustomResourceDoneable<R>>> resourceClient, KubernetesClient k8sClient,
3333
String defaultFinalizer
3434

3535
) {
@@ -51,17 +51,20 @@ public void handleEvent(Watcher.Action action, R resource) {
5151
log.debug("Removing finalizer on {}: {}", resource.getMetadata().getName(), resource.getMetadata());
5252
removeDefaultFinalizer(resource);
5353
}
54-
} else if (!markedForDeletion(resource)){
54+
} else {
5555
Optional<R> updateResult = controller.createOrUpdateResource(resource, new Context<>(k8sClient, resourceClient));
5656
if (updateResult.isPresent()) {
57+
log.debug("Updating resource: {} with version: {}", resource.getMetadata().getName(),
58+
resource.getMetadata().getResourceVersion());
59+
log.trace("Resource before update: {}", resource);
5760
R updatedResource = updateResult.get();
58-
log.info("Actual resource in etcd {}", resourceOperation.withName(resource.getMetadata().getName()).get());
59-
log.info("Updated resource handled {}", updatedResource.getMetadata());
6061
addFinalizerIfNotPresent(updatedResource);
6162
replace(updatedResource);
63+
log.trace("Resource after update: {}", resource);
6264
// We always add the default finalizer if missing and not marked for deletion.
63-
} else if (!hasDefaultFinalizer(resource)) {
64-
log.info("Actual resource with no finalizer: {}", resourceOperation.withName(resource.getMetadata().getName()).get());
65+
} else if (!hasDefaultFinalizer(resource) && !markedForDeletion(resource)) {
66+
log.debug("Adding finalizer for resource: {} version: {}", resource.getMetadata().getName(),
67+
resource.getMetadata().getResourceVersion());
6568
addFinalizerIfNotPresent(resource);
6669
replace(resource);
6770
}
@@ -96,7 +99,7 @@ private void replace(R resource) {
9699
}
97100

98101
private void addFinalizerIfNotPresent(R resource) {
99-
if (!hasDefaultFinalizer(resource)) {
102+
if (!hasDefaultFinalizer(resource) && !markedForDeletion(resource)) {
100103
log.info("Adding default finalizer to {}", resource.getMetadata());
101104
if (resource.getMetadata().getFinalizers() == null) {
102105
resource.getMetadata().setFinalizers(new ArrayList<>(1));
Lines changed: 41 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
package com.github.containersolutions.operator;
22

33
import com.github.containersolutions.operator.sample.TestCustomResource;
4-
import com.github.containersolutions.operator.sample.TestCustomResourceSpec;
54
import io.fabric8.kubernetes.api.model.ConfigMap;
6-
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
75
import org.awaitility.Awaitility;
86
import org.junit.jupiter.api.*;
97

108
import java.util.List;
119
import java.util.concurrent.TimeUnit;
1210

11+
import static com.github.containersolutions.operator.IntegrationTestSupport.TEST_CUSTOM_RESOURCE_PREFIX;
12+
import static com.github.containersolutions.operator.IntegrationTestSupport.TEST_NAMESPACE;
1313
import static org.assertj.core.api.Assertions.assertThat;
1414

1515
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
1616
public class ConcurrencyTest {
1717

18-
private IntegrationTest integrationTest = new IntegrationTest();
18+
public static final int NUMBER_OF_RESOURCES_CREATED = 35;
19+
public static final int NUMBER_OF_RESOURCES_DELETED = 10;
20+
public static final int NUMBER_OF_RESOURCES_UPDATED = 15;
21+
public static final String UPDATED_SUFFIX = "_updated";
22+
private IntegrationTestSupport integrationTest = new IntegrationTestSupport();
1923

2024
@BeforeAll
2125
public void setup() {
22-
integrationTest.setup();
26+
integrationTest.initialize();
2327
}
2428

2529
@BeforeEach
@@ -32,70 +36,60 @@ public void teardown() {
3236
integrationTest.teardown();
3337
}
3438

39+
3540
@Test
36-
public void manyResourcesGetCreatedAndUpdated() {
37-
for (int i = 0; i < 35; i++) {
38-
TestCustomResource tcr = createTCR(String.valueOf(i));
39-
integrationTest.crOperations.inNamespace(IntegrationTest.TEST_NAMESPACE).create(tcr);
40-
// if (i % 3 == 0) {
41-
// TestCustomResource newTcr = createTCR(String.valueOf(i));
42-
// integrationTest.crOperations.inNamespace(IntegrationTest.TEST_NAMESPACE).createOrReplace(newTcr);
43-
// }
41+
public void manyResourcesGetCreatedUpdatedAndDeleted() {
42+
for (int i = 0; i < NUMBER_OF_RESOURCES_CREATED; i++) {
43+
TestCustomResource tcr = integrationTest.createTestCustomResource(String.valueOf(i));
44+
integrationTest.getCrOperations().inNamespace(TEST_NAMESPACE).create(tcr);
4445
}
46+
4547
Awaitility.await().atMost(1, TimeUnit.MINUTES)
4648
.untilAsserted(() -> {
47-
List<ConfigMap> items = integrationTest.k8sClient.configMaps()
48-
.inNamespace(IntegrationTest.TEST_NAMESPACE)
49+
List<ConfigMap> items = integrationTest.getK8sClient().configMaps()
50+
.inNamespace(TEST_NAMESPACE)
4951
.list().getItems();
5052
assertThat(items).hasSize(35);
5153
});
52-
}
53-
5454

55-
@Test
56-
public void manyResourcesGetCreatedUpdatedAndDeleted() {
57-
for (int i = 0; i < 35; i++) {
58-
TestCustomResource tcr = createTCR(String.valueOf(i));
59-
integrationTest.crOperations.inNamespace(IntegrationTest.TEST_NAMESPACE).create(tcr);
60-
// if (i % 3 == 0) {
61-
// TestCustomResource newTcr = createTCR(String.valueOf(i));
62-
// integrationTest.crOperations.inNamespace(IntegrationTest.TEST_NAMESPACE).createOrReplace(newTcr);
63-
// }
55+
// update some resources
56+
for (int i = 0; i < NUMBER_OF_RESOURCES_UPDATED; i++) {
57+
TestCustomResource tcr = integrationTest.createTestCustomResource(String.valueOf(i));
58+
tcr.getSpec().setValue(i + UPDATED_SUFFIX);
59+
integrationTest.getCrOperations().inNamespace(TEST_NAMESPACE).createOrReplace(tcr);
6460
}
6561

6662
Awaitility.await().atMost(1, TimeUnit.MINUTES)
6763
.untilAsserted(() -> {
68-
List<ConfigMap> items = integrationTest.k8sClient.configMaps()
69-
.inNamespace(IntegrationTest.TEST_NAMESPACE)
64+
List<TestCustomResource> crs = integrationTest.getCrOperations()
65+
.inNamespace(TEST_NAMESPACE)
7066
.list().getItems();
71-
assertThat(items).hasSize(35);
67+
for (int i = 0; i < NUMBER_OF_RESOURCES_UPDATED; i++) {
68+
final int k = i;
69+
TestCustomResource testCustomResource = crs.stream().filter(c -> c.getMetadata().getName().equals(TEST_CUSTOM_RESOURCE_PREFIX + k)).findFirst().get();
70+
assertThat(testCustomResource.getSpec().getValue()).isEqualTo(i + UPDATED_SUFFIX);
71+
}
7272
});
7373

74-
for (int i = 0; i < 10; i++) {
75-
TestCustomResource tcr = createTCR(String.valueOf(i));
76-
integrationTest.crOperations.inNamespace(IntegrationTest.TEST_NAMESPACE).delete(tcr);
74+
// deleting some resources
75+
for (int i = 0; i < NUMBER_OF_RESOURCES_DELETED; i++) {
76+
TestCustomResource tcr = integrationTest.createTestCustomResource(String.valueOf(i));
77+
integrationTest.getCrOperations().inNamespace(TEST_NAMESPACE).delete(tcr);
7778
}
7879

7980
Awaitility.await().atMost(1, TimeUnit.MINUTES)
8081
.untilAsserted(() -> {
81-
List<ConfigMap> items = integrationTest.k8sClient.configMaps()
82-
.inNamespace(IntegrationTest.TEST_NAMESPACE)
82+
List<ConfigMap> items = integrationTest.getK8sClient().configMaps()
83+
.inNamespace(TEST_NAMESPACE)
84+
.list().getItems();
85+
assertThat(items).hasSize(NUMBER_OF_RESOURCES_CREATED - NUMBER_OF_RESOURCES_DELETED);
86+
87+
List<TestCustomResource> crs = integrationTest.getCrOperations()
88+
.inNamespace(TEST_NAMESPACE)
8389
.list().getItems();
84-
assertThat(items).hasSize(25);
90+
assertThat(crs).hasSize(NUMBER_OF_RESOURCES_CREATED - NUMBER_OF_RESOURCES_DELETED);
8591
});
8692
}
8793

88-
private TestCustomResource createTCR(String id) {
89-
TestCustomResource resource = new TestCustomResource();
90-
resource.setMetadata(new ObjectMetaBuilder()
91-
.withName("test-custom-resource-" + id)
92-
.withNamespace(IntegrationTest.TEST_NAMESPACE)
93-
.build());
94-
resource.setKind("CustomService");
95-
resource.setSpec(new TestCustomResourceSpec());
96-
resource.getSpec().setConfigMapName("test-config-map-" + id);
97-
resource.getSpec().setKey("test-key");
98-
resource.getSpec().setValue(id);
99-
return resource;
100-
}
94+
10195
}

operator-framework/src/test/java/com/github/containersolutions/operator/IntegrationTest.java

Lines changed: 11 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,43 @@
11
package com.github.containersolutions.operator;
22

3-
import com.github.containersolutions.operator.sample.*;
3+
import com.github.containersolutions.operator.sample.TestCustomResource;
4+
import com.github.containersolutions.operator.sample.TestCustomResourceSpec;
45
import io.fabric8.kubernetes.api.model.ConfigMap;
5-
import io.fabric8.kubernetes.api.model.NamespaceBuilder;
66
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
7-
import io.fabric8.kubernetes.api.model.apiextensions.CustomResourceDefinition;
8-
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
9-
import io.fabric8.kubernetes.client.KubernetesClient;
10-
import io.fabric8.kubernetes.client.dsl.MixedOperation;
11-
import io.fabric8.kubernetes.client.dsl.Resource;
127
import io.fabric8.kubernetes.client.utils.Serialization;
13-
import io.fabric8.kubernetes.internal.KubernetesDeserializer;
148
import org.junit.jupiter.api.*;
15-
import org.mockito.internal.matchers.Any;
169
import org.slf4j.Logger;
1710
import org.slf4j.LoggerFactory;
1811

1912
import java.io.IOException;
2013
import java.io.InputStream;
2114
import java.util.concurrent.TimeUnit;
2215

16+
import static com.github.containersolutions.operator.IntegrationTestSupport.TEST_NAMESPACE;
2317
import static org.assertj.core.api.Assertions.assertThat;
2418
import static org.awaitility.Awaitility.await;
2519

2620
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
2721
public class IntegrationTest {
2822

29-
public static final String TEST_NAMESPACE = "java-operator-sdk-int-test";
30-
31-
public final KubernetesClient k8sClient = new DefaultKubernetesClient();
32-
public MixedOperation<TestCustomResource, TestCustomResourceList, TestCustomResourceDoneable, Resource<TestCustomResource, TestCustomResourceDoneable>> crOperations;
33-
34-
private final Logger log = LoggerFactory.getLogger(getClass());
23+
private final static Logger log = LoggerFactory.getLogger(IntegrationTest.class);
24+
private IntegrationTestSupport integrationTestSupport = new IntegrationTestSupport();
3525

3626
private Operator operator;
3727

3828
@BeforeAll
3929
public void setup() {
40-
log.info("Running integration test in namespace " + TEST_NAMESPACE);
41-
42-
CustomResourceDefinition crd = loadYaml(CustomResourceDefinition.class, "test-crd.yaml");
43-
k8sClient.customResourceDefinitions().createOrReplace(crd);
44-
45-
if (k8sClient.namespaces().withName(TEST_NAMESPACE).get() == null) {
46-
k8sClient.namespaces().create(new NamespaceBuilder()
47-
.withMetadata(new ObjectMetaBuilder().withName(TEST_NAMESPACE).build()).build());
48-
}
49-
50-
operator = new Operator(k8sClient);
51-
operator.registerController(new TestCustomResourceController());
52-
30+
integrationTestSupport.initialize();
5331
}
5432

5533
@BeforeEach
5634
public void cleanup() {
57-
58-
CustomResourceDefinition crd = loadYaml(CustomResourceDefinition.class, "test-crd.yaml");
59-
k8sClient.customResourceDefinitions().createOrReplace(crd);
60-
KubernetesDeserializer.registerCustomKind(crd.getApiVersion(), crd.getKind(), TestCustomResource.class);
61-
62-
k8sClient.configMaps().inNamespace(TEST_NAMESPACE)
63-
.withLabel("managedBy", TestCustomResourceController.class.getSimpleName())
64-
.delete();
65-
66-
crOperations = k8sClient.customResources(crd, TestCustomResource.class, TestCustomResourceList.class, TestCustomResourceDoneable.class);
67-
crOperations.inNamespace(TEST_NAMESPACE).delete(crOperations.list().getItems());
68-
//we depend on the actual operator from the startup to handle the finalizers and clean up
69-
//resources from previous test runs
70-
71-
await("all resources cleaned up").atMost(60, TimeUnit.SECONDS)
72-
.untilAsserted(() -> {
73-
assertThat(crOperations.inNamespace(TEST_NAMESPACE).list().getItems()).isEmpty();
74-
assertThat(k8sClient.configMaps().inNamespace(TEST_NAMESPACE).list().getItems()).isEmpty();
75-
});
76-
77-
log.info("Cleaned up namespace " + TEST_NAMESPACE);
35+
integrationTestSupport.cleanup();
7836
}
7937

8038
@AfterAll
8139
public void teardown() {
82-
// CustomResourceDefinition crd = loadYaml(CustomResourceDefinition.class, "test-crd.yaml");
83-
// k8sClient.customResourceDefinitions().delete(crd);
84-
operator.stop();
40+
integrationTestSupport.teardown();
8541
}
8642

8743
@Test
@@ -96,18 +52,18 @@ public void configMapGetsCreatedForTestCustomResource() {
9652
resource.getSpec().setConfigMapName("test-config-map");
9753
resource.getSpec().setKey("test-key");
9854
resource.getSpec().setValue("test-value");
99-
crOperations.inNamespace(TEST_NAMESPACE).create(resource);
55+
integrationTestSupport.getCrOperations().inNamespace(TEST_NAMESPACE).create(resource);
10056

10157
await("configmap created").atMost(5, TimeUnit.SECONDS)
10258
.untilAsserted(() -> {
103-
ConfigMap configMap = k8sClient.configMaps().inNamespace(TEST_NAMESPACE)
59+
ConfigMap configMap = integrationTestSupport.getK8sClient().configMaps().inNamespace(TEST_NAMESPACE)
10460
.withName("test-config-map").get();
10561
assertThat(configMap).isNotNull();
10662
assertThat(configMap.getData().get("test-key")).isEqualTo("test-value");
10763
});
10864
await("cr status updated").atMost(5, TimeUnit.SECONDS)
10965
.untilAsserted(() -> {
110-
TestCustomResource cr = crOperations.inNamespace(TEST_NAMESPACE).withName("test-custom-resource").get();
66+
TestCustomResource cr = integrationTestSupport.getCrOperations().inNamespace(TEST_NAMESPACE).withName("test-custom-resource").get();
11167
assertThat(cr).isNotNull();
11268
assertThat(cr.getStatus()).isNotNull();
11369
assertThat(cr.getStatus().getConfigMapStatus()).isEqualTo("ConfigMap Ready");

0 commit comments

Comments
 (0)