Skip to content

Commit 73cd3cb

Browse files
committed
feat: managed dependent webpage sample
1 parent c350d18 commit 73cd3cb

12 files changed

+94
-26
lines changed

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,53 +9,53 @@ public class Utils {
99

1010
private Utils() {}
1111

12-
static WebPageStatus createStatus(String configMapName) {
12+
public static WebPageStatus createStatus(String configMapName) {
1313
WebPageStatus status = new WebPageStatus();
1414
status.setHtmlConfigMap(configMapName);
1515
status.setAreWeGood(true);
1616
status.setErrorMessage(null);
1717
return status;
1818
}
1919

20-
static String configMapName(WebPage nginx) {
20+
public static String configMapName(WebPage nginx) {
2121
return nginx.getMetadata().getName() + "-html";
2222
}
2323

24-
static String deploymentName(WebPage nginx) {
24+
public static String deploymentName(WebPage nginx) {
2525
return nginx.getMetadata().getName();
2626
}
2727

28-
static String serviceName(WebPage webPage) {
28+
public static String serviceName(WebPage webPage) {
2929
return webPage.getMetadata().getName();
3030
}
3131

32-
static ErrorStatusUpdateControl<WebPage> handleError(WebPage resource, Exception e) {
32+
public static ErrorStatusUpdateControl<WebPage> handleError(WebPage resource, Exception e) {
3333
resource.getStatus().setErrorMessage("Error: " + e.getMessage());
3434
return ErrorStatusUpdateControl.updateStatus(resource);
3535
}
3636

37-
static void simulateErrorIfRequested(WebPage webPage) throws ErrorSimulationException {
37+
public static void simulateErrorIfRequested(WebPage webPage) throws ErrorSimulationException {
3838
if (webPage.getSpec().getHtml().contains("error")) {
3939
// special case just to showcase error if doing a demo
4040
throw new ErrorSimulationException("Simulating error");
4141
}
4242
}
4343

44-
static boolean isValidHtml(WebPage webPage) {
44+
public static boolean isValidHtml(WebPage webPage) {
4545
// very dummy html validation
4646
var lowerCaseHtml = webPage.getSpec().getHtml().toLowerCase();
4747
return lowerCaseHtml.contains("<html>") && lowerCaseHtml.contains("</html>");
4848
}
4949

50-
static WebPage setInvalidHtmlErrorMessage(WebPage webPage) {
50+
public static WebPage setInvalidHtmlErrorMessage(WebPage webPage) {
5151
if (webPage.getStatus() == null) {
5252
webPage.setStatus(new WebPageStatus());
5353
}
5454
webPage.getStatus().setErrorMessage("Invalid html.");
5555
return webPage;
5656
}
5757

58-
static Ingress makeDesiredIngress(WebPage webPage) {
58+
public static Ingress makeDesiredIngress(WebPage webPage) {
5959
Ingress ingress = loadYaml(Ingress.class, Utils.class, "ingress.yaml");
6060
ingress.getMetadata().setName(webPage.getMetadata().getName());
6161
ingress.getMetadata().setNamespace(webPage.getMetadata().getNamespace());

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@
88
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
99
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
1010
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
11+
import io.javaoperatorsdk.operator.sample.dependents.ConfigMapDependentResource;
12+
import io.javaoperatorsdk.operator.sample.dependents.DeploymentDependentResource;
13+
import io.javaoperatorsdk.operator.sample.dependents.ServiceDependentResource;
1114

1215
import static io.javaoperatorsdk.operator.sample.Utils.createStatus;
1316
import static io.javaoperatorsdk.operator.sample.Utils.handleError;
1417
import static io.javaoperatorsdk.operator.sample.Utils.simulateErrorIfRequested;
15-
import static io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler.SELECTOR;
1618

1719
/**
1820
* Shows how to implement a reconciler with managed dependent resources.
1921
*/
2022
@ControllerConfiguration(
21-
labelSelector = SELECTOR,
2223
dependents = {
2324
@Dependent(type = ConfigMapDependentResource.class),
2425
@Dependent(type = DeploymentDependentResource.class),
@@ -27,7 +28,7 @@
2728
public class WebPageManagedDependentsReconciler
2829
implements Reconciler<WebPage>, ErrorStatusHandler<WebPage> {
2930

30-
static final String SELECTOR = "managed";
31+
public static final String SELECTOR = "managed";
3132

3233
@Override
3334
public ErrorStatusUpdateControl<WebPage> updateErrorStatus(WebPage resource,

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

Lines changed: 6 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,11 @@ 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+
if (WEBPAGE_CLASSIC_RECONCILER_ENV_VALUE.equals(System.getenv(WEBPAGE_RECONCILER_ENV))) {
3132
operator.register(new WebPageReconciler(client));
33+
} else if (WEBPAGE_MANAGED_DEPENDENT_RESOURCE_ENV_VALUE
34+
.equals(System.getenv(WEBPAGE_RECONCILER_ENV))) {
35+
operator.register(new WebPageManagedDependentsReconciler());
3236
} else {
3337
operator.register(new WebPageStandaloneDependentsReconciler(client));
3438
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import java.util.Arrays;
44
import java.util.Map;
55

6+
import io.javaoperatorsdk.operator.sample.dependents.ConfigMapDependentResource;
7+
import io.javaoperatorsdk.operator.sample.dependents.DeploymentDependentResource;
8+
import io.javaoperatorsdk.operator.sample.dependents.IngressDependentResource;
9+
import io.javaoperatorsdk.operator.sample.dependents.ServiceDependentResource;
610
import org.slf4j.Logger;
711
import org.slf4j.LoggerFactory;
812

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package io.javaoperatorsdk.operator.sample;
1+
package io.javaoperatorsdk.operator.sample.dependents;
22

33
import java.util.HashMap;
44
import java.util.Map;
55

6+
import io.javaoperatorsdk.operator.sample.WebPage;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
89

@@ -19,7 +20,7 @@
1920

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

2425
private static final Logger log = LoggerFactory.getLogger(ConfigMapDependentResource.class);
2526

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator.sample;
1+
package io.javaoperatorsdk.operator.sample.dependents;
22

33
import java.util.HashMap;
44
import java.util.Map;
@@ -8,6 +8,8 @@
88
import io.javaoperatorsdk.operator.api.reconciler.Context;
99
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
1010
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
11+
import io.javaoperatorsdk.operator.sample.WebPage;
12+
import io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler;
1113

1214
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
1315
import static io.javaoperatorsdk.operator.sample.Utils.configMapName;
@@ -16,7 +18,7 @@
1618

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

2123
public DeploymentDependentResource() {
2224
super(Deployment.class);

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/IngressDependentResource.java renamed to sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/dependents/IngressDependentResource.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package io.javaoperatorsdk.operator.sample;
1+
package io.javaoperatorsdk.operator.sample.dependents;
22

33
import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
44
import io.javaoperatorsdk.operator.api.reconciler.Context;
55
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
66
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
7+
import io.javaoperatorsdk.operator.sample.WebPage;
8+
import io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler;
79

810
import static io.javaoperatorsdk.operator.sample.Utils.*;
911

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator.sample;
1+
package io.javaoperatorsdk.operator.sample.dependents;
22

33
import java.util.HashMap;
44
import java.util.Map;
@@ -7,6 +7,8 @@
77
import io.javaoperatorsdk.operator.api.reconciler.Context;
88
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUKubernetesDependentResource;
99
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
10+
import io.javaoperatorsdk.operator.sample.WebPage;
11+
import io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler;
1012

1113
import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;
1214
import static io.javaoperatorsdk.operator.sample.Utils.deploymentName;
@@ -15,7 +17,7 @@
1517

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

2022
public ServiceDependentResource() {
2123
super(Service.class);

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

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

2828
public abstract class WebPageOperatorAbstractTest {
2929

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

3233
static final KubernetesClient client = new DefaultKubernetesClient();
3334
public static final String TEST_PAGE = "test-page";

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

Lines changed: 3 additions & 2 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

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)