From 814b7d1779022813c13d83abd684c80a98d3ea72 Mon Sep 17 00:00:00 2001 From: Ivana Yovcheva Date: Thu, 6 Oct 2016 20:45:39 +0300 Subject: [PATCH] Attach configurable effector to SoftwareProcess for AWS --- .../entity/software/base/SoftwareProcess.java | 8 ++++ .../software/base/SoftwareProcessImpl.java | 40 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java index d28bdc61de..54ba3675b3 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java @@ -29,6 +29,7 @@ import org.apache.brooklyn.core.config.BasicConfigInheritance; import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.core.config.MapConfigKey; +import org.apache.brooklyn.core.effector.EffectorBody; import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.BrooklynConfigKeys; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; @@ -36,6 +37,7 @@ import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey; import org.apache.brooklyn.core.sensor.Sensors; +import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.core.flags.SetFromFlag; import org.apache.brooklyn.util.time.Duration; @@ -275,6 +277,12 @@ public interface SoftwareProcess extends Entity, Startable { "The period for polling for whether the process is running; applies only if the entity " + "wires up the connectServiceUpIsRunning.", Duration.FIVE_SECONDS); + + ConfigKey BROOKLYN_LOCATION_EXTRA_HDD_EFFECTOR = ConfigKeys.newConfigKey(new TypeToken() {}, "brooklyn.location.extra.hdd.effector", + "TODO - description"); + + ConfigKey> LOCATION_CUSTOMIZER_FIELDS = ConfigKeys.newConfigKey(new TypeToken>() {}, "location.customizer.fields", + "Map of location customizer fields", MutableMap.of()); /** * Sets the object that manages the sequence of calls of the entity's driver. diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java index 6f88f6c556..d5495e4cde 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java @@ -25,11 +25,13 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; -import java.util.Date; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; +import org.apache.brooklyn.core.effector.EffectorBody; import org.apache.brooklyn.location.jclouds.networking.NetworkingEffectors; +import org.apache.brooklyn.util.core.ClassLoaderUtils; +import org.apache.brooklyn.util.javalang.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +39,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; - +import groovy.time.TimeDuration; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntityLocal; import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity; @@ -49,19 +51,21 @@ import org.apache.brooklyn.api.sensor.EnricherSpec; import org.apache.brooklyn.api.sensor.SensorEvent; import org.apache.brooklyn.api.sensor.SensorEventListener; +import org.apache.brooklyn.core.effector.Effectors; import org.apache.brooklyn.core.enricher.AbstractEnricher; import org.apache.brooklyn.core.entity.AbstractEntity; import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.BrooklynConfigKeys; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; -import org.apache.brooklyn.core.entity.lifecycle.Lifecycle.Transition; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ServiceNotUpLogic; import org.apache.brooklyn.core.location.LocationConfigKeys; import org.apache.brooklyn.core.location.cloud.CloudLocationConfig; import org.apache.brooklyn.feed.function.FunctionFeed; import org.apache.brooklyn.feed.function.FunctionPollConfig; +import org.apache.brooklyn.location.jclouds.JcloudsLocationCustomizer; +import org.apache.brooklyn.location.jclouds.JcloudsMachineLocation; import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.collections.MutableSet; @@ -268,6 +272,36 @@ protected void onUpdated() { * Called before driver.start; guarantees the driver will exist, and locations will have been set. */ protected void preStart() { + if (!getLocations().isEmpty() && getLocations().iterator().next() instanceof JcloudsMachineLocation) { + JcloudsMachineLocation location = (JcloudsMachineLocation) getLocations().iterator().next(); + if (location.getParent().getProvider().equals("aws-ec2") + && this.getManagementContext().getConfig().getAllConfigLocalRaw().containsKey(BROOKLYN_LOCATION_EXTRA_HDD_EFFECTOR)) { + try { + String effectorClassName = String.valueOf(this.getManagementContext().getConfig().getConfig(BROOKLYN_LOCATION_EXTRA_HDD_EFFECTOR)); + EffectorBody effectorBody; + Class clazz = new ClassLoaderUtils(this.getClass(), getManagementContext()) + .loadClass(effectorClassName); + + Maybe instance = Reflections.invokeConstructorFromArgs(clazz); + if (!instance.isPresent()) { + throw new IllegalStateException("Failed to create EffectorBody class "+effectorClassName); + } else if (!(instance.get() instanceof EffectorBody)) { + throw new IllegalStateException("Failed to create EffectorBody class "+effectorClassName+"; expected type EffectorBody but got "+instance.get().getClass()); + } else { + effectorBody = (EffectorBody) instance.get(); + + getMutableEntityType().addEffector( + Effectors.effector(JcloudsLocationCustomizer.class, "addExtraHdd") + .parameter(LOCATION_CUSTOMIZER_FIELDS) + .description("An effector to add extra hdd to provisioned vm") + .impl(effectorBody) + .build()); + } + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } } /**