Created
January 7, 2021 06:27
-
-
Save manusa/70c51eeaee0fabc222186310255e71b3 to your computer and use it in GitHub Desktop.
MultiDeployments - https://github.com/fabric8io/kubernetes-client/issues/2712
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
///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