/*
* 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.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 org.apache.brooklyn.core.entity.EntityInternal;
import org.apache.brooklyn.core.entity.EntityPredicates;
import org.apache.brooklyn.rest.domain.ApplicationSpec;
import org.apache.brooklyn.rest.domain.EntityConfigSummary;
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.util.collections.MutableMap;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
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;
@Test(singleThreaded = true)
public class EntityConfigResourceTest extends BrooklynRestResourceTest {
private final static Logger log = LoggerFactory.getLogger(EntityConfigResourceTest.class);
private URI applicationUri;
private EntityInternal entity;
@BeforeClass(alwaysRun = true)
@Override
public void setUp() throws Exception {
super.setUp(); // We require that the superclass setup is done first, as we will be calling out to Jersey
// Deploy an application that we'll use to read the configuration of
final ApplicationSpec simpleSpec = ApplicationSpec.builder().name("simple-app").
entities(ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName(), ImmutableMap.of("install.version", "1.0.0")))).
locations(ImmutableSet.of("localhost")).
build();
ClientResponse response = clientDeploy(simpleSpec);
int status = response.getStatus();
assertTrue(status >= 200 && status <= 299, "expected HTTP Response of 2xx but got " + status);
applicationUri = response.getLocation();
log.debug("Built app: application");
waitForApplicationToBeRunning(applicationUri);
entity = (EntityInternal) Iterables.find(getManagementContext().getEntityManager().getEntities(), EntityPredicates.displayNameEqualTo("simple-ent"));
}
@Test
public void testList() throws Exception {
List<EntityConfigSummary> entityConfigSummaries = client().resource(
URI.create("/v1/applications/simple-app/entities/simple-ent/config"))
.get(new GenericType<List<EntityConfigSummary>>() {
});
// Default entities have over a dozen config entries, but it's unnecessary to test them all; just pick one
// representative config key
Optional<EntityConfigSummary> configKeyOptional = Iterables.tryFind(entityConfigSummaries, new Predicate<EntityConfigSummary>() {
@Override
public boolean apply(@Nullable EntityConfigSummary input) {
return input != null && "install.version".equals(input.getName());
}
});
assertTrue(configKeyOptional.isPresent());
assertEquals(configKeyOptional.get().getType(), "java.lang.String");
assertEquals(configKeyOptional.get().getDescription(), "Suggested version");
assertFalse(configKeyOptional.get().isReconfigurable());
assertNull(configKeyOptional.get().getDefaultValue());
assertNull(configKeyOptional.get().getLabel());
assertNull(configKeyOptional.get().getPriority());
}
@Test
public void testBatchConfigRead() throws Exception {
Map<String, Object> currentState = client().resource(
URI.create("/v1/applications/simple-app/entities/simple-ent/config/current-state"))
.get(new GenericType<Map<String, Object>>() {
});
assertTrue(currentState.containsKey("install.version"));
assertEquals(currentState.get("install.version"), "1.0.0");
}
@Test
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.config().set(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.config().set(RestMockSimpleEntity.SAMPLE_CONFIG, RestMockSimpleEntity.SAMPLE_CONFIG.getDefaultValue()); }
}
}