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 6656d088ccf69af51fb311b43039d61186f1f7b9 Author: Duncan Grant <[email protected]> AuthorDate: Thu Jun 18 12:10:02 2020 +0100 Remove ssh driver --- .../stock/YamlTimeWeightedDeltaEnricher.java | 4 +- .../brooklyn/container/entity/helm/HelmDriver.java | 27 --- .../brooklyn/container/entity/helm/HelmEntity.java | 15 +- .../container/entity/helm/HelmEntityImpl.java | 256 +++++++++++++++++++-- .../container/entity/helm/HelmSshDriver.java | 222 ------------------ .../container/entity/helm/HelmEntityLiveTest.java | 46 +++- 6 files changed, 290 insertions(+), 280 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/YamlTimeWeightedDeltaEnricher.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/YamlTimeWeightedDeltaEnricher.java index 8052201..aa30390 100644 --- a/core/src/main/java/org/apache/brooklyn/enricher/stock/YamlTimeWeightedDeltaEnricher.java +++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/YamlTimeWeightedDeltaEnricher.java @@ -18,19 +18,17 @@ */ package org.apache.brooklyn.enricher.stock; +import com.google.common.base.Function; import org.apache.brooklyn.api.catalog.Catalog; import org.apache.brooklyn.api.entity.EntityLocal; import org.apache.brooklyn.api.sensor.SensorEvent; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.config.ConfigKeys; -import org.apache.brooklyn.enricher.stock.AbstractTransformer; import org.apache.brooklyn.util.core.flags.TypeCoercions; import org.apache.brooklyn.util.time.Duration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Function; - /** * Converts an absolute count sensor into a delta sensor (i.e. the diff between the current and previous value), * presented as a units/timeUnit based on the event timing. diff --git a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmDriver.java b/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmDriver.java deleted file mode 100644 index 4224f7a..0000000 --- a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmDriver.java +++ /dev/null @@ -1,27 +0,0 @@ -/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.container.entity.helm; - -import org.apache.brooklyn.entity.software.base.SoftwareProcessDriver; - -import java.util.concurrent.Callable; - -public interface HelmDriver extends SoftwareProcessDriver { - Callable getCallable(String command); - - Callable getKubeCallable(); -} 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 0daa865..108c601 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 @@ -18,15 +18,21 @@ */ package org.apache.brooklyn.container.entity.helm; +import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.ImplementedBy; import org.apache.brooklyn.api.sensor.AttributeSensor; +import org.apache.brooklyn.api.sensor.Sensor; import org.apache.brooklyn.config.ConfigKey; +import org.apache.brooklyn.core.annotation.Effector; +import org.apache.brooklyn.core.annotation.EffectorParam; import org.apache.brooklyn.core.config.ConfigKeys; +import org.apache.brooklyn.core.entity.trait.Resizable; +import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.entity.software.base.SoftwareProcess; @ImplementedBy(HelmEntityImpl.class) -public interface HelmEntity extends SoftwareProcess { +public interface HelmEntity extends Entity, Resizable, Startable { public static final ConfigKey<String> REPO_NAME = ConfigKeys.newStringConfigKey( "repo.name", @@ -49,4 +55,11 @@ public interface HelmEntity extends SoftwareProcess { AttributeSensor<Boolean> DEPLOYMENT_READY = Sensors.newBooleanSensor("kube.deployment.status", "The status of the deploymeny"); + + AttributeSensor<Integer> AVAILABLE_REPLICAS = Sensors.newIntegerSensor("kube.replicas.available", + "The number of available replicas"); + + AttributeSensor<Integer> REPLICAS = Sensors.newIntegerSensor("kube.replicas", + "The number of replicas"); + } 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 451d4c1..9b67965 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 @@ -18,51 +18,100 @@ */ 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 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; +import org.apache.brooklyn.util.core.task.DynamicTasks; +import org.apache.brooklyn.util.exceptions.Exceptions; +import org.apache.brooklyn.util.text.Strings; import org.apache.brooklyn.util.time.Duration; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collection; import java.util.concurrent.Callable; -public class HelmEntityImpl extends SoftwareProcessImpl implements HelmEntity { - @Override - public Class getDriverInterface() { - return HelmDriver.class; - } +public class HelmEntityImpl extends AbstractEntity implements HelmEntity { @Override public void init() { super.init(); } - @Override protected void connectSensors() { - super.connectSensors(); connectServiceUpIsRunning(); + //TODO do these reconnect after amp restart? addHelmFeed("status", STATUS); - addKubernetesFeed(); + addKubernetesFeeds(); } - private void addKubernetesFeed() { - HelmDriver driver = getDriver(); - Callable status = driver.getKubeCallable(); - FunctionPollConfig pollConfig = new FunctionPollConfig<String, Boolean>(DEPLOYMENT_READY) - .callable(status) - ; + private void connectServiceUpIsRunning() { + Duration period = Duration.FIVE_SECONDS; + FunctionFeed.builder() + .entity(this) + .period(period) + .poll(new FunctionPollConfig<Boolean, Boolean>(Attributes.SERVICE_UP) + .suppressDuplicates(true) + .onException(Functions.constant(Boolean.FALSE)) + .callable(new Callable<Boolean>() { + @Override + public Boolean call() { + return isRunning(); + } + })) + .build(); + } + + private void addKubernetesFeeds() { + Callable status = getKubeDeploymentsCallable(); addFeed(FunctionFeed.builder() .entity(this) - .poll(pollConfig) + .poll(new FunctionPollConfig<String, Boolean>(DEPLOYMENT_READY) + .callable(status)) + .period(Duration.FIVE_SECONDS) + .build()); + + Callable replicas = getKubeReplicasCallable(); + addFeed(FunctionFeed.builder() + .entity(this) + .poll(new FunctionPollConfig<String, Integer>(REPLICAS) + .callable(replicas)) + .period(Duration.FIVE_SECONDS) + .build()); + + Callable availableReplicas = getKubeReplicasCallable(); + addFeed(FunctionFeed.builder() + .entity(this) + .poll(new FunctionPollConfig<String, Integer>(AVAILABLE_REPLICAS) + .callable(availableReplicas)) .period(Duration.FIVE_SECONDS) .build()); } + private void addHelmFeed(String command, AttributeSensor<String> sensor) { - HelmDriver driver = getDriver(); - Callable status = driver.getCallable(command); + Callable status = getCallable(command); FunctionPollConfig pollConfig = new FunctionPollConfig<String, String>(sensor) .callable(status) ; @@ -75,14 +124,179 @@ public class HelmEntityImpl extends SoftwareProcessImpl implements HelmEntity { } - @Override protected void disconnectSensors() { - super.disconnectSensors(); disconnectServiceUpIsRunning(); } + private void disconnectServiceUpIsRunning() { + // TODO + } + + @Override + public Integer resize(Integer desiredSize) { + scaleDeployment(desiredSize); + return desiredSize; + } + + @Override + public Integer getCurrentSize() { + return sensors().get(REPLICAS); + } + @Override - public HelmDriver getDriver() { - return (HelmDriver) super.getDriver(); + public void start(Collection<? extends Location> locations) { + addLocations(locations); + doInstall(); + connectSensors(); + } + + private void doInstall() { + String repo_name = getConfig(HelmEntity.REPO_NAME); + 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); + + if(Strings.isNonBlank(repo_name) && Strings.isNonBlank(repo_url)) { + + DynamicTasks.queue("install repo", new Runnable() { + @Override + public void run() { + ImmutableList<String> installHelmTemplateCommand = + ImmutableList.<String>of(String.format("helm repo add %s %s", repo_name, repo_url)); + OutputStream out = new ByteArrayOutputStream(); + OutputStream err = new ByteArrayOutputStream(); + ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err, ";", false, this); + }}); + } + + DynamicTasks.queue("install", new Runnable() { + @Override + public void run() { + ImmutableList<String> installHelmTemplateCommand = + ImmutableList.<String>of(String.format("helm install %s %s", helm_name_install_name, helm_template)); + OutputStream out = new ByteArrayOutputStream(); + OutputStream err = new ByteArrayOutputStream(); + ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err, ";", false, this); + }}); + //TODO Do something with output + } + + @Override + public void stop() { + disconnectSensors(); + deleteHelmDeployment(); + } + + private void deleteHelmDeployment() { + DynamicTasks.queue("stop", new Runnable() { + @Override + public void run() { + String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + ImmutableList<String> command = ImmutableList.<String>of(String.format("helm delete %s", helm_name_install_name)); + OutputStream out = new ByteArrayOutputStream(); + OutputStream err = new ByteArrayOutputStream(); + ProcessTool.execProcesses(command, null, null, out, err, ";", false, this); + } + }); + } + + @Override + public void restart() { + stop(); + start(ImmutableList.<Location>of()); + } + + public boolean isRunning() { + String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + ImmutableList<String> command = ImmutableList.<String>of(String.format("helm status %s", helm_name_install_name)); + OutputStream out = new ByteArrayOutputStream(); + OutputStream err = new ByteArrayOutputStream(); + return 0 == ProcessTool.execProcesses(command, null, null, out, err,";",false, this); + } + + + public Callable<String> getCallable(String command) { + String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + ImmutableList<String> installHelmTemplateCommand = + ImmutableList.<String>of(String.format("helm %s %s", command, helm_name_install_name)); + + return new Callable<String>() { + @Override + public String call() throws Exception { + OutputStream out = new ByteArrayOutputStream(); + OutputStream err = new ByteArrayOutputStream(); + ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err,";", false, this); + return out.toString(); + } + }; + } + + public Callable getKubeDeploymentsCallable() { + String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_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(); + return availableReplicas.equals(replicas); + } ; + }; + } + + private KubernetesLocation getLocation() { + return (KubernetesLocation) getLocations().stream().filter(KubernetesLocation.class::isInstance).findFirst().get(); + } + + public Callable getKubeReplicasCallable() { + String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_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(); + return deploy.getStatus().getReplicas(); + } ; + }; + } + + public Callable getKubeReplicasAvailableCallable() { + String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_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(); + return deploy.getStatus().getAvailableReplicas(); + } ; + }; + } + + public void scaleDeployment(Integer scale) { + String helm_name_install_name = getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); + + String config = getLocation().getConfig(KubernetesLocation.KUBECONFIG); + KubernetesClient client = getClient(config); + client.apps().deployments().inNamespace("default").withName(helm_name_install_name).scale(scale); + } + + KubernetesClient getClient(String configFile) { + Path configPath = Paths.get(configFile); + try { + Config clientConfig = Config.fromKubeconfig(new String(Files.readAllBytes(configPath))); + ConfigBuilder configBuilder = new ConfigBuilder(clientConfig); + return new DefaultKubernetesClient(configBuilder.build()); + }catch (IOException ioe) { + Exceptions.propagate(ioe); + return null; + } } } diff --git a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmSshDriver.java b/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmSshDriver.java deleted file mode 100644 index 6befac5..0000000 --- a/locations/container/src/main/java/org/apache/brooklyn/container/entity/helm/HelmSshDriver.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.container.entity.helm; - -import com.google.common.collect.ImmutableList; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.apps.DoneableDeployment; -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.client.dsl.RollableScalableResource; -import org.apache.brooklyn.api.entity.EntityLocal; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.container.location.kubernetes.KubernetesLocation; -import org.apache.brooklyn.core.entity.EntityInternal; -import org.apache.brooklyn.entity.java.JavaSoftwareProcessSshDriver; -import org.apache.brooklyn.entity.software.base.AbstractSoftwareProcessDriver; -import org.apache.brooklyn.entity.software.base.SoftwareProcess; -import org.apache.brooklyn.entity.software.base.SoftwareProcessDriver; -import org.apache.brooklyn.location.ssh.SshMachineLocation; -import org.apache.brooklyn.util.core.internal.ssh.process.ProcessTool; -import org.apache.brooklyn.util.core.task.DynamicTasks; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.text.Strings; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Map; -import java.util.concurrent.Callable; - -public class HelmSshDriver extends AbstractSoftwareProcessDriver implements HelmDriver{ - - public HelmSshDriver(EntityLocal entity, Location location) { - super(entity, location); - } - - @Override - public boolean isRunning() { - String helm_name_install_name = getEntity().getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); - ImmutableList<String> command = ImmutableList.<String>of(String.format("helm status %s", helm_name_install_name)); - OutputStream out = new ByteArrayOutputStream(); - OutputStream err = new ByteArrayOutputStream(); - return 0 == ProcessTool.execProcesses(command, null, null, out, err,";",false, this); - } - - @Override - public void stop() { - DynamicTasks.queue("stop", new Runnable() { - @Override - public void run() { - String helm_name_install_name = getEntity().getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); - ImmutableList<String> command = ImmutableList.<String>of(String.format("helm delete %s", helm_name_install_name)); - OutputStream out = new ByteArrayOutputStream(); - OutputStream err = new ByteArrayOutputStream(); - ProcessTool.execProcesses(command, null, null, out, err, ";", false, this); - } - }); - //TODO Do something with output - } - - @Override - public void install() { - String repo_name = getEntity().getConfig(HelmEntity.REPO_NAME); - String repo_url = getEntity().getConfig(HelmEntity.REPO_URL); - - String helm_template = getEntity().getConfig(HelmEntity.HELM_TEMPLATE); - String helm_name_install_name = getEntity().getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); - - if(Strings.isNonBlank(repo_name) && Strings.isNonBlank(repo_url)) { - - DynamicTasks.queue("install repo", new Runnable() { - @Override - public void run() { - ImmutableList<String> installHelmTemplateCommand = - ImmutableList.<String>of(String.format("helm repo add %s %s", repo_name, repo_url)); - OutputStream out = new ByteArrayOutputStream(); - OutputStream err = new ByteArrayOutputStream(); - ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err, ";", false, this); - }}); - } - - DynamicTasks.queue("install", new Runnable() { - @Override - public void run() { - ImmutableList<String> installHelmTemplateCommand = - ImmutableList.<String>of(String.format("helm install %s %s", helm_name_install_name, helm_template)); - OutputStream out = new ByteArrayOutputStream(); - OutputStream err = new ByteArrayOutputStream(); - ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err, ";", false, this); - }}); - //TODO Do something with output - } - - @Override - public Callable<String> getCallable(String command) { - String helm_name_install_name = getEntity().getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_NAME); - ImmutableList<String> installHelmTemplateCommand = - ImmutableList.<String>of(String.format("helm %s %s", command, helm_name_install_name)); - - return new Callable() { - @Override - public Object call() throws Exception { - OutputStream out = new ByteArrayOutputStream(); - OutputStream err = new ByteArrayOutputStream(); - ProcessTool.execProcesses(installHelmTemplateCommand, null, null, out, err,";", false, this); - return out.toString(); - } - }; - } - - @Override - public Callable getKubeCallable() { - String helm_name_install_name = getEntity().getConfig(HelmEntity.HELM_TEMPLATE_INSTALL_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(); - return availableReplicas.equals(replicas); - } ; - }; - } - - @Override - public void runPreInstallCommand() { - - } - - @Override - public void setup() { - - } - - @Override - public void runPostInstallCommand() { - - } - - @Override - public void runPreCustomizeCommand() { - - } - - @Override - public void customize() { - - } - - @Override - public void runPostCustomizeCommand() { - - } - - @Override - public void runPreLaunchCommand() { - - } - - @Override - public void launch() { - - } - - @Override - public void runPostLaunchCommand() { - - } - - @Override - protected void createDirectory(String directoryName, String summaryForLogging) { - - } - - @Override - public int copyResource(Map<Object, Object> sshFlags, String sourceUrl, String target, boolean createParentDir) { - return 0; - } - - @Override - public int copyResource(Map<Object, Object> sshFlags, InputStream source, String target, boolean createParentDir) { - return 0; - } - - KubernetesClient getClient(String configFile) { - Path configPath = Paths.get(configFile); - try { - Config clientConfig = Config.fromKubeconfig(new String(Files.readAllBytes(configPath))); - ConfigBuilder configBuilder = new ConfigBuilder(clientConfig); - return new DefaultKubernetesClient(configBuilder.build()); - }catch (IOException ioe) { - Exceptions.propagate(ioe); - return null; - } - } - -} 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 5ac2355..f710adc 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,15 +23,20 @@ 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; +import java.util.Collection; import java.util.Map; import static org.apache.brooklyn.core.entity.EntityAsserts.assertAttributeEqualsEventually; @@ -42,20 +47,20 @@ public class HelmEntityLiveTest extends BrooklynAppLiveTestSupport { @Test public void testSimpleDeploy() throws Exception { - HelmEntity andManageChild = newHelmSpec("wordpress-test", "bitnami/wordpress"); + HelmEntity andManageChild = newHelmSpec("nginx-test", "bitnami/nginx"); - app.start(newLocalhostLocation()); + app.start(newKubernetesLocation()); - assertAttributeEqualsEventually(andManageChild, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); assertAttributeEqualsEventually(andManageChild, Attributes.SERVICE_UP, true); app.stop(); } + @Test public void testCanSenseHelmStatus() { - HelmEntity andManageChild = newHelmSpec("wordpress-test", "bitnami/wordpress"); + HelmEntity andManageChild = newHelmSpec("nginx-test", "bitnami/nginx"); - app.start(newLocalhostLocation()); + app.start(newKubernetesLocation()); assertPredicateEventuallyTrue(andManageChild, new Predicate<HelmEntity>() { @Override @@ -71,10 +76,30 @@ public class HelmEntityLiveTest extends BrooklynAppLiveTestSupport { public void testCanSenseDeploymentStatus() { HelmEntity andManageChild = newHelmSpec("nginx-test", "bitnami/nginx"); - app.start(newLocalhostLocation()); + app.start(newKubernetesLocation()); + + assertAttributeEqualsEventually(andManageChild, HelmEntity.DEPLOYMENT_READY, true); + app.stop(); + } + + @Test + public void testCanScaleCluster() { + HelmEntity andManageChild = newHelmSpec("nginx-test", "bitnami/nginx"); + + 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) { @@ -90,4 +115,13 @@ public class HelmEntityLiveTest extends BrooklynAppLiveTestSupport { app.newLocalhostProvisioningLocation( ImmutableMap.of(KubernetesLocation.KUBECONFIG, "/Users/duncangrant/.kube/config"))); } + + private Collection<? extends Location> newKubernetesLocation() { + Map<String, ?> allFlags = MutableMap.<String, Object>builder() + .put(KubernetesLocation.KUBECONFIG.getName(), "/Users/duncangrant/.kube/config") + .put("image", "cloudsoft/centos:7") + .build(); + KubernetesLocation kubernetesLocation = (KubernetesLocation) mgmt.getLocationRegistry().getLocationManaged("kubernetes", allFlags); + return ImmutableList.of(kubernetesLocation); + } } \ No newline at end of file
