You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2020/07/08 13:18:17 UTC

[brooklyn-server] 07/20: Renaming and tidying

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 <du...@cloudsoft.io>
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));
     }