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));
}