This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit f4b87ddde7d5f02ab69712eb559d606746c39bcc Author: Duncan Grant <[email protected]> AuthorDate: Wed Jul 1 20:20:01 2020 +0100 Renaming and tidying --- .../brooklyn/container/entity/helm/HelmEntity.java | 10 +++- .../container/entity/helm/HelmEntityImpl.java | 67 ++++++++++++++-------- .../container/entity/helm/HelmEntityLiveTest.java | 29 +++++++--- 3 files changed, 72 insertions(+), 34 deletions(-) diff --git a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntity.java b/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntity.java index 108c601..7262f11 100644 --- a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntity.java +++ b/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntity.java @@ -46,9 +46,13 @@ public interface HelmEntity extends Entity, Resizable, Startable { "helm.template", "Template name or url"); - public static final ConfigKey<String> HELM_TEMPLATE_INSTALL_NAME = ConfigKeys.newStringConfigKey( - "helm.template.install.name", - "Kuberentes deployment name"); + public static final ConfigKey<String> HELM_DEPLOYMENT_NAME = ConfigKeys.newStringConfigKey( + "helm.deployment.name", + "Deployment name"); + + public static final ConfigKey<String> HELM_INSTALL_VALUES = ConfigKeys.newStringConfigKey( + "helm.install.values", + "Helm config values to use at install time - can be file or url"); AttributeSensor<String> STATUS = Sensors.newStringSensor("helm.status", "The results of a status call"); diff --git a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntityImpl.java b/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntityImpl.java index 9b67965..393298d 100644 --- a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntityImpl.java +++ b/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmEntityImpl.java @@ -21,18 +21,14 @@ package org.apache.brooklyn.container.entity.helm; import com.google.common.base.Functions; import com.google.common.collect.ImmutableList; import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.client.Config; -import io.fabric8.kubernetes.client.ConfigBuilder; -import io.fabric8.kubernetes.client.DefaultKubernetesClient; -import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.api.model.apps.DeploymentList; +import io.fabric8.kubernetes.client.*; +import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable; import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationDefinition; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.container.location.kubernetes.KubernetesLocation; import org.apache.brooklyn.core.entity.AbstractEntity; import org.apache.brooklyn.core.entity.Attributes; -import org.apache.brooklyn.entity.software.base.SoftwareProcess; -import org.apache.brooklyn.entity.software.base.SoftwareProcessImpl; import org.apache.brooklyn.feed.function.FunctionFeed; import org.apache.brooklyn.feed.function.FunctionPollConfig; import org.apache.brooklyn.util.core.internal.ssh.process.ProcessTool; @@ -48,7 +44,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collection; +import java.util.List; import java.util.concurrent.Callable; +import java.util.function.Function; +import java.util.stream.Collectors; public class HelmEntityImpl extends AbstractEntity implements HelmEntity { @@ -155,7 +154,10 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { String repo_url = getConfig(HelmEntity.REPO_URL); String helm_template = getConfig(HelmEntity.HELM_TEMPLATE); - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_deployment_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); + String install_values = getConfig(HelmEntity.HELM_INSTALL_VALUES); + + String namespace = getNamespace(); if(Strings.isNonBlank(repo_name) && Strings.isNonBlank(repo_url)) { @@ -163,7 +165,7 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { @Override public void run() { ImmutableList<String> installHelmTemplateCommand = - ImmutableList.<String>of(String.format("helm repo add %s %s", repo_name, repo_url)); + ImmutableList.<String>of(buildCommand(repo_name, repo_url, install_values, namespace)); OutputStream out = new ByteArrayOutputStream(); OutputStream err = new ByteArrayOutputStream(); ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err, ";", false, this); @@ -174,7 +176,7 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { @Override public void run() { ImmutableList<String> installHelmTemplateCommand = - ImmutableList.<String>of(String.format("helm install %s %s", helm_name_install_name, helm_template)); + ImmutableList.<String>of(String.format("helm install %s %s", helm_deployment_name, helm_template)); OutputStream out = new ByteArrayOutputStream(); OutputStream err = new ByteArrayOutputStream(); ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err, ";", false, this); @@ -182,6 +184,11 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { //TODO Do something with output } + private String getNamespace() { + return getLocation().getConfig(KubernetesLocation.NAMESPACE); + } + + @Override public void stop() { disconnectSensors(); @@ -192,7 +199,7 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { DynamicTasks.queue("stop", new Runnable() { @Override public void run() { - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_name_install_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); ImmutableList<String> command = ImmutableList.<String>of(String.format("helm delete %s", helm_name_install_name)); OutputStream out = new ByteArrayOutputStream(); OutputStream err = new ByteArrayOutputStream(); @@ -208,7 +215,7 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { } public boolean isRunning() { - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_name_install_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); ImmutableList<String> command = ImmutableList.<String>of(String.format("helm status %s", helm_name_install_name)); OutputStream out = new ByteArrayOutputStream(); OutputStream err = new ByteArrayOutputStream(); @@ -217,7 +224,7 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { public Callable<String> getCallable(String command) { - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_name_install_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); ImmutableList<String> installHelmTemplateCommand = ImmutableList.<String>of(String.format("helm %s %s", command, helm_name_install_name)); @@ -233,16 +240,19 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { } public Callable getKubeDeploymentsCallable() { - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_name_install_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); String config = getLocation().getConfig(KubernetesLocation.KUBECONFIG); return new Callable() { @Override public Object call() throws Exception { KubernetesClient client = getClient(config); - Deployment deploy = client.apps().deployments().inNamespace("default").withName(helm_name_install_name).get(); - Integer availableReplicas = deploy.getStatus().getAvailableReplicas(); - Integer replicas = deploy.getStatus().getReplicas(); + Deployment deploy = client.apps().deployments().inNamespace(getNamespace()).withName(helm_name_install_name).get(); + FilterWatchListDeletable<Deployment, DeploymentList, Boolean, Watch, Watcher<Deployment>> release = client.apps().deployments().inNamespace(getNamespace()).withLabel("release", helm_name_install_name); + DeploymentList list = release.list(); + List<Deployment> deployments = list.getItems(); + Integer availableReplicas = deployments.stream().map(deployment -> deployment.getStatus().getAvailableReplicas()).collect(Collectors.summingInt(Integer::intValue)); + Integer replicas = deployments.stream().map(deployment -> deployment.getStatus().getReplicas()).collect(Collectors.summingInt(Integer::intValue)); return availableReplicas.equals(replicas); } ; }; @@ -253,39 +263,39 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { } public Callable getKubeReplicasCallable() { - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_name_install_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); String config = getLocation().getConfig(KubernetesLocation.KUBECONFIG); return new Callable() { @Override public Object call() throws Exception { KubernetesClient client = getClient(config); - Deployment deploy = client.apps().deployments().inNamespace("default").withName(helm_name_install_name).get(); + Deployment deploy = client.apps().deployments().inNamespace(getNamespace()).withName(helm_name_install_name).get(); return deploy.getStatus().getReplicas(); } ; }; } public Callable getKubeReplicasAvailableCallable() { - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_name_install_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); String config = getLocation().getConfig(KubernetesLocation.KUBECONFIG); return new Callable() { @Override public Object call() throws Exception { KubernetesClient client = getClient(config); - Deployment deploy = client.apps().deployments().inNamespace("default").withName(helm_name_install_name).get(); + Deployment deploy = client.apps().deployments().inNamespace(getNamespace()).withName(helm_name_install_name).get(); return deploy.getStatus().getAvailableReplicas(); } ; }; } public void scaleDeployment(Integer scale) { - String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + String helm_name_install_name = getConfig(HelmEntity.HELM_DEPLOYMENT_NAME); String config = getLocation().getConfig(KubernetesLocation.KUBECONFIG); KubernetesClient client = getClient(config); - client.apps().deployments().inNamespace("default").withName(helm_name_install_name).scale(scale); + client.apps().deployments().inNamespace(getNamespace()).withName(helm_name_install_name).scale(scale); } KubernetesClient getClient(String configFile) { @@ -299,4 +309,15 @@ public class HelmEntityImpl extends AbstractEntity implements HelmEntity { return null; } } + + private String buildCommand(String repo_name, String repo_url, String install_values, String namespace) { + String install_command = String.format("helm repo add %s %s", repo_name, repo_url); + if(Strings.isNonBlank(install_values)) { + install_command += String.format(" --values %s", install_values); + } + if(Strings.isNonBlank(namespace)) { + install_command += String.format(" --namespace %s", namespace); + } + return install_command; + } } diff --git a/locations/container/src/test/java/org/apache/brooklyn/container/entity/helm/HelmEntityLiveTest.java b/locations/container/src/test/java/org/apache/brooklyn/container/entity/helm/HelmEntityLiveTest.java index f710adc..806a267 100644 --- a/locations/container/src/test/java/org/apache/brooklyn/container/entity/helm/HelmEntityLiveTest.java +++ b/locations/container/src/test/java/org/apache/brooklyn/container/entity/helm/HelmEntityLiveTest.java @@ -23,16 +23,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.container.location.kubernetes.KubernetesLocation; -import org.apache.brooklyn.core.effector.Effectors; import org.apache.brooklyn.core.entity.Attributes; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport; -import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation; import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.time.Duration; import org.testng.annotations.Test; import javax.annotation.Nullable; @@ -41,7 +35,6 @@ import java.util.Map; import static org.apache.brooklyn.core.entity.EntityAsserts.assertAttributeEqualsEventually; import static org.apache.brooklyn.core.entity.EntityAsserts.assertPredicateEventuallyTrue; -import static org.testng.Assert.*; public class HelmEntityLiveTest extends BrooklynAppLiveTestSupport { @@ -102,11 +95,31 @@ public class HelmEntityLiveTest extends BrooklynAppLiveTestSupport { } + @Test + public void testCanScaleClusterPrometheus() { + HelmEntity andManageChild = newHelmSpec("prometheus", "/Users/duncangrant/workspace/charts/stable/prometheus"); + + app.start(newKubernetesLocation()); + + assertAttributeEqualsEventually(andManageChild, HelmEntity.AVAILABLE_REPLICAS, 1); + assertAttributeEqualsEventually(andManageChild, HelmEntity.REPLICAS, 1); + + andManageChild.resize(2); + + assertAttributeEqualsEventually(andManageChild, HelmEntity.AVAILABLE_REPLICAS, 2); + assertAttributeEqualsEventually(andManageChild, HelmEntity.REPLICAS, 2); + + assertAttributeEqualsEventually(andManageChild, HelmEntity.DEPLOYMENT_READY, true); + + app.stop(); + + } + private HelmEntity newHelmSpec(String templateInstallName, String helmTemplate) { return app.createAndManageChild(EntitySpec.create(HelmEntity.class) .configure(HelmEntity.REPO_NAME, "bitnami") .configure(HelmEntity.REPO_URL, "https://charts.bitnami.com/bitnami") - .configure(HelmEntity.HELM_TEMPLATE_INSTALL_NAME, templateInstallName) + .configure(HelmEntity.HELM_DEPLOYMENT_NAME, templateInstallName) .configure(HelmEntity.HELM_TEMPLATE, helmTemplate)); }
