Skip to content

Commit c2ef3ef

Browse files
authored
WebPage E2E Improvement (#1226)
1 parent 9136f31 commit c2ef3ef

10 files changed

+106
-34
lines changed

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/ConfigMapDependentResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
// this annotation only activates when using managed dependents and is not otherwise needed
2121
@KubernetesDependent(labelSelector = SELECTOR)
22-
class ConfigMapDependentResource extends CRUKubernetesDependentResource<ConfigMap, WebPage> {
22+
public class ConfigMapDependentResource extends CRUKubernetesDependentResource<ConfigMap, WebPage> {
2323

2424
private static final Logger log = LoggerFactory.getLogger(ConfigMapDependentResource.class);
2525

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/DeploymentDependentResource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
// this annotation only activates when using managed dependents and is not otherwise needed
1818
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
19-
class DeploymentDependentResource extends CRUKubernetesDependentResource<Deployment, WebPage> {
19+
public class DeploymentDependentResource
20+
extends CRUKubernetesDependentResource<Deployment, WebPage> {
2021

2122
public DeploymentDependentResource() {
2223
super(Deployment.class);

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/ServiceDependentResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
// this annotation only activates when using managed dependents and is not otherwise needed
1717
@KubernetesDependent(labelSelector = WebPageManagedDependentsReconciler.SELECTOR)
18-
class ServiceDependentResource extends CRUKubernetesDependentResource<Service, WebPage> {
18+
public class ServiceDependentResource extends CRUKubernetesDependentResource<Service, WebPage> {
1919

2020
public ServiceDependentResource() {
2121
super(Service.class);

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPage.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@
1010
public class WebPage extends CustomResource<WebPageSpec, WebPageStatus>
1111
implements Namespaced {
1212

13-
@Override
14-
protected WebPageStatus initStatus() {
15-
return new WebPageStatus();
16-
}
17-
1813
@Override
1914
public String toString() {
2015
return "WebPage{" +

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageManagedDependentsReconciler.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@
1212
import static io.javaoperatorsdk.operator.sample.Utils.createStatus;
1313
import static io.javaoperatorsdk.operator.sample.Utils.handleError;
1414
import static io.javaoperatorsdk.operator.sample.Utils.simulateErrorIfRequested;
15-
import static io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler.SELECTOR;
1615

1716
/**
1817
* Shows how to implement a reconciler with managed dependent resources.
1918
*/
2019
@ControllerConfiguration(
21-
labelSelector = SELECTOR,
2220
dependents = {
2321
@Dependent(type = ConfigMapDependentResource.class),
2422
@Dependent(type = DeploymentDependentResource.class),
@@ -27,7 +25,7 @@
2725
public class WebPageManagedDependentsReconciler
2826
implements Reconciler<WebPage>, ErrorStatusHandler<WebPage> {
2927

30-
static final String SELECTOR = "managed";
28+
public static final String SELECTOR = "managed";
3129

3230
@Override
3331
public ErrorStatusUpdateControl<WebPage> updateErrorStatus(WebPage resource,

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717

1818
public class WebPageOperator {
1919
public static final String WEBPAGE_RECONCILER_ENV = "WEBPAGE_RECONCILER";
20-
public static final String WEBPAGE_RECONCILER_ENV_VALUE = "classic";
20+
public static final String WEBPAGE_CLASSIC_RECONCILER_ENV_VALUE = "classic";
21+
public static final String WEBPAGE_MANAGED_DEPENDENT_RESOURCE_ENV_VALUE = "managed";
2122
private static final Logger log = LoggerFactory.getLogger(WebPageOperator.class);
2223

2324

@@ -27,8 +28,12 @@ public static void main(String[] args) throws IOException {
2728
Config config = new ConfigBuilder().withNamespace(null).build();
2829
KubernetesClient client = new DefaultKubernetesClient(config);
2930
Operator operator = new Operator(client);
30-
if (WEBPAGE_RECONCILER_ENV_VALUE.equals(System.getenv(WEBPAGE_RECONCILER_ENV))) {
31+
String reconcilerEnvVar = System.getenv(WEBPAGE_RECONCILER_ENV);
32+
if (WEBPAGE_CLASSIC_RECONCILER_ENV_VALUE.equals(reconcilerEnvVar)) {
3133
operator.register(new WebPageReconciler(client));
34+
} else if (WEBPAGE_MANAGED_DEPENDENT_RESOURCE_ENV_VALUE
35+
.equals(reconcilerEnvVar)) {
36+
operator.register(new WebPageManagedDependentsReconciler());
3237
} else {
3338
operator.register(new WebPageStandaloneDependentsReconciler(client));
3439
}

sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorAbstractTest.java

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.net.http.HttpRequest;
88
import java.net.http.HttpResponse;
99
import java.time.Duration;
10-
import java.util.Objects;
1110

1211
import org.junit.jupiter.api.Test;
1312
import org.slf4j.Logger;
@@ -27,10 +26,15 @@
2726

2827
public abstract class WebPageOperatorAbstractTest {
2928

30-
static final Logger log = LoggerFactory.getLogger(WebPageOperatorDependentResourcesE2E.class);
29+
static final Logger log =
30+
LoggerFactory.getLogger(WebPageOperatorStandaloneDependentResourcesE2E.class);
3131

3232
static final KubernetesClient client = new DefaultKubernetesClient();
3333
public static final String TEST_PAGE = "test-page";
34+
public static final String TITLE1 = "Hello Operator World";
35+
public static final String TITLE2 = "Hello Operator World Title 2";
36+
public static final int WAIT_SECONDS = 20;
37+
public static final Duration POLL_INTERVAL = Duration.ofSeconds(1);
3438

3539
boolean isLocal() {
3640
String deployment = System.getProperty("test.deployment");
@@ -42,24 +46,42 @@ boolean isLocal() {
4246
@Test
4347
void testAddingWebPage() {
4448

45-
var webPage = createWebPage();
49+
var webPage = createWebPage(TITLE1);
4650
operator().create(WebPage.class, webPage);
4751

4852
await()
49-
.atMost(Duration.ofSeconds(20))
50-
.pollInterval(Duration.ofSeconds(1))
51-
.until(
53+
.atMost(Duration.ofSeconds(WAIT_SECONDS))
54+
.pollInterval(POLL_INTERVAL)
55+
.untilAsserted(
5256
() -> {
5357
var actual = operator().get(WebPage.class, TEST_PAGE);
5458
var deployment = operator().get(Deployment.class, deploymentName(webPage));
5559

56-
return Boolean.TRUE.equals(actual.getStatus().getAreWeGood())
57-
&& Objects.equals(deployment.getSpec().getReplicas(),
58-
deployment.getStatus().getReadyReplicas());
60+
assertThat(actual.getStatus().getAreWeGood()).isTrue();
61+
assertThat(deployment.getSpec().getReplicas())
62+
.isEqualTo(deployment.getStatus().getReadyReplicas());
5963
});
60-
61-
String response = httpGetForWebPage(webPage);
62-
assertThat(response).contains("<title>Hello Operator World</title>");
64+
assertThat(httpGetForWebPage(webPage)).contains(TITLE1);
65+
66+
// update part: changing title
67+
operator().replace(WebPage.class, createWebPage(TITLE2));
68+
69+
await().atMost(Duration.ofSeconds(WAIT_SECONDS))
70+
.pollInterval(POLL_INTERVAL)
71+
.untilAsserted(() -> {
72+
String page = httpGetForWebPage(webPage);
73+
assertThat(page).isNotNull().contains(TITLE2);
74+
});
75+
76+
// delete part: deleting webpage
77+
operator().delete(WebPage.class, createWebPage(TITLE2));
78+
79+
await().atMost(Duration.ofSeconds(WAIT_SECONDS))
80+
.pollInterval(POLL_INTERVAL)
81+
.untilAsserted(() -> {
82+
Deployment deployment = operator().get(Deployment.class, deploymentName(webPage));
83+
assertThat(deployment).isNull();
84+
});
6385
}
6486

6587
String httpGetForWebPage(WebPage webPage) {
@@ -75,7 +97,7 @@ String httpGetForWebPage(WebPage webPage) {
7597
.uri(new URI("http://localhost:" + portForward.getLocalPort())).build();
7698
return httpClient.send(request, HttpResponse.BodyHandlers.ofString()).body();
7799
} catch (URISyntaxException | IOException | InterruptedException e) {
78-
throw new IllegalStateException(e);
100+
return null;
79101
} finally {
80102
if (portForward != null) {
81103
try {
@@ -87,7 +109,7 @@ String httpGetForWebPage(WebPage webPage) {
87109
}
88110
}
89111

90-
WebPage createWebPage() {
112+
WebPage createWebPage(String title) {
91113
WebPage webPage = new WebPage();
92114
webPage.setMetadata(new ObjectMeta());
93115
webPage.getMetadata().setName(TEST_PAGE);
@@ -98,7 +120,7 @@ WebPage createWebPage() {
98120
.setHtml(
99121
"<html>\n"
100122
+ " <head>\n"
101-
+ " <title>Hello Operator World</title>\n"
123+
+ " <title>" + title + "</title>\n"
102124
+ " </head>\n"
103125
+ " <body>\n"
104126
+ " Hello World! \n"

sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorE2E.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import io.javaoperatorsdk.operator.junit.ClusterOperatorExtension;
1414
import io.javaoperatorsdk.operator.junit.LocalOperatorExtension;
1515

16+
import static io.javaoperatorsdk.operator.sample.WebPageOperator.WEBPAGE_CLASSIC_RECONCILER_ENV_VALUE;
1617
import static io.javaoperatorsdk.operator.sample.WebPageOperator.WEBPAGE_RECONCILER_ENV;
17-
import static io.javaoperatorsdk.operator.sample.WebPageOperator.WEBPAGE_RECONCILER_ENV_VALUE;
1818
import static io.javaoperatorsdk.operator.sample.WebPageReconciler.lowLevelLabel;
1919

2020
class WebPageOperatorE2E extends WebPageOperatorAbstractTest {
@@ -40,7 +40,8 @@ public WebPageOperatorE2E() throws FileNotFoundException {}
4040
container.setEnv(new ArrayList<>());
4141
}
4242
container.getEnv().add(
43-
new EnvVar(WEBPAGE_RECONCILER_ENV, WEBPAGE_RECONCILER_ENV_VALUE, null));
43+
new EnvVar(WEBPAGE_RECONCILER_ENV, WEBPAGE_CLASSIC_RECONCILER_ENV_VALUE,
44+
null));
4445
})
4546
.build();
4647

@@ -51,8 +52,8 @@ AbstractOperatorExtension operator() {
5152
}
5253

5354
@Override
54-
WebPage createWebPage() {
55-
WebPage page = super.createWebPage();
55+
WebPage createWebPage(String title) {
56+
WebPage page = super.createWebPage(title);
5657
page.getMetadata().setLabels(lowLevelLabel());
5758
return page;
5859
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.javaoperatorsdk.operator.sample;
2+
3+
import java.io.FileInputStream;
4+
import java.io.FileNotFoundException;
5+
import java.util.ArrayList;
6+
7+
import org.junit.jupiter.api.extension.RegisterExtension;
8+
9+
import io.fabric8.kubernetes.api.model.Container;
10+
import io.fabric8.kubernetes.api.model.EnvVar;
11+
import io.fabric8.kubernetes.api.model.apps.Deployment;
12+
import io.javaoperatorsdk.operator.junit.AbstractOperatorExtension;
13+
import io.javaoperatorsdk.operator.junit.ClusterOperatorExtension;
14+
import io.javaoperatorsdk.operator.junit.LocalOperatorExtension;
15+
16+
import static io.javaoperatorsdk.operator.sample.WebPageOperator.*;
17+
18+
class WebPageOperatorManagedDependentResourcesE2E extends WebPageOperatorAbstractTest {
19+
20+
public WebPageOperatorManagedDependentResourcesE2E() throws FileNotFoundException {}
21+
22+
@RegisterExtension
23+
AbstractOperatorExtension operator =
24+
isLocal()
25+
? LocalOperatorExtension.builder()
26+
.waitForNamespaceDeletion(false)
27+
.withReconciler(new WebPageManagedDependentsReconciler())
28+
.build()
29+
: ClusterOperatorExtension.builder()
30+
.waitForNamespaceDeletion(false)
31+
.withOperatorDeployment(client.load(new FileInputStream("k8s/operator.yaml")).get(),
32+
resources -> {
33+
Deployment deployment = (Deployment) resources.stream()
34+
.filter(r -> r instanceof Deployment).findFirst().orElseThrow();
35+
Container container =
36+
deployment.getSpec().getTemplate().getSpec().getContainers().get(0);
37+
if (container.getEnv() == null) {
38+
container.setEnv(new ArrayList<>());
39+
}
40+
container.getEnv().add(
41+
new EnvVar(WEBPAGE_RECONCILER_ENV,
42+
WEBPAGE_MANAGED_DEPENDENT_RESOURCE_ENV_VALUE, null));
43+
})
44+
.build();
45+
46+
@Override
47+
AbstractOperatorExtension operator() {
48+
return operator;
49+
}
50+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
import io.javaoperatorsdk.operator.junit.ClusterOperatorExtension;
1010
import io.javaoperatorsdk.operator.junit.LocalOperatorExtension;
1111

12-
class WebPageOperatorDependentResourcesE2E extends WebPageOperatorAbstractTest {
12+
class WebPageOperatorStandaloneDependentResourcesE2E extends WebPageOperatorAbstractTest {
1313

14-
public WebPageOperatorDependentResourcesE2E() throws FileNotFoundException {}
14+
public WebPageOperatorStandaloneDependentResourcesE2E() throws FileNotFoundException {}
1515

1616
@RegisterExtension
1717
AbstractOperatorExtension operator =

0 commit comments

Comments
 (0)