Skip to content

Instantly share code, notes, and snippets.

@manusa
Created January 7, 2021 06:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save manusa/70c51eeaee0fabc222186310255e71b3 to your computer and use it in GitHub Desktop.
Save manusa/70c51eeaee0fabc222186310255e71b3 to your computer and use it in GitHub Desktop.
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS info.picocli:picocli:4.6.1
//DEPS io.fabric8:kubernetes-client:5.0.0
import io.fabric8.kubernetes.api.model.ContainerBuilder;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Callable;
@SuppressWarnings("unused")
@Command(
name = "Deployments",
mixinStandardHelpOptions = true
)
class MultiDeployments implements Callable<Integer> {
private static final String EXAMPLE_NAME = "multi-example";
@SuppressWarnings("java:S115")
enum Options {
list, example, log
}
@CommandLine.Option(names = {"-ns", "--namespace"})
private String namespace;
@Parameters(index = "0", description = "The action to perform: ${COMPLETION-CANDIDATES}")
private Options action;
@Parameters(index="1..*")
private String[] params;
@CommandLine.Spec
CommandLine.Model.CommandSpec spec;
public static void main(String... args) {
int exitCode = new CommandLine(new MultiDeployments()).execute(args);
System.exit(exitCode);
}
@Override
public Integer call() {
try (KubernetesClient kc = new DefaultKubernetesClient()) {
switch (action) {
case example:
createExample(kc);
break;
case log:
logs(kc);
break;
case list:
default:
list(kc);
break;
}
}
return 0;
}
private void list(KubernetesClient kc) {
info("List of Deployments for all Namespaces:");
kc.apps().deployments().list().getItems().stream()
.map(Deployment::getMetadata)
.map(ObjectMeta::getName)
.map(n -> " - " + n)
.forEach(this::info);
}
private void createExample(KubernetesClient kc) {
final String name = EXAMPLE_NAME;
final String applicableNamespace = namespace(kc);
final String appName = "multi-example-deployment";
info("Creating example Deployment in " + applicableNamespace + " namespace:");
final Deployment d = kc.apps().deployments().createOrReplace(new DeploymentBuilder()
.withNewMetadata().withName(name).endMetadata()
.withNewSpec()
.withNewSelector().addToMatchLabels("app", appName).endSelector()
.withReplicas(1)
.withTemplate(new PodTemplateSpecBuilder()
.withNewMetadata().addToLabels("app", appName).endMetadata()
.withNewSpec()
.addToContainers(new ContainerBuilder()
.withName(name)
.withImage("busybox")
.withCommand("sh", "-c", "echo 'Hello multi logs 1' && sleep 300")
.build())
.addToContainers(new ContainerBuilder()
.withName(name + "-2")
.withImage("busybox")
.withCommand("sh", "-c", "echo 'Hello multi logs 2' && sleep 300")
.build())
.endSpec()
.build())
.endSpec()
.build());
info(" - Deployment " + applicableNamespace + "/" + name + " successfully created!");
info(" - " + d.getMetadata().getCreationTimestamp());
}
private void logs(KubernetesClient kc) {
final String applicableNamespace = namespace(kc);
// Doesn't work in multi-container deployments: // TODO: #2712
// kc.apps().deployments().inNamespace(namespace(kc)).withName(EXAMPLE_NAME).watchLog(System.out);
final Map<String, String> matchLabels = kc.apps().deployments().inNamespace(applicableNamespace).withName(EXAMPLE_NAME).get()
.getSpec().getSelector().getMatchLabels();
final String firstPod =kc.pods().inNamespace(applicableNamespace).withLabels(matchLabels).list().getItems().get(0).getMetadata().getName();
kc.pods().inNamespace(applicableNamespace).withName(firstPod).inContainer(EXAMPLE_NAME).watchLog(System.out);
}
private String namespace(KubernetesClient kc) {
if (namespace != null) {
return namespace;
}
return Optional.ofNullable(kc.getNamespace()).orElse("default");
}
private void info(String info) {
spec.commandLine().getOut().println("[YAKC] " + info);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment