blob: f9e30a0d0884decbdc07ba7b8badcf755e315763 [file] [log] [blame]
/*
* 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.jclouds.openstack.heat.v1.features;
import com.google.common.base.Predicate;
import com.google.common.base.Throwables;
import org.jclouds.openstack.heat.v1.domain.Stack;
import org.jclouds.openstack.heat.v1.domain.StackResource;
import org.jclouds.openstack.heat.v1.domain.StackResourceStatus;
import org.jclouds.openstack.heat.v1.domain.StackStatus;
import org.jclouds.openstack.heat.v1.internal.BaseHeatApiLiveTest;
import org.jclouds.openstack.heat.v1.options.CreateStack;
import org.jclouds.openstack.heat.v1.options.UpdateStack;
import org.jclouds.util.Strings2;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.jclouds.util.Predicates2.retry;
/**
* Tests parsing and Guice wiring of StackApi
*/
@Test(groups = "live", testName = "StackApiLiveTest")
public class StackApiLiveTest extends BaseHeatApiLiveTest {
public static final String TEMPLATE_URL = "http://10.5.5.121/Installs/cPaaS/YAML/simple_stack.yaml";
protected String stackName = System.getProperty("user.name").replace('.', '-').toLowerCase();
public void testList() {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
List<Stack> stacks = stackApi.list();
assertThat(stacks).isNotEmpty();
int oldStackSize = stacks.size();
CreateStack createStack = CreateStack.builder().name(getName()).templateUrl(TEMPLATE_URL).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
stacks = stackApi.list();
assertThat(stacks.size()).isEqualTo(oldStackSize + 1);
}
}
public void testGetStackWitnNameAndID() {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
List<Stack> stacks = stackApi.list();
assertThat(stacks).isNotNull();
Stack stack = stackApi.get(stacks.get(0).getName(), stacks.get(0).getId());
assertThat(stack).isNotNull();
assertThat(stack.getId()).isEqualTo(stacks.get(0).getId());
}
}
public void testGetStack() {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
List<Stack> stacks = stackApi.list();
assertThat(stacks).isNotNull();
Stack stack = stackApi.get(stacks.get(0).getId());
assertThat(stack).isNotNull();
assertThat(stack.getId()).isEqualTo(stacks.get(0).getId());
}
}
public void testCreateWithTempletUrl() {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
CreateStack createStack = CreateStack.builder().name(getName()).templateUrl(TEMPLATE_URL).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
}
}
public void testDeleteStack() {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
String stackName = getName();
CreateStack createStack = CreateStack.builder().name(stackName).templateUrl(TEMPLATE_URL).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
assertThat(stackApi.delete(stackName, stack.getId())).isTrue();
Stack stackAfterDelete = stackApi.get(stackName, stack.getId());
assertThat(stackAfterDelete).isNotNull();
}
}
public void testCreateWithDisableRollback() {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
CreateStack createStack = CreateStack.builder().name(getName()).templateUrl(TEMPLATE_URL).disableRollback(false).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
assertThat(stack.isDisableRollback()).isFalse();
}
}
public void testCreateWithTemplate() throws ParseException {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
JSONParser parser = new JSONParser();
Object obj = parser.parse(stringFromResource("/simple_stack.json"));
JSONObject jsonObject = (JSONObject) obj;
CreateStack createStack = CreateStack.builder().name(getName()).template(String.valueOf(jsonObject.get("template"))).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
}
}
public void testUpdateStack() throws ParseException {
for (String region : api.getConfiguredRegions()) {
final StackApi stackApi = api.getStackApi(region);
JSONParser parser = new JSONParser();
Object obj = parser.parse(stringFromResource("/simple_stack.json"));
JSONObject jsonObject = (JSONObject) obj;
String stackName = getName();
CreateStack createStack = CreateStack.builder().name(stackName).template(String.valueOf(jsonObject.get("template"))).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
String stackId = stack.getId();
assertThat(stackId).isNotEmpty();
boolean success = retry(new Predicate<String>() {
public boolean apply(String stackId) {
return stackApi.get(stackId).getStatus() == StackStatus.CREATE_COMPLETE;
}
}, 60, 1, SECONDS).apply(stackId);
if (!success) {
Assert.fail("Stack didn't get to status CREATE_COMPLETE in 20m.");
}
UpdateStack updateOptions = UpdateStack.builder().templateUrl(TEMPLATE_URL).build();
assertThat(stackApi.update(stackName, stack.getId(), updateOptions)).isTrue();
Stack stackAfterUpdate = stackApi.get(stackName, stack.getId());
assertThat(stackAfterUpdate.getStatus()).isEqualTo(StackStatus.UPDATE_IN_PROGRESS);
}
}
public void testCreateWithParameters() throws ParseException {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("key_name", "myKey");
JSONParser parser = new JSONParser();
Object obj = parser.parse(stringFromResource("/stack_with_parameters.json"));
JSONObject jsonObject = (JSONObject) obj;
CreateStack createStack = CreateStack.builder().name(getName()).template(String.valueOf(jsonObject.get("template")))
.parameters(parameters).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
Stack stackFromList = stackApi.get(stack.getId());
assertThat(stackFromList).isNotNull();
assertThat(stackFromList.getId()).isEqualTo(stack.getId());
for (String parmName : parameters.keySet()) {
assertThat(stackFromList.getParameters().containsKey(parmName)).isTrue();
}
}
}
public void testCreateWithFilesAndEnvironment() throws IOException, ParseException {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
JSONParser parser = new JSONParser();
Object obj = parser.parse(stringFromResource("/stack_with_environment_and_files.json"));
JSONObject jsonObject = (JSONObject) obj;
Object objFilesJsone = parser.parse(stringFromResource("/files_for_atck_template.json"));
JSONObject filesAsJason = (JSONObject) objFilesJsone;
Map<String, String> files = new HashMap<String, String>();
files.put("VolumeB.template.yaml", String.valueOf(filesAsJason.get("VolumeB.template.yaml")));
CreateStack createStack = CreateStack.builder().name(getName())
.template(String.valueOf(jsonObject.get("template")))
.environment(String.valueOf(jsonObject.get("environment")))
.files(files).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
}
}
public void testListAndGetStackResources() throws ParseException {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
JSONParser parser = new JSONParser();
Object obj = parser.parse(stringFromResource("/stack_with_parameters.json"));
JSONObject jsonObject = (JSONObject) obj;
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("key_name", "myKey");
String stackName = getName();
CreateStack createStack = CreateStack.builder().name(stackName).template(String.valueOf(jsonObject.get("template"))).parameters(parameters).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
List<StackResource> resources = stackApi.listStackResources(stackName, stack.getId());
assertThat(resources).isNotNull();
assertThat(resources).isNotEmpty();
for (StackResource stackResource : resources) {
assertThat(stackResource).isNotNull();
String stackResourceName = stackResource.getName();
assertThat(stackResourceName).isNotNull();
assertThat(stackResourceName).isNotEmpty();
assertThat(stackResource.getStatus()).isNotEqualTo(StackResourceStatus.UNRECOGNIZED);
StackResource resourceFromGet = stackApi.getStackResource(stackName, stack.getId(), stackResourceName);
assertThat(resourceFromGet).isNotNull();
assertThat(resourceFromGet.getName()).isEqualTo(stackResourceName);
}
}
}
public void testGetStackResourceMetadata() throws ParseException {
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
JSONParser parser = new JSONParser();
Object obj = parser.parse(stringFromResource("/simple_stack.json"));
JSONObject jsonObject = (JSONObject) obj;
String stackName = getName();
CreateStack createStack = CreateStack.builder().name(stackName).template(String.valueOf(jsonObject.get("template"))).build();
Stack stack = stackApi.create(createStack);
assertThat(stack).isNotNull();
assertThat(stack.getId()).isNotEmpty();
List<StackResource> resources = stackApi.listStackResources(stackName, stack.getId());
assertThat(resources).isNotNull();
assertThat(resources).isNotEmpty();
for (StackResource stackResource : resources) {
assertThat(stackResource).isNotNull();
String stackResourceName = stackResource.getName();
assertThat(stackResourceName).isNotNull();
assertThat(stackResourceName).isNotEmpty();
assertThat(stackResource.getStatus()).isNotEqualTo(StackResourceStatus.UNRECOGNIZED);
Map metadata = stackApi.getStackResourceMetadata(stackName, stack.getId(), stackResourceName);
assertThat(metadata).isNotNull();
assertThat(metadata).isNotEmpty();
}
}
}
@AfterClass
public void cleanup(){
for (String region : api.getConfiguredRegions()) {
StackApi stackApi = api.getStackApi(region);
List<Stack> stacks = stackApi.list();
for (Stack stack : stacks){
if (stack.getName().startsWith(stackName)){
stackApi.delete(stack.getName(), stack.getId());
}
}
}
}
private String getName() {
return stackName + "_" + System.currentTimeMillis();
}
private String stringFromResource(String resourceName) {
try {
return Strings2.toStringAndClose(getClass().getResourceAsStream(resourceName));
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
}