![JAR search and dependency download from the Maven repository](/logo.png)
io.javaoperatorsdk.operator.sample.WebappController Maven / Gradle / Ivy
package io.javaoperatorsdk.operator.sample;
import io.javaoperatorsdk.operator.api.Context;
import io.javaoperatorsdk.operator.api.Controller;
import io.javaoperatorsdk.operator.api.ResourceController;
import io.javaoperatorsdk.operator.api.UpdateControl;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.client.KubernetesClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Controller(customResourceClass = Webapp.class,
crdName = "webapps.tomcatoperator.io")
public class WebappController implements ResourceController {
private KubernetesClient kubernetesClient;
private final Logger log = LoggerFactory.getLogger(getClass());
public WebappController(KubernetesClient kubernetesClient) {
this.kubernetesClient = kubernetesClient;
}
@Override
public UpdateControl createOrUpdateResource(Webapp webapp, Context context) {
if (Objects.equals(webapp.getSpec().getUrl(), webapp.getStatus().getDeployedArtifact())) {
return UpdateControl.noUpdate();
}
String fileName = fileNameFromWebapp(webapp);
String[] command = new String[]{"wget", "-O", "/data/" + fileName, webapp.getSpec().getUrl()};
executeCommandInAllPods(kubernetesClient, webapp, command);
webapp.getStatus().setDeployedArtifact(webapp.getSpec().getUrl());
return UpdateControl.updateStatusSubResource(webapp);
}
@Override
public boolean deleteResource(Webapp webapp, Context context) {
String fileName = fileNameFromWebapp(webapp);
String[] command = new String[]{"rm", "/data/" + fileName};
executeCommandInAllPods(kubernetesClient, webapp, command);
return true;
}
private void executeCommandInAllPods(KubernetesClient kubernetesClient, Webapp webapp, String[] command) {
Deployment deployment = kubernetesClient.apps().deployments().inNamespace(webapp.getMetadata().getNamespace())
.withName(webapp.getSpec().getTomcat()).get();
if (deployment != null) {
List pods = kubernetesClient.pods().inNamespace(webapp.getMetadata().getNamespace())
.withLabels(deployment.getSpec().getSelector().getMatchLabels()).list().getItems();
for (Pod pod : pods) {
log.info("Executing command {} in Pod {}", String.join(" ", command), pod.getMetadata().getName());
kubernetesClient.pods().inNamespace(deployment.getMetadata().getNamespace())
.withName(pod.getMetadata().getName())
.inContainer("war-downloader")
.writingOutput(new ByteArrayOutputStream())
.writingError(new ByteArrayOutputStream())
.exec(command);
}
}
}
private String fileNameFromWebapp(Webapp webapp) {
try {
Pattern regexpPattern = Pattern.compile("([^\\/]+$)");
Matcher regexpMatcher = regexpPattern.matcher(webapp.getSpec().getUrl());
regexpMatcher.find();
return regexpMatcher.group();
} catch (RuntimeException ex) {
log.error("Failed to parse file name from URL {}", webapp.getSpec().getUrl());
throw ex;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy