Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions samples/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@
<modules>
<module>spring-boot-auto-config</module>
<module>common</module>
<module>webpage</module>
</modules>
</project>
2 changes: 1 addition & 1 deletion samples/spring-boot-auto-config/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<artifactId>operator-framework-spring-boot-starter-samples-auto-configuration</artifactId>
<packaging>jar</packaging>
<name>Java Operator SDK Spring Boot Starter - Samples - Auto Configuration</name>
<description>Sample usage with Spring Boot</description>
<description>Webapp Sample with Spring Boot</description>

<dependencies>
<dependency>
Expand Down
18 changes: 18 additions & 0 deletions samples/webpage/k8s/webpage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: "sample.javaoperatorsdk/v1"
kind: WebPage
metadata:
# Use labels to match the resource with different reconciler implementations:
# labels:
# low-level: "true"
name: hellows
spec:
exposed: false
html: |
<html>
<head>
<title>Hello Operator World</title>
</head>
<body>
Hello World!
</body>
</html>
67 changes: 67 additions & 0 deletions samples/webpage/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-spring-boot-starter-samples-parent</artifactId>
<version>6.1.1-SNAPSHOT</version>
</parent>

<artifactId>operator-framework-spring-boot-starter-samples-webpage</artifactId>
<packaging>jar</packaging>
<name>Java Operator SDK Spring Boot Starter - Samples - WebPage</name>
<description>Sample usage with Spring Boot</description>

<dependencies>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>crd-generator-apt</artifactId>
<version>${fabric8-client.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework-spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.javaoperatorsdk.operator.springboot.starter.sample.webpage;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootStarterSampleApplication {

public static void main(String[] args) {
SpringApplication.run(SpringBootStarterSampleApplication.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package io.javaoperatorsdk.operator.springboot.starter.sample.webpage;

import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.customresource.WebPage;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.customresource.WebPageStatus;

import static io.javaoperatorsdk.operator.ReconcilerUtils.loadYaml;

public class Utils {

private Utils() {}

public static WebPage createWebPageForStatusUpdate(WebPage webPage, String configMapName) {
WebPage res = new WebPage();
res.setMetadata(
new ObjectMetaBuilder()
.withName(webPage.getMetadata().getName())
.withNamespace(webPage.getMetadata().getNamespace())
.build());
res.setStatus(createStatus(configMapName));
return res;
}

public static WebPageStatus createStatus(String configMapName) {
WebPageStatus status = new WebPageStatus();
status.setHtmlConfigMap(configMapName);
status.setAreWeGood(true);
status.setErrorMessage(null);
return status;
}

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

public static String deploymentName(WebPage nginx) {
return nginx.getMetadata().getName();
}

public static String serviceName(WebPage webPage) {
return webPage.getMetadata().getName();
}

public static ErrorStatusUpdateControl<WebPage> handleError(WebPage resource, Exception e) {
resource.getStatus().setErrorMessage("Error: " + e.getMessage());
return ErrorStatusUpdateControl.patchStatus(resource);
}

public static Ingress makeDesiredIngress(WebPage webPage) {
Ingress ingress = loadYaml(Ingress.class, Utils.class, "ingress.yaml");
ingress.getMetadata().setName(webPage.getMetadata().getName());
ingress.getMetadata().setNamespace(webPage.getMetadata().getNamespace());
ingress
.getSpec()
.getRules()
.get(0)
.getHttp()
.getPaths()
.get(0)
.getBackend()
.getService()
.setName(serviceName(webPage));
return ingress;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package io.javaoperatorsdk.operator.springboot.starter.sample.webpage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import io.fabric8.kubernetes.api.model.ConfigMap;
import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
import io.javaoperatorsdk.operator.api.reconciler.Workflow;
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.customresource.WebPage;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.customresource.WebPageStatus;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.dependentresource.ConfigMapDependentResource;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.dependentresource.DeploymentDependentResource;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.dependentresource.ExposedIngressCondition;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.dependentresource.IngressDependentResource;
import io.javaoperatorsdk.operator.springboot.starter.sample.webpage.dependentresource.ServiceDependentResource;

import static io.javaoperatorsdk.operator.springboot.starter.sample.webpage.Utils.createWebPageForStatusUpdate;

/** Shows how to implement a reconciler with managed dependent resources. */
@Workflow(
dependents = {
@Dependent(type = ConfigMapDependentResource.class),
@Dependent(type = DeploymentDependentResource.class),
@Dependent(type = ServiceDependentResource.class),
@Dependent(
type = IngressDependentResource.class,
reconcilePrecondition = ExposedIngressCondition.class)
})
@Component
@ControllerConfiguration(name = "webpage")
public class WebPageManagedDependentsReconciler implements Reconciler<WebPage>, Cleaner<WebPage> {

public static final String SELECTOR = "managed";

private static final Logger log =
LoggerFactory.getLogger(WebPageManagedDependentsReconciler.class);

@Override
public ErrorStatusUpdateControl<WebPage> updateErrorStatus(
WebPage resource, Context<WebPage> context, Exception e) {
return handleError(resource, e);
}

@Override
public UpdateControl<WebPage> reconcile(WebPage webPage, Context<WebPage> context) {
final var name =
context.getSecondaryResource(ConfigMap.class).orElseThrow().getMetadata().getName();

log.info("Reconciled webpage with name: {} namespace: {}",
webPage.getMetadata().getName(), webPage.getMetadata().getNamespace());

return UpdateControl.patchStatus(createWebPageForStatusUpdate(webPage, name));
}

private static ErrorStatusUpdateControl<WebPage> handleError(WebPage resource, Exception e) {
if (resource.getStatus() == null) {
resource.setStatus(new WebPageStatus());
}
resource.getStatus().setErrorMessage("Error: " + e.getMessage());
return ErrorStatusUpdateControl.patchStatus(resource);
}

@Override
public DeleteControl cleanup(WebPage resource, Context<WebPage> context) {
return DeleteControl.defaultDelete();
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.javaoperatorsdk.operator.springboot.starter.sample.webpage.customresource;

import io.fabric8.kubernetes.api.model.Namespaced;
import io.fabric8.kubernetes.client.CustomResource;
import io.fabric8.kubernetes.model.annotation.Group;
import io.fabric8.kubernetes.model.annotation.Version;

@Group("sample.javaoperatorsdk")
@Version("v1")
public class WebPage extends CustomResource<WebPageSpec, WebPageStatus> implements Namespaced {

@Override
public String toString() {
return "WebPage{" + "spec=" + spec + ", status=" + status + '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.javaoperatorsdk.operator.springboot.starter.sample.webpage.customresource;

public class WebPageSpec {

private String html;
private Boolean exposed = false;

public String getHtml() {
return html;
}

public void setHtml(String html) {
this.html = html;
}

public Boolean getExposed() {
return exposed;
}

public WebPageSpec setExposed(Boolean exposed) {
this.exposed = exposed;
return this;
}

@Override
public String toString() {
return "WebPageSpec{" + "html='" + html + '\'' + '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.javaoperatorsdk.operator.springboot.starter.sample.webpage.customresource;

public class WebPageStatus {

private String htmlConfigMap;

private Boolean areWeGood;

private String errorMessage;

public String getHtmlConfigMap() {
return htmlConfigMap;
}

public void setHtmlConfigMap(String htmlConfigMap) {
this.htmlConfigMap = htmlConfigMap;
}

public Boolean getAreWeGood() {
return areWeGood;
}

public void setAreWeGood(Boolean areWeGood) {
this.areWeGood = areWeGood;
}

public String getErrorMessage() {
return errorMessage;
}

public WebPageStatus setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
return this;
}

@Override
public String toString() {
return "WebPageStatus{"
+ "htmlConfigMap='"
+ htmlConfigMap
+ '\''
+ ", areWeGood='"
+ areWeGood
+ '\''
+ ", errorMessage='"
+ errorMessage
+ '\''
+ '}';
}
}
Loading