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 2014/12/15 17:57:28 UTC

[1/9] incubator-brooklyn git commit: fix the rat

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master dd716b374 -> b3cea88cf


fix the rat


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/0b40243c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/0b40243c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/0b40243c

Branch: refs/heads/master
Commit: 0b40243ce02bde25f965f5d31cb90c92b3038b1a
Parents: 92ebdbf
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Dec 12 10:51:26 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/proxy/ProxySslConfigTest.java | 18 ++++++++++++++++++
 usage/launcher/src/test/resources/nginx.yaml      | 18 ++++++++++++++++++
 2 files changed, 36 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0b40243c/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java
index 77ea8a5..c4721ce 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java
@@ -1,3 +1,21 @@
+/*
+ * 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 brooklyn.entity.proxy;
 
 import org.testng.Assert;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/0b40243c/usage/launcher/src/test/resources/nginx.yaml
----------------------------------------------------------------------
diff --git a/usage/launcher/src/test/resources/nginx.yaml b/usage/launcher/src/test/resources/nginx.yaml
index 47a846e..984c41a 100644
--- a/usage/launcher/src/test/resources/nginx.yaml
+++ b/usage/launcher/src/test/resources/nginx.yaml
@@ -1,3 +1,21 @@
+#
+# 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.
+#
 name: Sample Nginx on SSL
 location: localhost
 services:


[8/9] incubator-brooklyn git commit: BROOKLYN-95 - make nginx re-configurable, to switch to ssl while live

Posted by he...@apache.org.
BROOKLYN-95 - make nginx re-configurable, to switch to ssl while live

a bit sloppy, running connectSensors multiple times, but it works.
better would be a restart which does install again, or to facilitate starting at the same VM.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/a952d6b7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/a952d6b7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/a952d6b7

Branch: refs/heads/master
Commit: a952d6b7258b0d695ba7a8a591d6caf6e1faaebf
Parents: 25dccf0
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Dec 2 16:28:15 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/basic/EntityPredicates.java |  2 +-
 .../event/feed/AttributePollHandler.java        | 12 +++-
 .../main/java/brooklyn/event/feed/Poller.java   |  2 -
 .../java/brooklyn/event/feed/http/HttpFeed.java |  2 +-
 .../event/feed/http/HttpPollConfig.java         | 15 +----
 .../main/java/brooklyn/util/http/HttpTool.java  | 17 ++++++
 .../entity/proxy/AbstractController.java        |  2 +-
 .../entity/proxy/AbstractControllerImpl.java    | 21 ++++---
 .../brooklyn/entity/proxy/LoadBalancer.java     |  9 ++-
 .../entity/proxy/nginx/NginxController.java     |  5 ++
 .../entity/proxy/nginx/NginxControllerImpl.java | 41 +++++++++++--
 .../entity/proxy/nginx/NginxSshDriver.java      | 29 +++++++---
 .../brooklyn/entity/proxy/nginx/UrlMapping.java |  1 -
 .../nginx/NginxHttpsSslIntegrationTest.java     | 60 ++++++++++++++++++--
 .../qa/load/SimulatedNginxControllerImpl.java   |  5 +-
 .../java/brooklyn/rest/api/EntityConfigApi.java |  3 +-
 .../main/java/brooklyn/rest/api/SensorApi.java  |  3 +-
 .../rest/resources/EntityConfigResource.java    |  8 +--
 .../brooklyn/rest/resources/SensorResource.java |  8 +--
 19 files changed, 183 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/core/src/main/java/brooklyn/entity/basic/EntityPredicates.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/EntityPredicates.java b/core/src/main/java/brooklyn/entity/basic/EntityPredicates.java
index 12b656d..5906d78 100644
--- a/core/src/main/java/brooklyn/entity/basic/EntityPredicates.java
+++ b/core/src/main/java/brooklyn/entity/basic/EntityPredicates.java
@@ -318,7 +318,7 @@ public class EntityPredicates {
         }
         @Override
         public boolean apply(@Nullable Entity input) {
-            return (input != null) && group.hasMember(input);
+            return (group != null) && (input != null) && group.hasMember(input);
         }
         @Override
         public String toString() {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/core/src/main/java/brooklyn/event/feed/AttributePollHandler.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/AttributePollHandler.java b/core/src/main/java/brooklyn/event/feed/AttributePollHandler.java
index 19538b3..2029237 100644
--- a/core/src/main/java/brooklyn/event/feed/AttributePollHandler.java
+++ b/core/src/main/java/brooklyn/event/feed/AttributePollHandler.java
@@ -23,9 +23,12 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.entity.basic.Attributes;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.EntityLocal;
+import brooklyn.entity.basic.Lifecycle;
+import brooklyn.entity.basic.Lifecycle.Transition;
 import brooklyn.event.AttributeSensor;
 import brooklyn.util.flags.TypeCoercions;
 import brooklyn.util.task.Tasks;
@@ -157,7 +160,7 @@ public class AttributePollHandler<V> implements PollHandler<V> {
             // get a non-volatile value
             Long currentProblemStartTimeCache = currentProblemStartTime;
             long expiryTime = 
-                    lastSuccessTime!=null ? lastSuccessTime+logWarningGraceTime.toMilliseconds() :
+                    (lastSuccessTime!=null && !isTransitioningOrStopped()) ? lastSuccessTime+logWarningGraceTime.toMilliseconds() :
                     currentProblemStartTimeCache!=null ? currentProblemStartTimeCache+logWarningGraceTimeOnStartup.toMilliseconds() :
                     nowTime+logWarningGraceTimeOnStartup.toMilliseconds();
             if (!lastWasProblem) {
@@ -194,6 +197,13 @@ public class AttributePollHandler<V> implements PollHandler<V> {
         }
     }
 
+    protected boolean isTransitioningOrStopped() {
+        if (entity==null) return false;
+        Transition expected = entity.getAttribute(Attributes.SERVICE_STATE_EXPECTED);
+        if (expected==null) return false;
+        return (expected.getState()==Lifecycle.STARTING || expected.getState()==Lifecycle.STOPPING || expected.getState()==Lifecycle.STOPPED);
+    }
+
     @SuppressWarnings("unchecked")
     protected void setSensor(Object v) {
         if (Entities.isNoLongerManaged(entity)) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/core/src/main/java/brooklyn/event/feed/Poller.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/Poller.java b/core/src/main/java/brooklyn/event/feed/Poller.java
index 6fa9147..1bb87c9 100644
--- a/core/src/main/java/brooklyn/event/feed/Poller.java
+++ b/core/src/main/java/brooklyn/event/feed/Poller.java
@@ -79,8 +79,6 @@ public class Poller<V> {
                             handler.onFailure(val);
                         }
                     } catch (Exception e) {
-                        // 2013-12-21 AH adding add'l logging because seeing strange scheduled task abortion from here
-                        // even though all paths should be catching it
                         if (loggedPreviousException) {
                             if (log.isTraceEnabled()) log.trace("PollJob for {}, repeated consecutive failures, handling {} using {}", new Object[] {job, e, handler});
                         } else {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/core/src/main/java/brooklyn/event/feed/http/HttpFeed.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/http/HttpFeed.java b/core/src/main/java/brooklyn/event/feed/http/HttpFeed.java
index 255443a..ab9dcd1 100644
--- a/core/src/main/java/brooklyn/event/feed/http/HttpFeed.java
+++ b/core/src/main/java/brooklyn/event/feed/http/HttpFeed.java
@@ -298,7 +298,7 @@ public class HttpFeed extends AbstractFeed {
                 URI uri = config.buildUri(builder.baseUri, baseUriVars);
                 baseUriProvider = Suppliers.ofInstance(uri);
             } else if (!builder.baseUriVars.isEmpty()) {
-                throw new IllegalStateException("Not permitted to supply URI vars when using a URI provider");
+                throw new IllegalStateException("Not permitted to supply URI vars when using a URI provider; pass the vars to the provider instead");
             }
             checkNotNull(baseUriProvider);
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/core/src/main/java/brooklyn/event/feed/http/HttpPollConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/event/feed/http/HttpPollConfig.java b/core/src/main/java/brooklyn/event/feed/http/HttpPollConfig.java
index 979e629..3476373 100644
--- a/core/src/main/java/brooklyn/event/feed/http/HttpPollConfig.java
+++ b/core/src/main/java/brooklyn/event/feed/http/HttpPollConfig.java
@@ -27,15 +27,12 @@ import brooklyn.event.AttributeSensor;
 import brooklyn.event.feed.PollConfig;
 import brooklyn.util.collections.MutableList;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.http.HttpTool;
 import brooklyn.util.http.HttpToolResponse;
-import brooklyn.util.net.URLParamEncoder;
 import brooklyn.util.time.Duration;
 
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
 
 public class HttpPollConfig<T> extends PollConfig<HttpToolResponse, T, HttpPollConfig<T>> {
 
@@ -130,15 +127,7 @@ public class HttpPollConfig<T> extends PollConfig<HttpToolResponse, T, HttpPollC
         Map<String,String> allvars = concat(baseUriVars, vars);
         
         if (allvars != null && allvars.size() > 0) {
-            Iterable<String> args = Iterables.transform(allvars.entrySet(), 
-                    new Function<Map.Entry<String,String>,String>() {
-                        @Override public String apply(Map.Entry<String,String> entry) {
-                            String k = entry.getKey();
-                            String v = entry.getValue();
-                            return URLParamEncoder.encode(k) + (v != null ? "=" + URLParamEncoder.encode(v) : "");
-                        }
-                    });
-            uri += "?" + Joiner.on("&").join(args);
+            uri += "?" + HttpTool.encodeUrlParams(allvars);
         }
         
         return URI.create(uri);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/core/src/main/java/brooklyn/util/http/HttpTool.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/http/HttpTool.java b/core/src/main/java/brooklyn/util/http/HttpTool.java
index a81b928..b57c157 100644
--- a/core/src/main/java/brooklyn/util/http/HttpTool.java
+++ b/core/src/main/java/brooklyn/util/http/HttpTool.java
@@ -66,9 +66,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.net.URLParamEncoder;
+import brooklyn.util.text.Strings;
 import brooklyn.util.time.Duration;
 
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Multimap;
 
 public class HttpTool {
@@ -362,4 +367,16 @@ public class HttpTool {
         return "Basic "+Base64.encodeBase64String( (credentials.getUserName()+":"+credentials.getPassword()).getBytes() );
     }
 
+    public static String encodeUrlParams(Map<?,?> data) {
+        if (data==null) return "";
+        Iterable<String> args = Iterables.transform(data.entrySet(), 
+            new Function<Map.Entry<?,?>,String>() {
+            @Override public String apply(Map.Entry<?,?> entry) {
+                Object k = entry.getKey();
+                Object v = entry.getValue();
+                return URLParamEncoder.encode(Strings.toString(k)) + (v != null ? "=" + URLParamEncoder.encode(Strings.toString(v)) : "");
+            }
+        });
+        return Joiner.on("&").join(args);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractController.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractController.java b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractController.java
index fd00924..e2ba3a1 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractController.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractController.java
@@ -41,7 +41,7 @@ public interface AbstractController extends SoftwareProcess, LoadBalancer {
 
     @SetFromFlag("ssl")
     ConfigKey<ProxySslConfig> SSL_CONFIG = ConfigKeys.newConfigKey(ProxySslConfig.class,
-            "proxy.ssl.config", "configuration (e.g. certificates) for SSL; will use SSL if set, not use SSL if not set");
+            "proxy.ssl.config", "Configuration (e.g. certificates) for SSL; causes server to run with HTTPS instead of HTTP");
     
 
     @SetFromFlag("serviceUpUrlPath")

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
index bf960f9..c7f518e 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/AbstractControllerImpl.java
@@ -112,7 +112,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
             return; // no-op
         }
         if (serverPoolMemberTrackerPolicy != null) {
-            LOG.warn("Call to addServerPoolMemberTrackingPolicy when serverPoolMemberTrackingPolicy already exists, in {}", this);
+            LOG.debug("Call to addServerPoolMemberTrackingPolicy when serverPoolMemberTrackingPolicy already exists, removing and re-adding, in {}", this);
             removeServerPoolMemberTrackingPolicy();
         }
         for (Policy p: getPolicies()) {
@@ -187,6 +187,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
         } 
     }
 
+    @SuppressWarnings("deprecation")
     @Override
     public void onManagementNoLongerMaster() {
         super.onManagementNoLongerMaster(); // TODO remove when deprecated method in parent removed
@@ -226,7 +227,10 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
     
     @Override
     public Integer getPort() {
-        return getAttribute(PROXY_HTTP_PORT);
+        if (isSsl())
+            return getAttribute(PROXY_HTTPS_PORT);
+        else
+            return getAttribute(PROXY_HTTP_PORT);
     }
 
     /** primary URL this controller serves, if one can / has been inferred */
