You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sv...@apache.org on 2016/11/17 10:33:30 UTC
[2/3] brooklyn-server git commit: Make BasicJcloudsLocationCustomizer
an EntityInitializer
Make BasicJcloudsLocationCustomizer an EntityInitializer
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/413fb03a
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/413fb03a
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/413fb03a
Branch: refs/heads/master
Commit: 413fb03a79cee4244e7de2b6601a60e512cb42f2
Parents: ac9d9e9
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Thu Nov 17 10:01:14 2016 +0000
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Thu Nov 17 10:01:14 2016 +0000
----------------------------------------------------------------------
.../core/entity/BrooklynConfigKeys.java | 11 +-
.../jclouds/BasicJcloudsLocationCustomizer.java | 68 ++++++++++-
.../BasicJcloudsLocationCustomizerTest.java | 113 +++++++++++++++++++
.../entity/software/base/SoftwareProcess.java | 7 +-
4 files changed, 186 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/413fb03a/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java b/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
index a97a5d9..5e77613 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
@@ -23,7 +23,6 @@ import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKey;
import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKeyWithPrefix;
import static org.apache.brooklyn.core.config.ConfigKeys.newStringConfigKey;
-import com.google.common.annotations.Beta;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.BasicConfigInheritance;
@@ -37,6 +36,7 @@ import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
import org.apache.brooklyn.util.core.internal.ssh.SshTool;
import org.apache.brooklyn.util.time.Duration;
+import com.google.common.annotations.Beta;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
@@ -237,4 +237,13 @@ public class BrooklynConfigKeys {
public static final ConfigKey<String> SSH_CONFIG_DIRECT_HEADER = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_DIRECT_HEADER);
public static final ConfigKey<Boolean> SSH_CONFIG_NO_DELETE_SCRIPT = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_NO_DELETE_SCRIPT);
+ public static final MapConfigKey<Object> PROVISIONING_PROPERTIES = new MapConfigKey.Builder<Object>(Object.class, "provisioning.properties")
+ .description("Custom properties to be passed in when provisioning a new machine")
+ .defaultValue(ImmutableMap.<String, Object>of())
+ .typeInheritance(BasicConfigInheritance.DEEP_MERGE)
+ .runtimeInheritance(BasicConfigInheritance.NOT_REINHERITED_ELSE_DEEP_MERGE)
+ .build();
+
+ private BrooklynConfigKeys() {}
+
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/413fb03a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizer.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizer.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizer.java
index 500442e..317f4e9 100644
--- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizer.java
+++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizer.java
@@ -18,19 +18,73 @@
*/
package org.apache.brooklyn.location.jclouds;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntityInitializer;
+import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
+import org.apache.brooklyn.core.location.LocationConfigKeys;
+import org.apache.brooklyn.core.objs.BasicConfigurableObject;
+import org.apache.brooklyn.util.core.config.ConfigBag;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.options.TemplateOptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.core.location.LocationConfigKeys;
-import org.apache.brooklyn.core.objs.BasicConfigurableObject;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
/**
- * A default no-op implementation, which can be extended to override the appropriate methods.
+ * A default no-op location customizer, which can be extended to override the appropriate methods.
+ * <p>
+ * When the class is used as an {@link EntityInitializer} it inserts itself into the entity's
+ * {@link JcloudsLocationConfig#JCLOUDS_LOCATION_CUSTOMIZERS} under the
+ * {@link BrooklynConfigKeys#PROVISIONING_PROPERTIES} key.
*/
-public class BasicJcloudsLocationCustomizer extends BasicConfigurableObject implements JcloudsLocationCustomizer {
+public class BasicJcloudsLocationCustomizer extends BasicConfigurableObject implements JcloudsLocationCustomizer, EntityInitializer {
+
+ private static final Logger LOG = LoggerFactory.getLogger(BasicJcloudsLocationCustomizer.class);
+
+ public BasicJcloudsLocationCustomizer() {
+ this(ImmutableMap.<String, String>of());
+ }
+
+ public BasicJcloudsLocationCustomizer(Map<String, String> params) {
+ this(ConfigBag.newInstance(params));
+ }
+
+ public BasicJcloudsLocationCustomizer(final ConfigBag params) {
+ for (Map.Entry<String, Object> entry : params.getAllConfig().entrySet()) {
+ config().set(ConfigKeys.newConfigKey(Object.class, entry.getKey()), entry.getValue());
+ }
+ }
+
+ @Override
+ public void apply(EntityLocal entity) {
+ ConfigKey<Object> subkey = BrooklynConfigKeys.PROVISIONING_PROPERTIES.subKey(JcloudsLocationConfig.JCLOUDS_LOCATION_CUSTOMIZERS.getName());
+ // newInstance handles the case that provisioning properties is null.
+ ConfigBag provisioningProperties = ConfigBag.newInstance(entity.config().get(BrooklynConfigKeys.PROVISIONING_PROPERTIES));
+ Collection<JcloudsLocationCustomizer> existingCustomizers = provisioningProperties.get(JcloudsLocationConfig.JCLOUDS_LOCATION_CUSTOMIZERS);
+ List<? super JcloudsLocationCustomizer> merged;
+ if (existingCustomizers == null) {
+ merged = ImmutableList.<JcloudsLocationCustomizer>of(this);
+ } else {
+ merged = Lists.newArrayListWithCapacity(1 + existingCustomizers.size());
+ merged.addAll(existingCustomizers);
+ merged.add(this);
+ }
+ LOG.debug("{} set location customizers on {}: {}", new Object[]{this, entity, Iterables.toString(merged)});
+ entity.config().set(subkey, merged);
+ }
@Override
public void customize(JcloudsLocation location, ComputeService computeService, TemplateBuilder templateBuilder) {
@@ -62,7 +116,9 @@ public class BasicJcloudsLocationCustomizer extends BasicConfigurableObject impl
// no-op
}
- /** @return the calling entity */
+ /**
+ * @return the calling entity
+ */
protected Entity getCallerContext(JcloudsMachineLocation machine) {
SudoTtyFixingCustomizer s;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/413fb03a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizerTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizerTest.java b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizerTest.java
new file mode 100644
index 0000000..ecdde08
--- /dev/null
+++ b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/BasicJcloudsLocationCustomizerTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.location.jclouds;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Collection;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
+import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.entity.group.DynamicCluster;
+import org.apache.brooklyn.util.text.Strings;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+
+public class BasicJcloudsLocationCustomizerTest extends BrooklynAppUnitTestSupport {
+
+ private BasicJcloudsLocationCustomizer testCustomizer;
+
+ @BeforeMethod
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ testCustomizer = new BasicJcloudsLocationCustomizer();
+ }
+
+ @Test
+ public void testCustomiserIncluded() {
+ TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
+ .addInitializer(testCustomizer));
+ assertCustomizers(entity, 1);
+ }
+
+ @Test
+ public void testCustomizersMerged() {
+ TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
+ .addInitializer(testCustomizer)
+ .configure(
+ BrooklynConfigKeys.PROVISIONING_PROPERTIES.subKey(JcloudsLocationConfig.JCLOUDS_LOCATION_CUSTOMIZERS.getName()),
+ ImmutableList.of(new BasicJcloudsLocationCustomizer())));
+ assertCustomizers(entity, 2);
+ }
+
+ @Test
+ public void testInitialiserAppliedToMembersOfCluster() {
+ final EntitySpec<TestEntity> memberSpec = EntitySpec.create(TestEntity.class)
+ .addInitializer(testCustomizer);
+ DynamicCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class)
+ .configure(DynamicCluster.INITIAL_SIZE, 3)
+ .configure(DynamicCluster.MEMBER_SPEC, memberSpec));
+ app.start(ImmutableList.of(app.newSimulatedLocation()));
+ for (Entity member : cluster.getMembers()) {
+ assertCustomizers(member, 1);
+ }
+ }
+
+ @Test
+ public void testApplyToEntity() {
+ TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
+ assertNoCustomizers(entity);
+ testCustomizer.apply(entity);
+ assertCustomizers(entity, 1);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void assertCustomizers(Entity entity, int numberCustomizers) {
+ Object object = entity.config().get(BrooklynConfigKeys.PROVISIONING_PROPERTIES.subKey(
+ JcloudsLocationConfig.JCLOUDS_LOCATION_CUSTOMIZERS.getName()));
+ assertNotNull(object, "expected value for customizers in " + entity.config().get(BrooklynConfigKeys.PROVISIONING_PROPERTIES));
+ assertTrue(object instanceof Collection, "expected collection, got " + object.getClass());
+ Collection<JcloudsLocationCustomizer> customizers = (Collection<JcloudsLocationCustomizer>) object;
+ assertEquals(customizers.size(), numberCustomizers,
+ "expected " + numberCustomizers + " customizer" + Strings.s(numberCustomizers) + " in " + Iterables.toString(customizers));
+ assertTrue(customizers.contains(testCustomizer), "expected to find testCustomizer in " + Iterables.toString(customizers));
+ }
+
+ @SuppressWarnings("unchecked")
+ private void assertNoCustomizers(Entity entity) {
+ Object object = entity.config().get(BrooklynConfigKeys.PROVISIONING_PROPERTIES.subKey(
+ JcloudsLocationConfig.JCLOUDS_LOCATION_CUSTOMIZERS.getName()));
+ if (object != null) {
+ assertTrue(object instanceof Collection, "expected collection, got " + object.getClass());
+ Collection<JcloudsLocationCustomizer> customizers = (Collection<JcloudsLocationCustomizer>) object;
+ assertEquals(customizers.size(), 0, "expected no entries in " + Iterables.toString(customizers));
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/413fb03a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java
----------------------------------------------------------------------
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 325d5a5..e8dfced 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
@@ -264,12 +264,7 @@ public interface SoftwareProcess extends Entity, Startable {
.build();
@SetFromFlag("provisioningProperties")
- MapConfigKey<Object> PROVISIONING_PROPERTIES = new MapConfigKey.Builder<Object>(Object.class, "provisioning.properties")
- .description("Custom properties to be passed in when provisioning a new machine")
- .defaultValue(ImmutableMap.<String, Object>of())
- .typeInheritance(BasicConfigInheritance.DEEP_MERGE)
- .runtimeInheritance(BasicConfigInheritance.NOT_REINHERITED_ELSE_DEEP_MERGE)
- .build();
+ MapConfigKey<Object> PROVISIONING_PROPERTIES = BrooklynConfigKeys.PROVISIONING_PROPERTIES;
@SetFromFlag("maxRebindSensorsDelay")
ConfigKey<Duration> MAXIMUM_REBIND_SENSOR_CONNECT_DELAY = ConfigKeys.newConfigKey(Duration.class,