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

Reply via email to