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 2017/10/03 14:24:10 UTC

[33/35] brooklyn-server git commit: add adjuncts rest test, and minor fixes

add adjuncts rest test, and minor fixes


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

Branch: refs/heads/master
Commit: d5d72cb9d98430112b93559a7f51d6c5b3e6a62f
Parents: 28dbb83
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Oct 3 13:18:20 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Oct 3 13:18:20 2017 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/rest/api/AdjunctApi.java    |   2 +-
 .../rest/resources/AdjunctResource.java         |   7 +-
 .../brooklyn/rest/resources/PolicyResource.java |   1 -
 .../rest/resources/AdjunctResourceTest.java     | 198 +++++++++++++++++++
 4 files changed, 202 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d5d72cb9/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java
index da5c1bf..ee43441 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java
@@ -72,7 +72,7 @@ public interface AdjunctApi {
             @ApiResponse(code = 404, message = "Could not find application or entity"),
             @ApiResponse(code = 400, message = "Type is not a suitable adjunct")
     })
-    public AdjunctSummary addAdjunct(
+    public AdjunctDetail addAdjunct(
             @ApiParam(name = "application", value = "Application ID or name", required = true)
             @PathParam("application") String application,
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d5d72cb9/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java
index 6090e6d..1111193 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java
@@ -106,7 +106,7 @@ public class AdjunctResource extends AbstractBrooklynRestResource implements Adj
     // TODO would like to make 'config' arg optional but jersey complains if we do
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Override
-    public AdjunctSummary addAdjunct(String application, String entityToken, String adjunctTypeName, Map<String, String> config) {
+    public AdjunctDetail addAdjunct(String application, String entityToken, String adjunctTypeName, Map<String, String> config) {
         Entity entity = brooklyn().getEntity(application, entityToken);
         if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) {
             throw WebResourceUtils.forbidden("User '%s' is not authorized to modify entity '%s'",
@@ -227,7 +227,7 @@ public class AdjunctResource extends AbstractBrooklynRestResource implements Adj
         EntityAdjunct adjunct = brooklyn().getAdjunct(entity, adjunctToken);
 
         List<ConfigSummary> result = Lists.newArrayList();
-        for (ConfigKey<?> key : adjunct.config().findKeysPresent(Predicates.alwaysTrue())) {
+        for (ConfigKey<?> key : adjunct.config().findKeysDeclared(Predicates.alwaysTrue())) {
             result.add(ConfigTransformer.of(key).on(entity, adjunct).includeLinks(ui.getBaseUriBuilder(), false, true).transform());
         }
         return result;
@@ -237,7 +237,6 @@ public class AdjunctResource extends AbstractBrooklynRestResource implements Adj
     // (and in sensors class)
     @Override
     public Map<String, Object> batchConfigRead(String application, String entityToken, String adjunctToken) {
-        // TODO: add test
         return EntityTransformer.getConfigValues(brooklyn(), brooklyn().getAdjunct(application, entityToken, adjunctToken) );
     }
 
@@ -266,7 +265,7 @@ public class AdjunctResource extends AbstractBrooklynRestResource implements Adj
         if (cki.isEmpty()) throw WebResourceUtils.notFound("Cannot find config key '%s' in adjunct '%s' of entity '%s'", configKeyName, adjunctToken, entityToken);
         ConfigKey<?> ck = cki.iterator().next();
         
-        adjunct.config().set((ConfigKey) cki, TypeCoercions.coerce(value, ck.getTypeToken()));
+        adjunct.config().set((ConfigKey) ck, TypeCoercions.coerce(value, ck.getTypeToken()));
 
         return Response.status(Response.Status.OK).build();
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d5d72cb9/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyResource.java
index 125b0b7..924d3fd 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/PolicyResource.java
@@ -71,7 +71,6 @@ public class PolicyResource extends AbstractBrooklynRestResource implements Poli
     // (and in sensors class)
     @Override
     public Map<String, Boolean> batchConfigRead( String application, String entityToken) {
-        // TODO: add test
         Entity entity = brooklyn().getEntity(application, entityToken);
         Map<String, Boolean> result = Maps.newLinkedHashMap();
         for (Policy p : entity.policies()) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d5d72cb9/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java
new file mode 100644
index 0000000..2bd9f2d
--- /dev/null
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/AdjunctResourceTest.java
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.rest.resources;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.fail;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.brooklyn.api.objs.HighlightTuple;
+import org.apache.brooklyn.rest.domain.AdjunctDetail;
+import org.apache.brooklyn.rest.domain.AdjunctSummary;
+import org.apache.brooklyn.rest.domain.ApplicationSpec;
+import org.apache.brooklyn.rest.domain.ConfigSummary;
+import org.apache.brooklyn.rest.domain.EntitySpec;
+import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
+import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
+import org.apache.brooklyn.rest.testing.mocks.RestMockSimplePolicy;
+import org.apache.brooklyn.test.Asserts;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+@Test(singleThreaded = true,
+        // by using a different suite name we disallow interleaving other tests between the methods of this test class, which wrecks the test fixtures
+        suiteName = "AdjunctResourceTest")
+public class AdjunctResourceTest extends BrooklynRestResourceTest {
+
+    private static final Logger log = LoggerFactory.getLogger(AdjunctResourceTest.class);
+
+    private static final String ENDPOINT = "/applications/simple-app/entities/simple-ent/adjuncts/";
+
+    private final ApplicationSpec simpleSpec = ApplicationSpec.builder().name("simple-app").entities(
+            ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))).locations(
+            ImmutableSet.of("localhost")).build();
+
+    private String policyId;
+    
+    @BeforeClass(alwaysRun = true)
+    public void setUp() throws Exception {
+        startServer();
+        Response aResponse = clientDeploy(simpleSpec);
+        waitForApplicationToBeRunning(aResponse.getLocation());
+
+        Response pResponse = client().path(ENDPOINT)
+                .query("type", RestMockSimplePolicy.class.getCanonicalName())
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .post(toJsonEntity(ImmutableMap.of()));
+
+        AdjunctDetail response = pResponse.readEntity(AdjunctDetail.class);
+        assertNotNull(response.getId());
+        policyId = response.getId();
+
+    }
+
+    @Test
+    public void testListAdjuncts() throws Exception {
+        Set<AdjunctSummary> adjuncts = client().path(ENDPOINT)
+                .get(new GenericType<Set<AdjunctSummary>>() {});
+        
+        AdjunctSummary policy = null;
+        List<AdjunctSummary> others = MutableList.of();
+        for (AdjunctSummary adj : adjuncts) {
+            if (adj.getId().equals(policyId)) {
+                policy = adj;
+            } else {
+                others.add(adj);
+            }
+        }
+        
+        log.info("Non-policy adjuncts: "+others);
+        Asserts.assertSize(others, 4);
+
+        assertEquals(policy.getName(), RestMockSimplePolicy.class.getName());
+    }
+    
+
+    @Test
+    public void testGetDetail() throws Exception {
+        AdjunctDetail policy = client().path(ENDPOINT+policyId)
+                .get(AdjunctDetail.class);
+        
+        assertEquals(policy.getName(), RestMockSimplePolicy.class.getName());
+    }
+
+    @Test
+    public void testListConfig() throws Exception {
+        Set<ConfigSummary> config = client().path(ENDPOINT + policyId + "/config")
+                .get(new GenericType<Set<ConfigSummary>>() {});
+        
+        Set<String> configNames = Sets.newLinkedHashSet();
+        for (ConfigSummary conf : config) {
+            configNames.add(conf.getName());
+        }
+
+        assertEquals(configNames, ImmutableSet.of(
+                RestMockSimplePolicy.SAMPLE_CONFIG.getName(),
+                RestMockSimplePolicy.INTEGER_CONFIG.getName()));
+    }
+
+    @Test
+    public void testGetNonExistentConfigReturns404() throws Exception {
+        String invalidConfigName = "doesnotexist";
+        try {
+            ConfigSummary summary = client().path(ENDPOINT + policyId + "/config/" + invalidConfigName)
+                    .get(ConfigSummary.class);
+            fail("Should have thrown 404, but got "+summary);
+        } catch (Exception e) {
+            if (!e.toString().contains("404")) throw e;
+        }
+    }
+
+    @Test
+    public void testGetDefaultValue() throws Exception {
+        String configName = RestMockSimplePolicy.SAMPLE_CONFIG.getName();
+        String expectedVal = RestMockSimplePolicy.SAMPLE_CONFIG.getDefaultValue();
+        
+        String configVal = client().path(ENDPOINT + policyId + "/config/" + configName)
+                .get(String.class);
+        assertEquals(configVal, expectedVal);
+    }
+    
+    @Test(dependsOnMethods = "testGetDefaultValue")
+    public void testReconfigureConfig() throws Exception {
+        String configName = RestMockSimplePolicy.SAMPLE_CONFIG.getName();
+        
+        Response response = client().path(ENDPOINT + policyId + "/config/" + configName)
+                .post(toJsonEntity("newval"));
+
+        assertEquals(response.getStatus(), Response.Status.OK.getStatusCode());
+    }
+    
+    @Test(dependsOnMethods = "testReconfigureConfig")
+    public void testGetConfigValue() throws Exception {
+        String configName = RestMockSimplePolicy.SAMPLE_CONFIG.getName();
+        String expectedVal = "newval";
+        
+        Map<String, Object> allState = client().path(ENDPOINT + policyId + "/config-current")
+                .get(new GenericType<Map<String, Object>>() {});
+        assertEquals(allState, ImmutableMap.of(configName, expectedVal));
+        
+        String configVal = client().path(ENDPOINT + policyId + "/config/" + configName)
+                .get(String.class);
+        assertEquals(configVal, expectedVal);
+    }
+
+    @Test
+    public void testHighlights() throws Exception {
+        Set<AdjunctSummary> policies = client().path(ENDPOINT)
+            .query("adjunctType", "policy")
+            .get(new GenericType<Set<AdjunctSummary>>() {});
+
+        assertEquals(policies.size(), 1);
+        AdjunctSummary policySummary = policies.iterator().next();
+
+        Map<String, HighlightTuple> highlights = policySummary.getHighlights();
+
+        assertEquals(highlights.size(), 2);
+        HighlightTuple highlightTupleTask = highlights.get("testNameTask");
+        assertEquals(highlightTupleTask.getDescription(), "testDescription");
+        assertEquals(highlightTupleTask.getTime(), 123L);
+        assertEquals(highlightTupleTask.getTaskId(), "testTaskId");
+
+        HighlightTuple highlightTupleNoTask = highlights.get("testNameNoTask");
+        assertEquals(highlightTupleNoTask.getDescription(), "testDescription");
+        assertEquals(highlightTupleNoTask.getTime(), 123L);
+        assertEquals(highlightTupleNoTask.getTaskId(), null);
+    }
+}