Skip to content

Commit 13fe682

Browse files
committed
external resource IT
1 parent b47def2 commit 13fe682

File tree

7 files changed

+109
-24
lines changed

7 files changed

+109
-24
lines changed

operator-framework/src/test/java/io/javaoperatorsdk/operator/BulkDependentDeleterIT.java renamed to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentDeleterIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator;
1+
package io.javaoperatorsdk.operator.bulkdependent;
22

33
import org.junit.jupiter.api.extension.RegisterExtension;
44

operator-framework/src/test/java/io/javaoperatorsdk/operator/BulkDependentTestBase.java renamed to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/BulkDependentTestBase.java

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator;
1+
package io.javaoperatorsdk.operator.bulkdependent;
22

33
import java.time.Duration;
44

@@ -75,7 +75,7 @@ private void assertAdditionalDataOnConfigMaps(String expectedValue) {
7575
});
7676
}
7777

78-
private BulkDependentTestCustomResource testResource() {
78+
public static BulkDependentTestCustomResource testResource() {
7979
BulkDependentTestCustomResource cr = new BulkDependentTestCustomResource();
8080
cr.setMetadata(new ObjectMeta());
8181
cr.getMetadata().setName(TEST_RESOURCE_NAME);
@@ -91,11 +91,24 @@ private void updateSpecWithNewAdditionalData(String data) {
9191
extension().replace(resource);
9292
}
9393

94+
public static void updateSpecWithNewAdditionalData(LocallyRunOperatorExtension extension,
95+
String data) {
96+
var resource = testResource();
97+
resource.getSpec().setAdditionalData(data);
98+
extension.replace(resource);
99+
}
100+
94101
private void updateSpecWithNumber(int n) {
95102
var resource = testResource();
96103
resource.getSpec().setNumberOfResources(n);
97104
extension().replace(resource);
98105
}
99106

107+
public static void updateSpecWithNumber(LocallyRunOperatorExtension extension, int n) {
108+
var resource = testResource();
109+
resource.getSpec().setNumberOfResources(n);
110+
extension.replace(resource);
111+
}
112+
100113
abstract LocallyRunOperatorExtension extension();
101114
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.javaoperatorsdk.operator.bulkdependent;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.RegisterExtension;
5+
6+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
7+
import io.javaoperatorsdk.operator.sample.bulkdependent.external.ExternalBulkResourceReconciler;
8+
import io.javaoperatorsdk.operator.sample.bulkdependent.external.ExternalServiceMock;
9+
10+
import static io.javaoperatorsdk.operator.bulkdependent.BulkDependentTestBase.*;
11+
import static org.assertj.core.api.Assertions.assertThat;
12+
import static org.awaitility.Awaitility.await;
13+
14+
class BulkExternalDependentIT {
15+
16+
@RegisterExtension
17+
LocallyRunOperatorExtension extension =
18+
LocallyRunOperatorExtension.builder().withReconciler(new ExternalBulkResourceReconciler())
19+
.build();
20+
21+
ExternalServiceMock externalServiceMock = ExternalServiceMock.getInstance();
22+
23+
@Test
24+
void managesExternalBulkResources() {
25+
extension.create(testResource());
26+
assertResourceNumberAndData(3, INITIAL_ADDITIONAL_DATA);
27+
28+
updateSpecWithNumber(extension, 1);
29+
assertResourceNumberAndData(1, INITIAL_ADDITIONAL_DATA);
30+
31+
updateSpecWithNumber(extension, 5);
32+
assertResourceNumberAndData(5, INITIAL_ADDITIONAL_DATA);
33+
34+
extension.delete(testResource());
35+
assertResourceNumberAndData(0, INITIAL_ADDITIONAL_DATA);
36+
}
37+
38+
39+
@Test
40+
void handlesResourceUpdates() {
41+
extension.create(testResource());
42+
assertResourceNumberAndData(3, INITIAL_ADDITIONAL_DATA);
43+
44+
updateSpecWithNewAdditionalData(extension, NEW_VERSION_OF_ADDITIONAL_DATA);
45+
assertResourceNumberAndData(3, NEW_VERSION_OF_ADDITIONAL_DATA);
46+
}
47+
48+
private void assertResourceNumberAndData(int n, String data) {
49+
await().untilAsserted(() -> {
50+
var resources = externalServiceMock.listResources();
51+
assertThat(resources).hasSize(n);
52+
assertThat(resources).allMatch(r -> r.getData().equals(data));
53+
});
54+
}
55+
56+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/ManagedBulkDependentIT.java renamed to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/ManagedBulkDependentIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator;
1+
package io.javaoperatorsdk.operator.bulkdependent;
22

33
import org.junit.jupiter.api.extension.RegisterExtension;
44

operator-framework/src/test/java/io/javaoperatorsdk/operator/StandaloneBulkDependentIT.java renamed to operator-framework/src/test/java/io/javaoperatorsdk/operator/bulkdependent/StandaloneBulkDependentIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator;
1+
package io.javaoperatorsdk.operator.bulkdependent;
22

33
import org.junit.jupiter.api.extension.RegisterExtension;
44

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java

+16-19
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
package io.javaoperatorsdk.operator.sample.bulkdependent.external;
22

3-
import java.util.HashMap;
4-
import java.util.Map;
5-
import java.util.Optional;
6-
import java.util.Set;
3+
import java.util.*;
74
import java.util.stream.Collectors;
85

96
import io.javaoperatorsdk.operator.api.reconciler.Context;
107
import io.javaoperatorsdk.operator.processing.dependent.*;
118
import io.javaoperatorsdk.operator.processing.dependent.external.PollingDependentResource;
129
import io.javaoperatorsdk.operator.processing.event.ResourceID;
13-
import io.javaoperatorsdk.operator.processing.event.source.CacheKeyMapper;
1410
import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestCustomResource;
1511

1612
public class ExternalBulkDependentResource
@@ -23,15 +19,18 @@ public class ExternalBulkDependentResource
2319
private ExternalServiceMock externalServiceMock = ExternalServiceMock.getInstance();
2420

2521
public ExternalBulkDependentResource() {
26-
super(ExternalResource.class, CacheKeyMapper.singleResourceCacheKeyMapper());
22+
super(ExternalResource.class, ExternalResource::getId);
2723
}
2824

2925
@Override
3026
public Map<ResourceID, Set<ExternalResource>> fetchResources() {
31-
// todo
3227
Map<ResourceID, Set<ExternalResource>> result = new HashMap<>();
3328
var resources = externalServiceMock.listResources();
34-
29+
resources.stream().forEach(er -> {
30+
var resourceID = toResourceID(er);
31+
result.putIfAbsent(resourceID, new HashSet<>());
32+
result.get(resourceID).add(er);
33+
});
3534
return result;
3635
}
3736

@@ -56,24 +55,17 @@ public void deleteBulkResourceWithIndex(BulkDependentTestCustomResource primary,
5655
@Override
5756
public BulkResourceDiscriminatorFactory<ExternalResource, BulkDependentTestCustomResource> bulkResourceDiscriminatorFactory() {
5857
return index -> (resource, primary, context) -> {
59-
ExternalResource collect = context.getSecondaryResources(resource).stream()
58+
return context.getSecondaryResources(resource).stream()
6059
.filter(r -> r.getId().endsWith(EXTERNAL_RESOURCE_NAME_DELIMITER + index))
61-
.collect(Collectors.collectingAndThen(
62-
Collectors.toList(),
63-
list -> {
64-
if (list.size() > 1) {
65-
throw new IllegalStateException("Found more than 1 object: " + list);
66-
}
67-
return list.get(0);
68-
}));
69-
return Optional.ofNullable(collect);
60+
.collect(Collectors.toList()).stream().findFirst();
7061
};
7162
}
7263

7364
@Override
7465
public ExternalResource desired(BulkDependentTestCustomResource primary, int index,
7566
Context<BulkDependentTestCustomResource> context) {
76-
return new ExternalResource(toExternalResourceId(primary, index), "" + index);
67+
return new ExternalResource(toExternalResourceId(primary, index),
68+
primary.getSpec().getAdditionalData());
7769
}
7870

7971
@Override
@@ -101,4 +93,9 @@ private static String toExternalResourceId(BulkDependentTestCustomResource prima
10193
primary.getMetadata().getNamespace() +
10294
EXTERNAL_RESOURCE_NAME_DELIMITER + i;
10395
}
96+
97+
private ResourceID toResourceID(ExternalResource externalResource) {
98+
var parts = externalResource.getId().split(EXTERNAL_RESOURCE_NAME_DELIMITER);
99+
return new ResourceID(parts[0], parts[1]);
100+
}
104101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.javaoperatorsdk.operator.sample.bulkdependent.external;
2+
3+
import io.javaoperatorsdk.operator.api.reconciler.Context;
4+
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
5+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
6+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
7+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
8+
import io.javaoperatorsdk.operator.sample.bulkdependent.BulkDependentTestCustomResource;
9+
10+
@ControllerConfiguration(dependents = @Dependent(type = ExternalBulkDependentResource.class))
11+
public class ExternalBulkResourceReconciler implements Reconciler<BulkDependentTestCustomResource> {
12+
13+
@Override
14+
public UpdateControl<BulkDependentTestCustomResource> reconcile(
15+
BulkDependentTestCustomResource resource, Context<BulkDependentTestCustomResource> context)
16+
throws Exception {
17+
return UpdateControl.noUpdate();
18+
}
19+
}

0 commit comments

Comments
 (0)