@@ -254,7 +258,7 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
     public abstract void reload();
 
     protected String inferProtocol() {
-        return getConfig(SSL_CONFIG)!=null ? "https" : "http";
+        return isSsl() ? "https" : "http";
     }
     
     /** returns URL, if it can be inferred; null otherwise */
@@ -285,13 +289,17 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
     protected Collection<Integer> getRequiredOpenPorts() {
         Collection<Integer> result = super.getRequiredOpenPorts();
         if (groovyTruth(getAttribute(PROXY_HTTP_PORT))) result.add(getAttribute(PROXY_HTTP_PORT));
+        if (groovyTruth(getAttribute(PROXY_HTTPS_PORT))) result.add(getAttribute(PROXY_HTTPS_PORT));
         return result;
     }
 
     @Override
     protected void preStart() {
         super.preStart();
-
+        computePortsAndUrls();
+    }
+    
+    protected void computePortsAndUrls() {
         AttributeSensor<String> hostAndPortSensor = getConfig(HOST_AND_PORT_SENSOR);
         Maybe<Object> hostnameSensor = getConfigRaw(HOSTNAME_SENSOR, true);
         Maybe<Object> portSensor = getConfigRaw(PORT_NUMBER_SENSOR, true);
@@ -312,11 +320,6 @@ public abstract class AbstractControllerImpl extends SoftwareProcessImpl impleme
     @Override
     protected void connectSensors() {
         super.connectSensors();
-        if (getUrl()==null) {
-            setAttribute(MAIN_URI, URI.create(inferUrl()));
-            setAttribute(ROOT_URL, inferUrl());
-        }
-        
         // TODO when rebind policies, and rebind calls connectSensors, then this will cause problems.
         // Also relying on addServerPoolMemberTrackingPolicy to set the serverPoolAddresses and serverPoolTargets.
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/main/java/brooklyn/entity/proxy/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/LoadBalancer.java b/software/webapp/src/main/java/brooklyn/entity/proxy/LoadBalancer.java
index 0502c3f..32e2fc9 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/LoadBalancer.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/LoadBalancer.java
@@ -84,8 +84,13 @@ public interface LoadBalancer extends Entity, Startable {
     @SetFromFlag("port")
     /** port where this controller should live */
     public static final PortAttributeSensorAndConfigKey PROXY_HTTP_PORT = new PortAttributeSensorAndConfigKey(
-            "proxy.http.port", "Main HTTP port where this proxy listens", ImmutableList.of(8000, "8001+"));
-    
+            "proxy.http.port", "Main port where this proxy listens if using HTTP", ImmutableList.of(8000, "8001+"));
+
+    @SetFromFlag("httpsPort")
+    /** port where this controller should live */
+    public static final PortAttributeSensorAndConfigKey PROXY_HTTPS_PORT = new PortAttributeSensorAndConfigKey(
+            "proxy.https.port", "Main port where this proxy listens if using HTTPS", ImmutableList.of(8443, "8443+"));
+
     @SetFromFlag("protocol")
     public static final BasicAttributeSensorAndConfigKey<String> PROTOCOL = new BasicAttributeSensorAndConfigKey<String>(
             String.class, "proxy.protocol", "Main URL protocol this proxy answers (typically http or https)", null);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxController.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxController.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxController.java
index 88d1bb9..21b3c89 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxController.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxController.java
@@ -134,4 +134,9 @@ public interface NginxController extends AbstractController, HasShortName {
     
     public static final AttributeSensor<Boolean> NGINX_URL_ANSWERS_NICELY = Sensors.newBooleanSensor( "nginx.url.answers.nicely");
     public static final AttributeSensor<String> PID_FILE = Sensors.newStringSensor( "nginx.pid.file", "PID file");
+    
+    public interface NginxControllerInternal {
+        public void doExtraConfigurationDuringStart();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
index 74727fb..ef5e99a 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
@@ -18,9 +18,11 @@
  */
 package brooklyn.entity.proxy.nginx;
 
+import java.net.URI;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.slf4j.Logger;
@@ -36,21 +38,25 @@ import brooklyn.entity.basic.ServiceStateLogic.ServiceNotUpLogic;
 import brooklyn.entity.group.AbstractMembershipTrackingPolicy;
 import brooklyn.entity.proxy.AbstractControllerImpl;
 import brooklyn.entity.proxy.ProxySslConfig;
+import brooklyn.entity.proxy.nginx.NginxController.NginxControllerInternal;
 import brooklyn.event.SensorEvent;
 import brooklyn.event.SensorEventListener;
 import brooklyn.event.feed.ConfigToAttributes;
 import brooklyn.event.feed.http.HttpFeed;
 import brooklyn.event.feed.http.HttpPollConfig;
+import brooklyn.management.SubscriptionHandle;
 import brooklyn.policy.PolicySpec;
 import brooklyn.util.ResourceUtils;
 import brooklyn.util.file.ArchiveUtils;
 import brooklyn.util.guava.Functionals;
+import brooklyn.util.http.HttpTool;
 import brooklyn.util.http.HttpToolResponse;
 import brooklyn.util.stream.Streams;
 import brooklyn.util.text.Strings;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
@@ -58,13 +64,14 @@ import com.google.common.collect.Sets;
 /**
  * Implementation of the {@link NginxController} entity.
  */
-public class NginxControllerImpl extends AbstractControllerImpl implements NginxController {
+public class NginxControllerImpl extends AbstractControllerImpl implements NginxController, NginxControllerInternal {
 
     private static final Logger LOG = LoggerFactory.getLogger(NginxControllerImpl.class);
 
     private volatile HttpFeed httpFeed;
     private final Set<String> installedKeysCache = Sets.newLinkedHashSet();
     protected UrlMappingsMemberTrackerPolicy urlMappingsMemberTrackerPolicy;
+    protected SubscriptionHandle targetAddressesHandler;
 
     @Override
     public void reload() {
@@ -82,19 +89,31 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx
         return getConfig(STICKY);
     }
 
+    private class UrlInferencer implements Supplier<URI> {
+        private Map<String, String> parameters;
+        private UrlInferencer(Map<String,String> parameters) {
+            this.parameters = parameters;
+        }
+        @Override public URI get() { 
+            String baseUrl = inferUrl(true);
+            if (parameters==null || parameters.isEmpty())
+                return URI.create(baseUrl);
+            return URI.create(baseUrl+"?"+HttpTool.encodeUrlParams(parameters));
+        }
+    }
+    
     @Override
     public void connectSensors() {
         super.connectSensors();
 
         ConfigToAttributes.apply(this);
-        String accessibleRootUrl = inferUrl(true);
 
         // "up" is defined as returning a valid HTTP response from nginx (including a 404 etc)
         httpFeed = HttpFeed.builder()
+                .uniqueTag("nginx-poll")
                 .entity(this)
                 .period(getConfig(HTTP_POLL_PERIOD))
-                .baseUri(accessibleRootUrl)
-                .baseUriVars(ImmutableMap.of("include-runtime", "true"))
+                .baseUri(new UrlInferencer(ImmutableMap.of("include-runtime", "true")))
                 .poll(new HttpPollConfig<Boolean>(NGINX_URL_ANSWERS_NICELY)
                         // Any response from Nginx is good.
                         .checkSuccess(Predicates.alwaysTrue())
@@ -115,6 +134,7 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx
             ServiceNotUpLogic.updateNotUpIndicator(this, NGINX_URL_ANSWERS_NICELY, "No response from nginx yet");
         }
         addEnricher(Enrichers.builder().updatingMap(Attributes.SERVICE_NOT_UP_INDICATORS)
+            .uniqueTag("not-up-unless-url-answers")
             .from(NGINX_URL_ANSWERS_NICELY)
             .computing(Functionals.ifNotEquals(true).value("URL where nginx listens is not answering correctly (with expected header)") )
             .build());
@@ -122,9 +142,9 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx
 
         // Can guarantee that parent/managementContext has been set
         Group urlMappings = getConfig(URL_MAPPINGS);
-        if (urlMappings != null) {
+        if (urlMappings!=null && urlMappingsMemberTrackerPolicy==null) {
             // Listen to the targets of each url-mapping changing
-            subscribeToMembers(urlMappings, UrlMapping.TARGET_ADDRESSES, new SensorEventListener<Collection<String>>() {
+            targetAddressesHandler = subscribeToMembers(urlMappings, UrlMapping.TARGET_ADDRESSES, new SensorEventListener<Collection<String>>() {
                     @Override public void onEvent(SensorEvent<Collection<String>> event) {
                         updateNeeded();
                     }
@@ -139,6 +159,12 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx
     protected void removeUrlMappingsMemberTrackerPolicy() {
         if (urlMappingsMemberTrackerPolicy != null) {
             removePolicy(urlMappingsMemberTrackerPolicy);
+            urlMappingsMemberTrackerPolicy = null;
+        }
+        Group urlMappings = getConfig(URL_MAPPINGS);
+        if (urlMappings!=null && targetAddressesHandler!=null) {
+            unsubscribe(urlMappings, targetAddressesHandler);
+            targetAddressesHandler = null;
         }
     }
     
@@ -181,7 +207,10 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx
     }
 
     public void doExtraConfigurationDuringStart() {
+        computePortsAndUrls();
         reconfigureService();
+        // reconnect sensors if ports have changed
+        connectSensors();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
index 91c69e5..1c73374 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
@@ -33,6 +33,7 @@ import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.Lifecycle;
 import brooklyn.entity.basic.lifecycle.ScriptHelper;
 import brooklyn.entity.drivers.downloads.DownloadResolver;
+import brooklyn.entity.proxy.AbstractController;
 import brooklyn.location.OsDetails;
 import brooklyn.location.basic.SshMachineLocation;
 import brooklyn.management.ManagementContext;
@@ -99,10 +100,15 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
         return format("%s/%s", getRunDir(), NGINX_PID_FILE);
     }
 
+    @Deprecated /** @deprecated since 0.7.0 use #getPort */
     public Integer getHttpPort() {
         return getEntity().getPort();
     }
 
+    public Integer getPort() {
+        return getEntity().getPort();
+    }
+
     @Override
     public void rebind() {
         customizationCompleted = true;
@@ -111,7 +117,13 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
     @Override
     public void postLaunch() {
         entity.setAttribute(NginxController.PID_FILE, getRunDir() + "/" + AbstractSoftwareProcessSshDriver.PID_FILENAME);
-        entity.setAttribute(Attributes.HTTP_PORT, getHttpPort());
+        if (((AbstractController)entity).isSsl()) {
+            entity.setAttribute(Attributes.HTTPS_PORT, getPort());
+            ((EntityInternal)entity).removeAttribute(Attributes.HTTP_PORT);
+        } else {
+            entity.setAttribute(Attributes.HTTP_PORT, getPort());
+            ((EntityInternal)entity).removeAttribute(Attributes.HTTPS_PORT);
+        }
         super.postLaunch();
     }
 
@@ -288,7 +300,6 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
         }
 
         customizationCompleted = true;
-        getEntity().doExtraConfigurationDuringStart();
     }
 
     @Override
@@ -301,7 +312,9 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
         // TODO if can't be root, and ports > 1024 are in the allowed port range,
         // prefer that; could do this on SshMachineLocation which implements PortSupplier,
         // invoked from PortAttrSensorAndConfigKey, which is invoked from MachineLifecycleTasks.preStartCustom
-        Networking.checkPortsValid(MutableMap.of("httpPort", getHttpPort()));
+        Networking.checkPortsValid(MutableMap.of("port", getPort()));
+
+        getEntity().doExtraConfigurationDuringStart();
 
         // We wait for evidence of running because, using
         // brooklyn.ssh.config.tool.class=brooklyn.util.internal.ssh.cli.SshCliTool,
@@ -311,7 +324,7 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
                 .body.append(
                         format("cd %s", getRunDir()),
                         BashCommands.requireExecutable("./sbin/nginx"),
-                        sudoBashCIfPrivilegedPort(getHttpPort(), format(
+                        sudoBashCIfPrivilegedPort(getPort(), format(
                                 "nohup ./sbin/nginx -p %s/ -c conf/server.conf > %s 2>&1 &", getRunDir(), getLogFileLocation())),
                         format("for i in {1..10}\n" +
                                 "do\n" +
@@ -345,7 +358,7 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
                         format("cd %s", getRunDir()),
                         format("export PID=`cat %s`", getPidFile()),
                         "test -n \"$PID\" || exit 0",
-                        sudoIfPrivilegedPort(getHttpPort(), "kill $PID"))
+                        sudoIfPrivilegedPort(getPort(), "kill $PID"))
                 .execute();
     }
 
@@ -386,8 +399,8 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
         // calling waitForEntityStart()), we can guarantee that the start-thread's call to update will happen after
         // this call to reload. So we this can be a no-op, and just rely on that subsequent call to update.
 
-        if (!isRunning()) {
-            Lifecycle lifecycle = entity.getAttribute(NginxController.SERVICE_STATE_ACTUAL);
+        Lifecycle lifecycle = entity.getAttribute(NginxController.SERVICE_STATE_ACTUAL);
+        if (lifecycle==Lifecycle.STOPPING || lifecycle==Lifecycle.STOPPED || !isRunning()) {
             log.debug("Ignoring reload of nginx "+entity+", because service is not running (state "+lifecycle+")");
             return;
         }
@@ -412,7 +425,7 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
                 .body.append(
                         format("cd %s", getRunDir()),
                         format("export PID=`cat %s`", getPidFile()),
-                        sudoIfPrivilegedPort(getHttpPort(), "kill -HUP $PID"))
+                        sudoIfPrivilegedPort(getPort(), "kill -HUP $PID"))
                 .execute();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/UrlMapping.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/UrlMapping.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/UrlMapping.java
index 7cd7d87..d8a0377 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/UrlMapping.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/UrlMapping.java
@@ -29,7 +29,6 @@ import brooklyn.entity.basic.MethodEffector;
 import brooklyn.entity.proxy.AbstractController;
 import brooklyn.entity.proxy.ProxySslConfig;
 import brooklyn.entity.proxying.ImplementedBy;
-import brooklyn.entity.webapp.WebAppService;
 import brooklyn.event.AttributeSensor;
 import brooklyn.event.basic.Sensors;
 import brooklyn.util.flags.SetFromFlag;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java
index 8ba88b7..a8004d7 100644
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxHttpsSslIntegrationTest.java
@@ -32,24 +32,31 @@ import org.testng.annotations.Test;
 
 import brooklyn.entity.BrooklynAppLiveTestSupport;
 import brooklyn.entity.Entity;
+import brooklyn.entity.basic.EntityInternal;
 import brooklyn.entity.basic.SoftwareProcess;
 import brooklyn.entity.group.DynamicCluster;
+import brooklyn.entity.proxy.LoadBalancer;
 import brooklyn.entity.proxy.ProxySslConfig;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.webapp.JavaWebAppService;
 import brooklyn.entity.webapp.WebAppService;
 import brooklyn.entity.webapp.jboss.JBoss7Server;
+import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
 import brooklyn.location.Location;
+import brooklyn.location.basic.PortRanges;
 import brooklyn.test.Asserts;
 import brooklyn.test.HttpTestUtils;
+import brooklyn.util.exceptions.Exceptions;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 
 /**
  * Test the operation of the {@link NginxController} class.
  */
 public class NginxHttpsSslIntegrationTest extends BrooklynAppLiveTestSupport {
-    @SuppressWarnings("unused")
+    
     private static final Logger log = LoggerFactory.getLogger(NginxHttpsSslIntegrationTest.class);
 
     private NginxController nginx;
@@ -65,6 +72,13 @@ public class NginxHttpsSslIntegrationTest extends BrooklynAppLiveTestSupport {
         super.setUp();
         localLoc = mgmt.getLocationRegistry().resolve("localhost");
     }
+    
+    private static void urlContainsPort(NginxController nginx, PortAttributeSensorAndConfigKey sensor, String portRange) {
+        Integer port = nginx.getAttribute(sensor);
+        Assert.assertTrue(Iterables.contains(PortRanges.fromString(portRange), port), "Port "+port+" not in range "+portRange);
+        String url = Preconditions.checkNotNull(nginx.getAttribute(LoadBalancer.MAIN_URI), "main uri").toString();
+        Assert.assertTrue(url.contains(":"+port), "URL does not contain expected port; port "+port+", url "+url);
+    }
 
     public String getTestWar() {
         TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war");
@@ -90,12 +104,15 @@ public class NginxHttpsSslIntegrationTest extends BrooklynAppLiveTestSupport {
                 .configure("sticky", false)
                 .configure("serverPool", cluster)
                 .configure("domain", "localhost")
-                .configure("port", "8443+")
+                .configure("httpsPort", "8453+")
                 .configure("ssl", ssl));
         
         app.start(ImmutableList.of(localLoc));
 
+        urlContainsPort(nginx, LoadBalancer.PROXY_HTTPS_PORT, "8453+");
+
         final String url = nginx.getAttribute(WebAppService.ROOT_URL);
+        log.info("URL for nginx is "+url);
         if (!url.startsWith("https://")) Assert.fail("URL should be https: "+url);
         
         Asserts.succeedsEventually(new Runnable() {
@@ -128,8 +145,8 @@ public class NginxHttpsSslIntegrationTest extends BrooklynAppLiveTestSupport {
     }
 
     private String getFile(String file) {
-           return new File(getClass().getResource("/" + file).getFile()).getAbsolutePath();
-       }
+        return new File(getClass().getResource("/" + file).getFile()).getAbsolutePath();
+    }
 
     @Test(groups = "Integration")
     public void testStartsWithGlobalSsl_withPreinstalledCertificateAndKey() {
@@ -183,4 +200,39 @@ public class NginxHttpsSslIntegrationTest extends BrooklynAppLiveTestSupport {
             assertFalse(member.getAttribute(SoftwareProcess.SERVICE_UP));
         }
     }
+
+    @Test(groups = "Integration")
+    public void testStartsNonSslThenBecomesSsl() {
+        cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class)
+            .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class))
+            .configure("initialSize", 1)
+            .configure(JavaWebAppService.ROOT_WAR, getTestWar()));
+        
+        nginx = app.createAndManageChild(EntitySpec.create(NginxController.class)
+            .configure("serverPool", cluster)
+            .configure("domain", "localhost"));
+
+        app.start(ImmutableList.of(localLoc));
+
+        urlContainsPort(nginx, LoadBalancer.PROXY_HTTP_PORT, "8000-8100");
+        
+        ProxySslConfig ssl = ProxySslConfig.builder()
+                .certificateDestination(getFile("ssl/certs/localhost/server.crt"))
+                .keyDestination(getFile("ssl/certs/localhost/server.key"))
+                .build();
+        ((EntityInternal)nginx).setConfig(LoadBalancer.PROXY_HTTPS_PORT, PortRanges.fromString("8443+"));
+        ((EntityInternal)nginx).setConfig(NginxController.SSL_CONFIG, ssl);
+
+        try {
+            log.info("restarting nginx as ssl");
+            nginx.restart();
+            urlContainsPort(nginx, LoadBalancer.PROXY_HTTPS_PORT, "8443-8543");
+
+            app.stop();
+            
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/usage/qa/src/main/java/brooklyn/qa/load/SimulatedNginxControllerImpl.java
----------------------------------------------------------------------
diff --git a/usage/qa/src/main/java/brooklyn/qa/load/SimulatedNginxControllerImpl.java b/usage/qa/src/main/java/brooklyn/qa/load/SimulatedNginxControllerImpl.java
index 1fc6488..e5c40c2 100644
--- a/usage/qa/src/main/java/brooklyn/qa/load/SimulatedNginxControllerImpl.java
+++ b/usage/qa/src/main/java/brooklyn/qa/load/SimulatedNginxControllerImpl.java
@@ -99,7 +99,6 @@ public class SimulatedNginxControllerImpl extends NginxControllerImpl {
                 .period(getConfig(HTTP_POLL_PERIOD))
                 .poll(new FunctionPollConfig<Boolean,Boolean>(SERVICE_UP)
                         .callable(new Callable<Boolean>() {
-                            private int counter = 0;
                             public Boolean call() {
                                 return true;
                             }}))
@@ -158,7 +157,7 @@ public class SimulatedNginxControllerImpl extends NginxControllerImpl {
                 return;
             }
             
-            Networking.checkPortsValid(MutableMap.of("httpPort", getHttpPort()));
+            Networking.checkPortsValid(MutableMap.of("httpPort", getPort()));
 
             if (entity.getConfig(SKIP_SSH_ON_START)) {
                 // minimal ssh, so that isRunning will subsequently work
@@ -172,7 +171,7 @@ public class SimulatedNginxControllerImpl extends NginxControllerImpl {
                         .body.append(
                                 format("cd %s", getRunDir()),
                                 "echo skipping exec of requireExecutable ./sbin/nginx",
-                                sudoBashCIfPrivilegedPort(getHttpPort(), format(
+                                sudoBashCIfPrivilegedPort(getPort(), format(
                                         "echo skipping exec of nohup ./sbin/nginx -p %s/ -c conf/server.conf > %s 2>&1 &", getRunDir(), getLogFileLocation())),
                                 format("nohup sleep 100000 > %s 2>&1 < /dev/null &", getLogFileLocation()),
                                 format("echo $! > "+getPidFile()),

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java b/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
index 7c576bf..75f39b3 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
@@ -108,6 +108,7 @@ public interface EntityConfigApi {
   @ApiErrors(value = {
       @ApiError(code = 404, reason = "Could not find application or entity")
   })
+  @SuppressWarnings("rawtypes")
   public void setFromMap(
       @ApiParam(value = "Application ID or name", required = true)
       @PathParam("application") final String application,
@@ -116,7 +117,7 @@ public interface EntityConfigApi {
       @ApiParam(value = "Apply the config to all pre-existing descendants", required = false)
       @QueryParam("recurse") @DefaultValue("false") final Boolean recurse,
       @ApiParam(value = "Map of config key names to values", required = true)
-      Map<?,?> newValues
+      Map newValues
   ) ;
 
   @POST

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java b/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
index 982aa52..9f05f52 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
@@ -113,13 +113,14 @@ public interface SensorApi {
   @ApiErrors(value = {
       @ApiError(code = 404, reason = "Could not find application or entity")
   })
+  @SuppressWarnings("rawtypes")
   public void setFromMap(
       @ApiParam(value = "Application ID or name", required = true)
       @PathParam("application") final String application,
       @ApiParam(value = "Entity ID or name", required = true)
       @PathParam("entity") final String entityToken,
       @ApiParam(value = "Map of sensor names to values", required = true)
-      Map<?,?> newValues
+      Map newValues
   ) ;
 
   @POST

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
index 66c1ef7..efcd248 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
@@ -110,7 +110,7 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
 
   @SuppressWarnings({ "rawtypes", "unchecked" })
   @Override
-  public void setFromMap(String application, String entityToken, Boolean recurse, Map<?, ?> newValues) {
+  public void setFromMap(String application, String entityToken, Boolean recurse, Map newValues) {
       final EntityLocal entity = brooklyn().getEntity(application, entityToken);
       if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
           throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
@@ -119,9 +119,9 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
 
       if (LOG.isDebugEnabled())
           LOG.debug("REST user "+Entitlements.getEntitlementContext()+" setting configs "+newValues);
-      for (Map.Entry<?,?> entry: newValues.entrySet()) {
-          String configName = Strings.toString(entry.getKey());
-          Object newValue = entry.getValue();
+      for (Object entry: newValues.entrySet()) {
+          String configName = Strings.toString(((Map.Entry)entry).getKey());
+          Object newValue = ((Map.Entry)entry).getValue();
           
           ConfigKey ck = findConfig(entity, configName);
           ((EntityInternal) entity).setConfig(ck, TypeCoercions.coerce(newValue, ck.getTypeToken()));

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/a952d6b7/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
index 987a995..8c6f3f3 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
@@ -107,7 +107,7 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
     
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
-    public void setFromMap(String application, String entityToken, Map<?, ?> newValues) {
+    public void setFromMap(String application, String entityToken, Map newValues) {
         final EntityLocal entity = brooklyn().getEntity(application, entityToken);
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
             throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
@@ -116,9 +116,9 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
 
         if (log.isDebugEnabled())
             log.debug("REST user "+Entitlements.getEntitlementContext()+" setting sensors "+newValues);
-        for (Map.Entry<?,?> entry: newValues.entrySet()) {
-            String sensorName = Strings.toString(entry.getKey());
-            Object newValue = entry.getValue();
+        for (Object entry: newValues.entrySet()) {
+            String sensorName = Strings.toString(((Map.Entry)entry).getKey());
+            Object newValue = ((Map.Entry)entry).getValue();
             
             AttributeSensor sensor = findSensor(entity, sensorName);
             entity.setAttribute(sensor, newValue);


[7/9] incubator-brooklyn git commit: support ProxySslConfig being set from map, so we can configure nginx via yaml

Posted by he...@apache.org.
support ProxySslConfig being set from map, so we can configure nginx via yaml


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/ccb9a1b1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/ccb9a1b1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/ccb9a1b1

Branch: refs/heads/master
Commit: ccb9a1b1947725cb9f0e35409990a3a9f14b4673
Parents: ff7126a
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 27 11:43:21 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/proxy/ProxySslConfig.java   | 28 ++++++++++---
 .../entity/proxy/ProxySslConfigTest.java        | 42 ++++++++++++++++++++
 2 files changed, 64 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ccb9a1b1/software/webapp/src/main/java/brooklyn/entity/proxy/ProxySslConfig.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/ProxySslConfig.java b/software/webapp/src/main/java/brooklyn/entity/proxy/ProxySslConfig.java
index 219bf27..0a61021 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/ProxySslConfig.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/ProxySslConfig.java
@@ -19,6 +19,13 @@
 package brooklyn.entity.proxy;
 
 import java.io.Serializable;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.util.flags.FlagUtils;
+import brooklyn.util.flags.SetFromFlag;
 
 import com.google.common.base.Objects;
 
@@ -26,17 +33,19 @@ public class ProxySslConfig implements Serializable {
 
     private static final long serialVersionUID = -2692754611458939617L;
 
+    private static final Logger log = LoggerFactory.getLogger(ProxySslConfig.class);
+    
     public static Builder builder() {
         return new Builder();
     }
 
     public static class Builder {
-        protected String certificateSourceUrl;
-        protected String keySourceUrl;
-        protected String certificateDestination;
-        protected String keyDestination;
-        protected boolean targetIsSsl = false;
-        protected boolean reuseSessions = false;
+        @SetFromFlag protected String certificateSourceUrl;
+        @SetFromFlag protected String keySourceUrl;
+        @SetFromFlag protected String certificateDestination;
+        @SetFromFlag protected String keyDestination;
+        @SetFromFlag protected boolean targetIsSsl = false;
+        @SetFromFlag protected boolean reuseSessions = false;
 
         public Builder certificateSourceUrl(String val) {
             certificateSourceUrl = val; return this;
@@ -61,6 +70,13 @@ public class ProxySslConfig implements Serializable {
             return result;
         }
     }
+    
+    public static ProxySslConfig fromMap(Map<?,?> map) {
+        Builder b = new Builder();
+        Map<?, ?> unused = FlagUtils.setFieldsFromFlags(map, b);
+        if (!unused.isEmpty()) log.warn("Unused flags when populating "+b+" (ignoring): "+unused);
+        return b.build();
+    }
 
     private String certificateSourceUrl;
     private String keySourceUrl;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ccb9a1b1/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java
new file mode 100644
index 0000000..77ea8a5
--- /dev/null
+++ b/software/webapp/src/test/java/brooklyn/entity/proxy/ProxySslConfigTest.java
@@ -0,0 +1,42 @@
+package brooklyn.entity.proxy;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.flags.TypeCoercions;
+
+@Test
+public class ProxySslConfigTest {
+
+    @Test
+    public void testFromMap() {
+        ProxySslConfig config = TypeCoercions.coerce(MutableMap.of(
+            "certificateSourceUrl", "file://tmp/cert.txt", 
+            "keySourceUrl", "file://tmp/key.txt", 
+            "keyDestination", "dest.txt", 
+            "targetIsSsl", true, 
+            "reuseSessions", true), 
+            ProxySslConfig.class);
+        Assert.assertEquals(config.getCertificateSourceUrl(), "file://tmp/cert.txt");
+        Assert.assertEquals(config.getKeySourceUrl(), "file://tmp/key.txt");
+        Assert.assertEquals(config.getKeyDestination(), "dest.txt");
+        Assert.assertEquals(config.getTargetIsSsl(), true);
+        Assert.assertEquals(config.getReuseSessions(), true);
+    }
+    
+    @Test
+    public void testFromMapWithNullsAndDefaults() {
+        ProxySslConfig config = TypeCoercions.coerce(MutableMap.of(
+            "certificateSourceUrl", "file://tmp/cert.txt", 
+            "keySourceUrl", null, 
+            "targetIsSsl", "false"), 
+            ProxySslConfig.class);
+        Assert.assertEquals(config.getCertificateSourceUrl(), "file://tmp/cert.txt");
+        Assert.assertEquals(config.getKeySourceUrl(), null);
+        Assert.assertEquals(config.getKeyDestination(), null);
+        Assert.assertEquals(config.getTargetIsSsl(), false);
+        Assert.assertEquals(config.getReuseSessions(), false);
+    }
+    
+}


[5/9] incubator-brooklyn git commit: REST API support for setting multiple sensors or config with a map

Posted by he...@apache.org.
REST API support for setting multiple sensors or config with a map


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/25dccf0f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/25dccf0f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/25dccf0f

Branch: refs/heads/master
Commit: 25dccf0fed5186bd78b3090282a9e897dd7715a5
Parents: 7c0e0bd
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Nov 28 09:21:17 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 .../java/brooklyn/rest/api/EntityConfigApi.java | 18 +++-
 .../main/java/brooklyn/rest/api/SensorApi.java  | 14 +++
 .../rest/resources/EntityConfigResource.java    | 27 +++++-
 .../brooklyn/rest/resources/SensorResource.java | 21 +++++
 .../resources/EntityConfigResourceTest.java     | 93 ++++++++++++++++----
 .../rest/resources/SensorResourceTest.java      | 16 ++++
 6 files changed, 169 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25dccf0f/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java b/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
index 76dd25d..7c576bf 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/api/EntityConfigApi.java
@@ -104,6 +104,22 @@ public interface EntityConfigApi {
   );
 
   @POST
+  @ApiOperation(value = "Manually set multiple config values")
+  @ApiErrors(value = {
+      @ApiError(code = 404, reason = "Could not find application or entity")
+  })
+  public void setFromMap(
+      @ApiParam(value = "Application ID or name", required = true)
+      @PathParam("application") final String application,
+      @ApiParam(value = "Entity ID or name", required = true)
+      @PathParam("entity") final String entityToken,
+      @ApiParam(value = "Apply the config to all pre-existing descendants", required = false)
+      @QueryParam("recurse") @DefaultValue("false") final Boolean recurse,
+      @ApiParam(value = "Map of config key names to values", required = true)
+      Map<?,?> newValues
+  ) ;
+
+  @POST
   @Path("/{config}")
   @ApiOperation(value = "Manually set a config value")
   @ApiErrors(value = {
@@ -117,7 +133,7 @@ public interface EntityConfigApi {
           @ApiParam(value = "Config key name", required = true)
           @PathParam("config") String configName,
           @ApiParam(value = "Apply the config to all pre-existing descendants", required = false)
-          @QueryParam("raw") @DefaultValue("false") final Boolean recurse,
+          @QueryParam("recurse") @DefaultValue("false") final Boolean recurse,
           @ApiParam(value = "Value to set")
           Object newValue
   ) ;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25dccf0f/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java b/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
index 349da5a..982aa52 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/api/SensorApi.java
@@ -109,6 +109,20 @@ public interface SensorApi {
   ) ;
 
   @POST
+  @ApiOperation(value = "Manually set multiple sensor values")
+  @ApiErrors(value = {
+      @ApiError(code = 404, reason = "Could not find application or entity")
+  })
+  public void setFromMap(
+      @ApiParam(value = "Application ID or name", required = true)
+      @PathParam("application") final String application,
+      @ApiParam(value = "Entity ID or name", required = true)
+      @PathParam("entity") final String entityToken,
+      @ApiParam(value = "Map of sensor names to values", required = true)
+      Map<?,?> newValues
+  ) ;
+
+  @POST
   @Path("/{sensor}")
   @ApiOperation(value = "Manually set a sensor value")
   @ApiErrors(value = {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25dccf0f/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
index e5e2aac..66c1ef7 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/EntityConfigResource.java
@@ -89,7 +89,7 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
   
   @Override
   public String getPlain(String application, String entityToken, String configKeyName, Boolean raw) {
-      return Strings.toString(get(true, application, entityToken, configKeyName, raw));
+      return Strings.toString(get(false, application, entityToken, configKeyName, raw));
   }
 
     public Object get(boolean preferJson, String application, String entityToken, String configKeyName, Boolean raw) {
@@ -110,6 +110,31 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
 
   @SuppressWarnings({ "rawtypes", "unchecked" })
   @Override
+  public void setFromMap(String application, String entityToken, Boolean recurse, Map<?, ?> newValues) {
+      final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+      if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
+          throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
+              Entitlements.getEntitlementContext().user(), entity);
+      }
+
+      if (LOG.isDebugEnabled())
+          LOG.debug("REST user "+Entitlements.getEntitlementContext()+" setting configs "+newValues);
+      for (Map.Entry<?,?> entry: newValues.entrySet()) {
+          String configName = Strings.toString(entry.getKey());
+          Object newValue = entry.getValue();
+          
+          ConfigKey ck = findConfig(entity, configName);
+          ((EntityInternal) entity).setConfig(ck, TypeCoercions.coerce(newValue, ck.getTypeToken()));
+          if (Boolean.TRUE.equals(recurse)) {
+              for (Entity e2: Entities.descendants(entity, Predicates.alwaysTrue(), false)) {
+                  ((EntityInternal) e2).setConfig(ck, newValue);
+              }
+          }
+      }
+  }
+  
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Override
   public void set(String application, String entityToken, String configName, Boolean recurse, Object newValue) {
       final EntityLocal entity = brooklyn().getEntity(application, entityToken);
       if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25dccf0f/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
index fedd60d..987a995 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/SensorResource.java
@@ -38,6 +38,7 @@ import brooklyn.rest.api.SensorApi;
 import brooklyn.rest.domain.SensorSummary;
 import brooklyn.rest.transform.SensorTransformer;
 import brooklyn.rest.util.WebResourceUtils;
+import brooklyn.util.text.Strings;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Lists;
@@ -103,7 +104,27 @@ public class SensorResource extends AbstractBrooklynRestResource implements Sens
         if (s instanceof AttributeSensor) return (AttributeSensor<?>) s;
         return new BasicAttributeSensor<Object>(Object.class, name);
     }
+    
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Override
+    public void setFromMap(String application, String entityToken, Map<?, ?> newValues) {
+        final EntityLocal entity = brooklyn().getEntity(application, entityToken);
+        if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
+            throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify entity '%s'",
+                Entitlements.getEntitlementContext().user(), entity);
+        }
 
+        if (log.isDebugEnabled())
+            log.debug("REST user "+Entitlements.getEntitlementContext()+" setting sensors "+newValues);
+        for (Map.Entry<?,?> entry: newValues.entrySet()) {
+            String sensorName = Strings.toString(entry.getKey());
+            Object newValue = entry.getValue();
+            
+            AttributeSensor sensor = findSensor(entity, sensorName);
+            entity.setAttribute(sensor, newValue);
+        }
+    }
+    
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
     public void set(String application, String entityToken, String sensorName, Object newValue) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25dccf0f/usage/rest-server/src/test/java/brooklyn/rest/resources/EntityConfigResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/resources/EntityConfigResourceTest.java b/usage/rest-server/src/test/java/brooklyn/rest/resources/EntityConfigResourceTest.java
index 1f18f60..af8ca5d 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/resources/EntityConfigResourceTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/resources/EntityConfigResourceTest.java
@@ -18,11 +18,33 @@
  */
 package brooklyn.rest.resources;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import brooklyn.entity.basic.EntityInternal;
+import brooklyn.entity.basic.EntityPredicates;
 import brooklyn.rest.domain.ApplicationSpec;
 import brooklyn.rest.domain.EntityConfigSummary;
 import brooklyn.rest.domain.EntitySpec;
 import brooklyn.rest.testing.BrooklynRestResourceTest;
 import brooklyn.rest.testing.mocks.RestMockSimpleEntity;
+import brooklyn.util.collections.MutableMap;
+
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableMap;
@@ -30,26 +52,13 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.GenericType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import javax.annotation.Nullable;
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
 
 @Test(singleThreaded = true)
 public class EntityConfigResourceTest extends BrooklynRestResourceTest {
     
     private final static Logger log = LoggerFactory.getLogger(EntityConfigResourceTest.class);
-    private URI application;
+    private URI applicationUri;
+    private EntityInternal entity;
 
     @BeforeClass(alwaysRun = true)
     @Override
@@ -65,9 +74,11 @@ public class EntityConfigResourceTest extends BrooklynRestResourceTest {
         ClientResponse response = clientDeploy(simpleSpec);
         int status = response.getStatus();
         assertTrue(status >= 200 && status <= 299, "expected HTTP Response of 2xx but got " + status);
-        application = response.getLocation();
+        applicationUri = response.getLocation();
         log.debug("Built app: application");
-        waitForApplicationToBeRunning(application);
+        waitForApplicationToBeRunning(applicationUri);
+        
+        entity = (EntityInternal) Iterables.find(getManagementContext().getEntityManager().getEntities(), EntityPredicates.displayNameEqualTo("simple-ent"));
     }
 
     @Test
@@ -106,11 +117,57 @@ public class EntityConfigResourceTest extends BrooklynRestResourceTest {
     }
 
     @Test
-    public void testGet() throws Exception {
+    public void testGetJson() throws Exception {
         String configValue = client().resource(
                 URI.create("/v1/applications/simple-app/entities/simple-ent/config/install.version"))
+                .accept(MediaType.APPLICATION_JSON_TYPE)
                 .get(String.class);
         assertEquals(configValue, "\"1.0.0\"");
     }
 
+    @Test
+    public void testGetPlain() throws Exception {
+        String configValue = client().resource(
+                URI.create("/v1/applications/simple-app/entities/simple-ent/config/install.version"))
+                .accept(MediaType.TEXT_PLAIN_TYPE)
+                .get(String.class);
+        assertEquals(configValue, "1.0.0");
+    }
+
+    @Test
+    public void testSet() throws Exception {
+        try {
+            String uri = "/v1/applications/simple-app/entities/simple-ent/config/"+
+                RestMockSimpleEntity.SAMPLE_CONFIG.getName();
+            ClientResponse response = client().resource(uri)
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .post(ClientResponse.class, "\"hello world\"");
+            assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode());
+
+            assertEquals(entity.getConfig(RestMockSimpleEntity.SAMPLE_CONFIG), "hello world");
+            
+            String value = client().resource(uri).accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
+            assertEquals(value, "\"hello world\"");
+
+        } finally { entity.setConfig(RestMockSimpleEntity.SAMPLE_CONFIG, RestMockSimpleEntity.SAMPLE_CONFIG.getDefaultValue()); }
+    }
+
+    @Test
+    public void testSetFromMap() throws Exception {
+        try {
+            String uri = "/v1/applications/simple-app/entities/simple-ent/config";
+            ClientResponse response = client().resource(uri)
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .post(ClientResponse.class, MutableMap.of(
+                    RestMockSimpleEntity.SAMPLE_CONFIG.getName(), "hello world"));
+            assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode());
+
+            assertEquals(entity.getConfig(RestMockSimpleEntity.SAMPLE_CONFIG), "hello world");
+            
+            String value = client().resource(uri+"/"+RestMockSimpleEntity.SAMPLE_CONFIG.getName()).accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
+            assertEquals(value, "\"hello world\"");
+
+        } finally { entity.setConfig(RestMockSimpleEntity.SAMPLE_CONFIG, RestMockSimpleEntity.SAMPLE_CONFIG.getDefaultValue()); }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/25dccf0f/usage/rest-server/src/test/java/brooklyn/rest/resources/SensorResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/resources/SensorResourceTest.java b/usage/rest-server/src/test/java/brooklyn/rest/resources/SensorResourceTest.java
index bb80035..6d074c0 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/resources/SensorResourceTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/resources/SensorResourceTest.java
@@ -41,6 +41,7 @@ import brooklyn.rest.domain.EntitySpec;
 import brooklyn.rest.testing.BrooklynRestResourceTest;
 import brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 import brooklyn.test.HttpTestUtils;
+import brooklyn.util.collections.MutableMap;
 import brooklyn.util.stream.Streams;
 import brooklyn.util.text.StringFunctions;
 
@@ -233,12 +234,27 @@ public class SensorResourceTest extends BrooklynRestResourceTest {
                 .post(ClientResponse.class, 67890);
             assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode());
 
+            assertEquals(entity.getAttribute(SENSOR), (Integer)67890);
+            
             String value = client().resource(SENSORS_ENDPOINT + "/" + SENSOR_NAME).accept(MediaType.TEXT_PLAIN_TYPE).get(String.class);
             assertEquals(value, "67890 frogs");
 
         } finally { addAmphibianSensor(entity); }
     }
 
+    @Test
+    public void testSetFromMap() throws Exception {
+        try {
+            ClientResponse response = client().resource(SENSORS_ENDPOINT)
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .post(ClientResponse.class, MutableMap.of(SENSOR_NAME, 67890));
+            assertEquals(response.getStatus(), Response.Status.NO_CONTENT.getStatusCode());
+            
+            assertEquals(entity.getAttribute(SENSOR), (Integer)67890);
+
+        } finally { addAmphibianSensor(entity); }
+    }
+    
     /** Check we can delete a value */
     @Test
     public void testDelete() throws Exception {


[3/9] incubator-brooklyn git commit: fix typos and warnings

Posted by he...@apache.org.
fix typos and warnings


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/7c0e0bda
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/7c0e0bda
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/7c0e0bda

Branch: refs/heads/master
Commit: 7c0e0bda5734d17b71e7eb35c1ffd0a13e0a9630
Parents: ccb9a1b
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 27 11:43:59 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 core/src/main/java/brooklyn/util/flags/FlagUtils.java         | 7 +++----
 .../main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java | 2 +-
 .../java/io/brooklyn/camp/brooklyn/BrooklynCampPlatform.java  | 1 +
 .../brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java   | 1 -
 .../java/io/brooklyn/camp/brooklyn/MapReferenceYamlTest.java  | 6 ++----
 .../test/java/io/brooklyn/camp/brooklyn/ObjectsYamlTest.java  | 6 +-----
 6 files changed, 8 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7c0e0bda/core/src/main/java/brooklyn/util/flags/FlagUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/flags/FlagUtils.java b/core/src/main/java/brooklyn/util/flags/FlagUtils.java
index 7cd52d1..5a3ba2b 100644
--- a/core/src/main/java/brooklyn/util/flags/FlagUtils.java
+++ b/core/src/main/java/brooklyn/util/flags/FlagUtils.java
@@ -44,7 +44,6 @@ import brooklyn.util.GroovyJavaMethods;
 import brooklyn.util.config.ConfigBag;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.guava.Maybe;
-import brooklyn.util.text.Strings;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Predicate;
@@ -68,7 +67,7 @@ public class FlagUtils {
         return setFieldsFromFlagsInternal(o, Arrays.asList(o.getClass().getFields()), flags, null, true);
     }
 
-    /** see {@link #setFieldsFromFlags(Object o, ConfigBag)} */
+    /** see {@link #setFieldsFromFlags(Object, ConfigBag)} */
     public static Map<?, ?> setFieldsFromFlags(Map<?, ?> flags, Object o) {
         return setFieldsFromFlagsInternal(o, getAllFields(o.getClass()), flags, null, true);
     }
@@ -83,12 +82,12 @@ public class FlagUtils {
         setFieldsFromFlagsInternal(o, getAllFields(o.getClass()), configBag.getAllConfig(), configBag, true);
     }
 
-    /** as {@link #setFieldsFromFlags(Object o, ConfigBag)} */
+    /** as {@link #setFieldsFromFlags(Object, ConfigBag)}, but allowing control over whether default values should be set */
     public static void setFieldsFromFlags(Object o, ConfigBag configBag, boolean setDefaultVals) {
         setFieldsFromFlagsInternal(o, getAllFields(o.getClass()), configBag.getAllConfig(), configBag, setDefaultVals);
     }
 
-    /** as {@link #setFieldsFromFlags(Object o, ConfigBag)}, but specifying a subset of flags to use */
+    /** as {@link #setFieldsFromFlags(Object, ConfigBag)}, but specifying a subset of flags to use */
     public static void setFieldsFromFlagsWithBag(Object o, Map<?,?> flags, ConfigBag configBag, boolean setDefaultVals) {
         setFieldsFromFlagsInternal(o, getAllFields(o.getClass()), flags, configBag, setDefaultVals);
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7c0e0bda/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
index dabdae2..91c69e5 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxSshDriver.java
@@ -405,7 +405,7 @@ public class NginxSshDriver extends AbstractSoftwareProcessSshDriver implements
         //   sudoIfPrivilegedPort(getHttpPort(), format("./sbin/nginx -p %s/ -c conf/server.conf -s reload", getRunDir()))
         //
         // Note that if conf file is invalid, you'll get no stdout/stderr from `kill` but you
-        // do from using `nginx ... -s reload` so that can be handly when manually debugging.
+        // do from using `nginx ... -s reload` so that can be handy when manually debugging.
 
         log.debug("reloading nginx by simularing restart (kill -HUP) - {}", entity);
         newScript(RESTARTING)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7c0e0bda/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampPlatform.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampPlatform.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampPlatform.java
index f3fad01..db4ce37 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampPlatform.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampPlatform.java
@@ -46,6 +46,7 @@ public class BrooklynCampPlatform extends AggregatingCampPlatform implements Has
         addInterpreters();
         
         managementContext.addPropertiesReloadListener(new PropertiesReloadListener() {
+            private static final long serialVersionUID = -3739276553334749184L;
             @Override public void reloaded() {
                 setConfigKeyAtManagmentContext();
             }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7c0e0bda/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
index 54a3214..135fbe3 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
@@ -25,7 +25,6 @@ import io.brooklyn.camp.spi.collection.ResolvableLink;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.catalog.CatalogItem;
 import brooklyn.catalog.internal.CatalogUtils;
 import brooklyn.entity.Entity;

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7c0e0bda/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/MapReferenceYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/MapReferenceYamlTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/MapReferenceYamlTest.java
index 72ca01e..0a02838 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/MapReferenceYamlTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/MapReferenceYamlTest.java
@@ -62,7 +62,6 @@ public class MapReferenceYamlTest extends AbstractYamlTest {
         setupAndCheckTestEntityInBasicYamlWith();
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testBrooklynConfigWithMapFunction() throws Exception {
         final Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
@@ -75,7 +74,7 @@ public class MapReferenceYamlTest extends AbstractYamlTest {
             "      one: $brooklyn:entity(\"one\")",
             "      two: $brooklyn:entity(\"two\")");
 
-        Map<?,?> testMap = (Map) Entities.submit(testEntity, Tasks.builder().body(new Callable<Object>() {
+        Map<?,?> testMap = (Map<?,?>) Entities.submit(testEntity, Tasks.builder().body(new Callable<Object>() {
             @Override
             public Object call() throws Exception {
                 return testEntity.getConfig(TestEntity.CONF_MAP_THING_OBJECT);
@@ -93,7 +92,6 @@ public class MapReferenceYamlTest extends AbstractYamlTest {
         Assert.assertTrue(two instanceof BasicEntity, "Should have found a BasicEntity: " + two);
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testBrooklynConfigWithPlainMapFunction() throws Exception {
         final Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
@@ -106,7 +104,7 @@ public class MapReferenceYamlTest extends AbstractYamlTest {
             "      one: $brooklyn:entity(\"one\")",
             "      two: $brooklyn:entity(\"two\")");
 
-        Map<?,?> testMap = (Map) Entities.submit(testEntity, Tasks.builder().body(new Callable<Object>() {
+        Map<?,?> testMap = (Map<?,?>) Entities.submit(testEntity, Tasks.builder().body(new Callable<Object>() {
             @Override
             public Object call() throws Exception {
                 return testEntity.getConfig(TestEntity.CONF_MAP_PLAIN);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7c0e0bda/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/ObjectsYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/ObjectsYamlTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/ObjectsYamlTest.java
index 0551c93..21eb7a6 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/ObjectsYamlTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/ObjectsYamlTest.java
@@ -126,7 +126,6 @@ public class ObjectsYamlTest extends AbstractYamlTest {
         setupAndCheckTestEntityInBasicYamlWith();
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testBrooklynObject() throws Exception {
         Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
@@ -152,7 +151,6 @@ public class ObjectsYamlTest extends AbstractYamlTest {
         Assert.assertTrue(testObjectObject instanceof ProxySslConfig, "Expected a ProxySslConfig: "+testObjectObject);
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testBrooklynConfigurableObject() throws Exception {
         Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
@@ -183,7 +181,6 @@ public class ObjectsYamlTest extends AbstractYamlTest {
         Assert.assertTrue(configKeys.contains(ConfigurableObject.OBJECT.getName()), "Expected OBJECT key: "+configKeys);
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testBrooklynObjectPrefix() throws Exception {
         Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
@@ -196,7 +193,7 @@ public class ObjectsYamlTest extends AbstractYamlTest {
             "    - $brooklyn:object:",
             "        type: brooklyn.entity.proxy.ProxySslConfig");
 
-        List testList = testEntity.getConfig(TestEntity.CONF_LIST_PLAIN);
+        List<?> testList = testEntity.getConfig(TestEntity.CONF_LIST_PLAIN);
 
         Assert.assertEquals(testList.size(), 3);
         for (Object entry : testList) {
@@ -204,7 +201,6 @@ public class ObjectsYamlTest extends AbstractYamlTest {
         }
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testBrooklynObjectWithFunction() throws Exception {
         Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(


[4/9] incubator-brooklyn git commit: when doing Entity.addChild, create a copy of the spec and set the parent *there* if needed, so that config is inherited even when running `AbstractEntity.init()`

Posted by he...@apache.org.
when doing Entity.addChild, create a copy of the spec and set the parent *there* if needed, so that config is inherited even when running `AbstractEntity.init()`


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/ff7126af
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/ff7126af
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/ff7126af

Branch: refs/heads/master
Commit: ff7126af967f50f87810da7980b7e3159f7b9c54
Parents: 67d05d6
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Nov 25 08:50:17 2014 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 core/src/main/java/brooklyn/entity/basic/AbstractEntity.java  | 5 ++++-
 .../java/brooklyn/entity/proxying/InternalEntityFactory.java  | 7 -------
 2 files changed, 4 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ff7126af/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
index 6a64cb0..ae0179f 100644
--- a/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
+++ b/core/src/main/java/brooklyn/entity/basic/AbstractEntity.java
@@ -622,7 +622,10 @@ public abstract class AbstractEntity extends AbstractBrooklynObject implements E
      */
     @Override
     public <T extends Entity> T addChild(EntitySpec<T> spec) {
-        if (spec.getParent() != null && !this.equals(spec.getParent())) {
+        if (spec.getParent()==null) {
+            spec = EntitySpec.create(spec).parent(this);
+        }
+        if (!this.equals(spec.getParent())) {
             throw new IllegalArgumentException("Attempt to create child of "+this+" with entity spec "+spec+
                 " failed because spec has different parent: "+spec.getParent());
         }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ff7126af/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
index 50e15e6..40885b4 100644
--- a/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
+++ b/core/src/main/java/brooklyn/entity/proxying/InternalEntityFactory.java
@@ -295,13 +295,6 @@ public class InternalEntityFactory extends InternalFactory {
                 
                 ((AbstractEntity)entity).addLocations(spec.getLocations());
 
-                /* 31 Mar 2014, moved initialization (below) into this task: primarily for consistency and traceability on failure.
-                 * TBC whether this is good/bad/indifferent. My (Alex) opinion is that whether it is done in a subtask 
-                 * should be the same as whether enricher/policy/etc (below) is done subtasks, which is was added recently
-                 * in 249c96fbb18bd9d763029475e0a3dc251c01b287. @nakomis can you give exact reason code below is needed in a task
-                 * commit message said was to do with wiring up yaml sensors and policies -- which makes sense but specifics would be handy!
-                 * and would let me know if there is any reason to do / not_do the initializer code below also here! 
-                 */
                 for (EntityInitializer initializer: spec.getInitializers()) {
                     initializer.apply((EntityInternal)entity);
                 }


[9/9] incubator-brooklyn git commit: This closes #373

Posted by he...@apache.org.
This closes #373


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b3cea88c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b3cea88c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b3cea88c

Branch: refs/heads/master
Commit: b3cea88cf693c6ed77afd82050e9ae3cf9ec588c
Parents: dd716b3 0b40243
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Dec 15 16:57:13 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Dec 15 16:57:13 2014 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/proxying/EntitySpec.java    |  4 +-
 .../brooklyn/entity/basic/AbstractEntity.java   |  5 +-
 .../brooklyn/entity/basic/EntityPredicates.java |  2 +-
 .../entity/proxying/InternalEntityFactory.java  |  7 --
 .../event/feed/AttributePollHandler.java        | 12 ++-
 .../main/java/brooklyn/event/feed/Poller.java   |  2 -
 .../java/brooklyn/event/feed/http/HttpFeed.java |  2 +-
 .../event/feed/http/HttpPollConfig.java         | 15 +---
 .../java/brooklyn/util/flags/FlagUtils.java     |  7 +-
 .../main/java/brooklyn/util/http/HttpTool.java  | 17 ++++
 .../entity/proxy/AbstractController.java        |  2 +-
 .../entity/proxy/AbstractControllerImpl.java    | 21 +++--
 .../brooklyn/entity/proxy/LoadBalancer.java     |  9 +-
 .../brooklyn/entity/proxy/ProxySslConfig.java   | 28 ++++--
 .../entity/proxy/nginx/NginxController.java     |  5 ++
 .../entity/proxy/nginx/NginxControllerImpl.java | 45 ++++++++--
 .../entity/proxy/nginx/NginxSshDriver.java      | 31 +++++--
 .../brooklyn/entity/proxy/nginx/UrlMapping.java |  1 -
 .../entity/proxy/ProxySslConfigTest.java        | 60 +++++++++++++
 .../nginx/NginxHttpsSslIntegrationTest.java     | 60 ++++++++++++-
 .../camp/brooklyn/BrooklynCampPlatform.java     |  1 +
 .../lookup/AbstractTemplateBrooklynLookup.java  |  1 -
 .../camp/brooklyn/MapReferenceYamlTest.java     |  6 +-
 .../brooklyn/camp/brooklyn/ObjectsYamlTest.java |  6 +-
 usage/launcher/src/test/resources/nginx.yaml    | 27 ++++++
 usage/launcher/src/test/resources/web.yaml      |  2 +-
 .../qa/load/SimulatedNginxControllerImpl.java   |  5 +-
 .../java/brooklyn/rest/api/EntityConfigApi.java | 19 +++-
 .../main/java/brooklyn/rest/api/SensorApi.java  | 15 ++++
 .../rest/resources/EntityConfigResource.java    | 27 +++++-
 .../brooklyn/rest/resources/SensorResource.java | 21 +++++
 .../resources/EntityConfigResourceTest.java     | 93 ++++++++++++++++----
 .../rest/resources/SensorResourceTest.java      | 16 ++++
 33 files changed, 469 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b3cea88c/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxController.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b3cea88c/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
----------------------------------------------------------------------


[2/9] incubator-brooklyn git commit: ensure fields are copied when cloning a spec

Posted by he...@apache.org.
ensure fields are copied when cloning a spec


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/92ebdbfc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/92ebdbfc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/92ebdbfc

Branch: refs/heads/master
Commit: 92ebdbfc1083f7eae9ec88a8fc5d66f59b6db413
Parents: f287705
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Dec 8 11:11:29 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 api/src/main/java/brooklyn/entity/proxying/EntitySpec.java | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/92ebdbfc/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java b/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
index 1b22387..6fa8e73 100644
--- a/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
+++ b/api/src/main/java/brooklyn/entity/proxying/EntitySpec.java
@@ -118,7 +118,9 @@ public class EntitySpec<T extends Entity> extends AbstractBrooklynObjectSpec<T,E
                 .addInitializers(spec.getInitializers())
                 .children(spec.getChildren())
                 .members(spec.getMembers())
-                .groups(spec.getGroups());
+                .groups(spec.getGroups())
+                .catalogItemId(spec.getCatalogItemId())
+                .locations(spec.getLocations());
         
         if (spec.getParent() != null) result.parent(spec.getParent());
         if (spec.getImplementation() != null) result.impl(spec.getImplementation());


[6/9] incubator-brooklyn git commit: add nginx yaml sample, and prevent multiple feeds getting added

Posted by he...@apache.org.
add nginx yaml sample, and prevent multiple feeds getting added


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/f287705d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/f287705d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/f287705d

Branch: refs/heads/master
Commit: f287705d5e075e9021414d08ce577ccaea157c2d
Parents: a952d6b
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Dec 8 10:32:04 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Dec 12 13:54:55 2014 +0000

----------------------------------------------------------------------
 .../brooklyn/entity/proxy/nginx/NginxControllerImpl.java    | 4 ++--
 usage/launcher/src/test/resources/nginx.yaml                | 9 +++++++++
 usage/launcher/src/test/resources/web.yaml                  | 2 +-
 3 files changed, 12 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f287705d/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
index ef5e99a..3c77fb7 100644
--- a/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/proxy/nginx/NginxControllerImpl.java
@@ -109,7 +109,7 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx
         ConfigToAttributes.apply(this);
 
         // "up" is defined as returning a valid HTTP response from nginx (including a 404 etc)
-        httpFeed = HttpFeed.builder()
+        httpFeed = addFeed(HttpFeed.builder()
                 .uniqueTag("nginx-poll")
                 .entity(this)
                 .period(getConfig(HTTP_POLL_PERIOD))
@@ -126,7 +126,7 @@ public class NginxControllerImpl extends AbstractControllerImpl implements Nginx
                                     return actual != null && actual.size() == 1;
                                 }})
                         .setOnException(false))
-                .build();
+                .build());
         
         if (!Lifecycle.RUNNING.equals(getAttribute(SERVICE_STATE_ACTUAL))) {
             // TODO when updating the map, if it would change from empty to empty on a successful run

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f287705d/usage/launcher/src/test/resources/nginx.yaml
----------------------------------------------------------------------
diff --git a/usage/launcher/src/test/resources/nginx.yaml b/usage/launcher/src/test/resources/nginx.yaml
new file mode 100644
index 0000000..47a846e
--- /dev/null
+++ b/usage/launcher/src/test/resources/nginx.yaml
@@ -0,0 +1,9 @@
+name: Sample Nginx on SSL
+location: localhost
+services:
+- type: brooklyn.entity.proxy.nginx.NginxController
+  ssl:
+    certificateDestination: /tmp/server.crt
+    keyDestination: /tmp/server.key
+  httpsPort: 8443+
+# normally also specify a group, pointing at a web app; or use controlled dynamic web app cluster

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/f287705d/usage/launcher/src/test/resources/web.yaml
----------------------------------------------------------------------
diff --git a/usage/launcher/src/test/resources/web.yaml b/usage/launcher/src/test/resources/web.yaml
index ccebc15..00edf4e 100644
--- a/usage/launcher/src/test/resources/web.yaml
+++ b/usage/launcher/src/test/resources/web.yaml
@@ -16,7 +16,7 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-name: Storm Sample App
+name: Sample Web App
 services:
 - serviceType: brooklyn.entity.webapp.ControlledDynamicWebAppCluster
   name: Analytics Web App