Skip to content

Commit 7397be6

Browse files
authored
improve: PrimaryToSecondayMapper test improvements (#2951)
Signed-off-by: Attila Mészáros <a_meszaros@apple.com>
1 parent 14cc06c commit 7397be6

File tree

6 files changed

+82
-22
lines changed

6 files changed

+82
-22
lines changed

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/primarytosecondary/Cluster.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
@Group("sample.javaoperatorsdk")
1010
@Version("v1")
1111
@ShortNames("clu")
12-
public class Cluster extends CustomResource<Void, Void> implements Namespaced {}
12+
public class Cluster extends CustomResource<ClusterSpec, Void> implements Namespaced {}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.baseapi.primarytosecondary;
2+
3+
public class ClusterSpec {
4+
5+
private String clusterValue;
6+
7+
public String getClusterValue() {
8+
return clusterValue;
9+
}
10+
11+
public void setClusterValue(String clusterValue) {
12+
this.clusterValue = clusterValue;
13+
}
14+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/primarytosecondary/Job.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
@Group("sample.javaoperatorsdk")
1010
@Version("v1")
1111
@ShortNames("cjo")
12-
public class Job extends CustomResource<JobSpec, Void> implements Namespaced {}
12+
public class Job extends CustomResource<JobSpec, JobStatus> implements Namespaced {}

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/primarytosecondary/JobReconciler.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* needed, and to show the use cases when some mechanisms would not work without that. It's not
1818
* intended to be a reusable code as it is, rather serves for deeper understanding of the problem.
1919
*/
20-
@ControllerConfiguration()
20+
@ControllerConfiguration
2121
public class JobReconciler implements Reconciler<Job> {
2222

2323
private static final String JOB_CLUSTER_INDEX = "job-cluster-index";
@@ -38,26 +38,37 @@ public JobReconciler(boolean addPrimaryToSecondaryMapper) {
3838

3939
@Override
4040
public UpdateControl<Job> reconcile(Job resource, Context<Job> context) {
41-
41+
Cluster cluster;
4242
if (!getResourceDirectlyFromCache) {
4343
// this is only possible when there is primary to secondary mapper
44-
context
45-
.getSecondaryResource(Cluster.class)
46-
.orElseThrow(() -> new IllegalStateException("Secondary resource should be present"));
44+
cluster =
45+
context
46+
.getSecondaryResource(Cluster.class)
47+
.orElseThrow(() -> new IllegalStateException("Secondary resource should be present"));
4748
} else {
4849
// reading the resource from cache as alternative, works without primary to secondary mapper
4950
var informerEventSource =
5051
(InformerEventSource<Cluster, Job>)
5152
context.eventSourceRetriever().getEventSourceFor(Cluster.class);
52-
informerEventSource
53-
.get(
54-
new ResourceID(
55-
resource.getSpec().getClusterName(), resource.getMetadata().getNamespace()))
56-
.orElseThrow(
57-
() -> new IllegalStateException("Secondary resource cannot be read from cache"));
53+
cluster =
54+
informerEventSource
55+
.get(
56+
new ResourceID(
57+
resource.getSpec().getClusterName(), resource.getMetadata().getNamespace()))
58+
.orElseThrow(
59+
() -> new IllegalStateException("Secondary resource cannot be read from cache"));
60+
}
61+
if (resource.getStatus() == null) {
62+
resource.setStatus(new JobStatus());
5863
}
5964
numberOfExecutions.addAndGet(1);
60-
return UpdateControl.noUpdate();
65+
// copy a value to job status, to we can test triggering
66+
if (!cluster.getSpec().getClusterValue().equals(resource.getStatus().getValueFromCluster())) {
67+
resource.getStatus().setValueFromCluster(cluster.getSpec().getClusterValue());
68+
return UpdateControl.patchStatus(resource);
69+
} else {
70+
return UpdateControl.noUpdate();
71+
}
6172
}
6273

6374
@Override
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.baseapi.primarytosecondary;
2+
3+
public class JobStatus {
4+
5+
private String valueFromCluster;
6+
7+
public String getValueFromCluster() {
8+
return valueFromCluster;
9+
}
10+
11+
public void setValueFromCluster(String valueFromCluster) {
12+
this.valueFromCluster = valueFromCluster;
13+
}
14+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/primarytosecondary/PrimaryToSecondaryIT.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,50 @@ class PrimaryToSecondaryIT {
1616
public static final String CLUSTER_NAME = "cluster1";
1717
public static final int MIN_DELAY = 150;
1818

19+
public static final String CLUSTER_VALUE = "clusterValue";
20+
public static final String JOB_1 = "job1";
21+
public static final String CHANGED_VALUE = "CHANGED_VALUE";
22+
1923
@RegisterExtension
20-
LocallyRunOperatorExtension operator =
24+
LocallyRunOperatorExtension extension =
2125
LocallyRunOperatorExtension.builder()
2226
.withAdditionalCustomResourceDefinition(Cluster.class)
2327
.withReconciler(new JobReconciler())
2428
.build();
2529

2630
@Test
2731
void readsSecondaryInManyToOneCases() throws InterruptedException {
28-
operator.create(cluster());
32+
var cluster = extension.create(cluster());
2933
Thread.sleep(MIN_DELAY);
30-
operator.create(job());
34+
extension.create(job());
35+
36+
await()
37+
.pollDelay(Duration.ofMillis(300))
38+
.untilAsserted(
39+
() -> {
40+
assertThat(extension.getReconcilerOfType(JobReconciler.class).getNumberOfExecutions())
41+
.isEqualTo(1);
42+
var job = extension.get(Job.class, JOB_1);
43+
assertThat(job.getStatus()).isNotNull();
44+
assertThat(job.getStatus().getValueFromCluster()).isEqualTo(CLUSTER_VALUE);
45+
});
46+
47+
cluster.getSpec().setClusterValue(CHANGED_VALUE);
48+
extension.replace(cluster);
3149

50+
// cluster change triggers job reconciliations
3251
await()
3352
.pollDelay(Duration.ofMillis(300))
3453
.untilAsserted(
35-
() ->
36-
assertThat(
37-
operator.getReconcilerOfType(JobReconciler.class).getNumberOfExecutions())
38-
.isEqualTo(1));
54+
() -> {
55+
var job = extension.get(Job.class, JOB_1);
56+
assertThat(job.getStatus().getValueFromCluster()).isEqualTo(CHANGED_VALUE);
57+
});
3958
}
4059

4160
public static Job job() {
4261
var job = new Job();
43-
job.setMetadata(new ObjectMetaBuilder().withName("job1").build());
62+
job.setMetadata(new ObjectMetaBuilder().withName(JOB_1).build());
4463
job.setSpec(new JobSpec());
4564
job.getSpec().setClusterName(CLUSTER_NAME);
4665
return job;
@@ -49,6 +68,8 @@ public static Job job() {
4968
public static Cluster cluster() {
5069
Cluster cluster = new Cluster();
5170
cluster.setMetadata(new ObjectMetaBuilder().withName(CLUSTER_NAME).build());
71+
cluster.setSpec(new ClusterSpec());
72+
cluster.getSpec().setClusterValue(CLUSTER_VALUE);
5273
return cluster;
5374
}
5475
}

0 commit comments

Comments
 (0)