blob: 0154b7cd1efc951ce060ce3a7acd96e88be1ac08 [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.rackspace.autoscale.v1.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.jclouds.openstack.v2_0.domain.Link;
import org.jclouds.rackspace.autoscale.v1.domain.Group;
import org.jclouds.rackspace.autoscale.v1.domain.GroupConfiguration;
import org.jclouds.rackspace.autoscale.v1.domain.LaunchConfiguration;
import org.jclouds.rackspace.autoscale.v1.domain.LaunchConfiguration.LaunchConfigurationType;
import org.jclouds.rackspace.autoscale.v1.domain.LoadBalancer;
import org.jclouds.rackspace.autoscale.v1.domain.Personality;
import org.jclouds.rackspace.autoscale.v1.domain.CreateScalingPolicy;
import org.jclouds.rackspace.autoscale.v1.domain.CreateScalingPolicy.ScalingPolicyTargetType;
import org.jclouds.rackspace.autoscale.v1.domain.CreateScalingPolicy.ScalingPolicyType;
import org.jclouds.rackspace.autoscale.v1.domain.ScalingPolicy;
import org.jclouds.rackspace.autoscale.v1.domain.CreateWebhook;
import org.jclouds.rackspace.autoscale.v1.domain.Webhook;
import org.jclouds.rackspace.autoscale.v1.internal.BaseAutoscaleApiLiveTest;
import org.jclouds.rackspace.autoscale.v1.utils.AutoscaleUtils;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.Uninterruptibles;
/**
* Webhook live test
*/
@Test(groups = "live", testName = "WebhookApiLiveTest", singleThreaded = true)
public class WebhookApiLiveTest extends BaseAutoscaleApiLiveTest {
private static Map<String, List<Group>> created = Maps.newHashMap();
@Override
@BeforeClass(groups = { "integration", "live" })
public void setup() {
super.setup();
for (String region : api.getConfiguredRegions()) {
List<Group> createdGroupList = Lists.newArrayList();
created.put(region, createdGroupList);
GroupApi groupApi = api.getGroupApi(region);
GroupConfiguration groupConfiguration = GroupConfiguration.builder().maxEntities(10).cooldown(3)
.name("testscalinggroup198547").minEntities(0)
.metadata(ImmutableMap.of("gc_meta_key_2", "gc_meta_value_2", "gc_meta_key_1", "gc_meta_value_1"))
.build();
LaunchConfiguration launchConfiguration = LaunchConfiguration
.builder()
.loadBalancers(ImmutableList.of(LoadBalancer.builder().port(8080).id(9099).build()))
.serverName("autoscale_server")
.serverImageRef("5cc098a5-7286-4b96-b3a2-49f4c4f82537")
.serverFlavorRef("2")
.serverDiskConfig("AUTO")
.serverMetadata(
ImmutableMap
.of("build_config", "core", "meta_key_1", "meta_value_1", "meta_key_2", "meta_value_2"))
.networks(
ImmutableList.of("11111111-1111-1111-1111-111111111111", "00000000-0000-0000-0000-000000000000"))
.personalities(
ImmutableList.of(Personality.builder().path("/root/.csivh")
.contents("VGhpcyBpcyBhIHRlc3QgZmlsZS4=").build()))
.type(LaunchConfigurationType.LAUNCH_SERVER).build();
List<CreateScalingPolicy> scalingPolicies = Lists.newArrayList();
CreateScalingPolicy scalingPolicy = CreateScalingPolicy.builder().cooldown(3).type(ScalingPolicyType.WEBHOOK)
.name("scale up by 1").targetType(ScalingPolicyTargetType.INCREMENTAL).target("1").build();
scalingPolicies.add(scalingPolicy);
Group g = groupApi.create(groupConfiguration, launchConfiguration, scalingPolicies);
createdGroupList.add(g);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
assertFalse( webhookApi.create("test_webhook", ImmutableMap.<String, Object>of()).isEmpty() );
assertNotNull(g);
assertNotNull(g.getId());
assertEquals(g.getLinks().size(), 1);
assertEquals(g.getLinks().get(0).getHref().toString(),
"https://" + region.toLowerCase() + ".autoscale.api.rackspacecloud.com/v1.0/" + api.getCurrentTenantId().get().getId() + "/groups/" + g.getId() + "/");
assertEquals(g.getLinks().get(0).getRelation(), Link.Relation.SELF);
assertNotNull(g.getScalingPolicies().get(0).getId());
assertEquals(g.getScalingPolicies().get(0).getLinks().size(), 1);
assertEquals(
g.getScalingPolicies().get(0).getLinks().get(0).getHref().toString(),
"https://" + region.toLowerCase() + ".autoscale.api.rackspacecloud.com/v1.0/" + api.getCurrentTenantId().get().getId() + "/groups/" + g.getId() + "/policies/" + g.getScalingPolicies().get(0).getId() + "/");
assertEquals(g.getScalingPolicies().get(0).getLinks().get(0).getRelation(), Link.Relation.SELF);
assertEquals(g.getScalingPolicies().get(0).getCooldown(), 3);
assertEquals(g.getScalingPolicies().get(0).getTarget(), "1");
assertEquals(g.getScalingPolicies().get(0).getTargetType(), ScalingPolicyTargetType.INCREMENTAL);
assertEquals(g.getScalingPolicies().get(0).getType(), ScalingPolicyType.WEBHOOK);
assertEquals(g.getScalingPolicies().get(0).getName(), "scale up by 1");
assertEquals(g.getLaunchConfiguration().getLoadBalancers().size(), 1);
assertEquals(g.getLaunchConfiguration().getLoadBalancers().get(0).getId(), 9099);
assertEquals(g.getLaunchConfiguration().getLoadBalancers().get(0).getPort(), 8080);
assertEquals(g.getLaunchConfiguration().getServerName(), "autoscale_server");
assertNotNull(g.getLaunchConfiguration().getServerImageRef());
assertEquals(g.getLaunchConfiguration().getServerFlavorRef(), "2");
assertEquals(g.getLaunchConfiguration().getServerDiskConfig(), "AUTO");
assertEquals(g.getLaunchConfiguration().getPersonalities().size(), 1);
assertEquals(g.getLaunchConfiguration().getPersonalities().get(0).getPath(), "/root/.csivh");
assertEquals(g.getLaunchConfiguration().getPersonalities().get(0).getContents(),
"VGhpcyBpcyBhIHRlc3QgZmlsZS4=");
assertEquals(g.getLaunchConfiguration().getNetworks().size(), 2);
assertEquals(g.getLaunchConfiguration().getNetworks().get(0), "11111111-1111-1111-1111-111111111111");
assertEquals(g.getLaunchConfiguration().getNetworks().get(1), "00000000-0000-0000-0000-000000000000");
assertEquals(g.getLaunchConfiguration().getServerMetadata().size(), 3);
assertTrue(g.getLaunchConfiguration().getServerMetadata().containsKey("build_config"));
assertTrue(g.getLaunchConfiguration().getServerMetadata().containsValue("core"));
assertEquals(g.getLaunchConfiguration().getType(), LaunchConfigurationType.LAUNCH_SERVER);
assertEquals(g.getGroupConfiguration().getMaxEntities(), 10);
assertEquals(g.getGroupConfiguration().getCooldown(), 3);
assertEquals(g.getGroupConfiguration().getName(), "testscalinggroup198547");
assertEquals(g.getGroupConfiguration().getMinEntities(), 0);
assertEquals(g.getGroupConfiguration().getMetadata().size(), 2);
assertTrue(g.getGroupConfiguration().getMetadata().containsKey("gc_meta_key_2"));
assertTrue(g.getGroupConfiguration().getMetadata().containsValue("gc_meta_value_2"));
}
}
@Test
public void testCreateWebhook() {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
Webhook webhook = webhookApi.create("test1", ImmutableMap.<String, Object>of("notes", "test metadata")).first().get();
assertEquals(webhook.getName(), "test1");
assertEquals(webhook.getMetadata().get("notes"), "test metadata");
}
}
@Test
public void testCreateWebhooks() {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
FluentIterable<Webhook> webhookResponse = webhookApi.create(
ImmutableList.of(
CreateWebhook.builder().name("test5").metadata(null).build(),
CreateWebhook.builder().name("test6").metadata(ImmutableMap.<String, Object>of("notes2", "different test")).build()
));
assertEquals(webhookResponse.get(0).getName(), "test5");
assertNull(webhookResponse.get(0).getMetadata().get("notes"));
assertEquals(webhookResponse.get(1).getName(), "test6");
assertEquals(webhookResponse.get(1).getMetadata().get("notes2"), "different test");
}
}
@Test
public void testUpdateWebhook() {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
String webhookId = webhookApi.list().first().get().getId();
assertTrue( webhookApi.update(webhookId, "updated_name", ImmutableMap.<String, Object>of()) );
Webhook webhook = webhookApi.get(webhookId);
assertEquals(webhook.getName(), "updated_name");
assertTrue( webhook.getMetadata().isEmpty() );
}
}
@Test
public void testGetWebhook() {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi;
boolean foundWebhook = false;
for (ScalingPolicy sp : g.getScalingPolicies()) {
webhookApi = api.getWebhookApi(region, g.getId(), sp.getId());
Webhook webhookResponse = webhookApi.list().first().get();
if (webhookResponse != null) {
Webhook webhookGet = webhookApi.get(webhookResponse.getId());
assertEquals(webhookResponse, webhookGet);
foundWebhook = true;
}
}
assertTrue(foundWebhook, "No webhooks were found, and some were expected");
}
}
@Test
public void testListWebhook() {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
assertFalse( webhookApi.list().isEmpty() );
}
}
@Test
public void testDeleteWebhook() {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
Webhook webhook = webhookApi.create("test1", ImmutableMap.<String, Object>of("notes", "test metadata")).first().get();
assertEquals(webhook.getName(), "test1");
assertEquals(webhook.getMetadata().get("notes"), "test metadata");
assertTrue( webhookApi.delete(webhook.getId()) );
assertNull( webhookApi.get(webhook.getId()) );
}
}
@Test
public void testExecuteWebhook() throws IOException {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
Webhook webhook = webhookApi.create("test_execute", ImmutableMap.<String, Object>of("notes", "test metadata")).first().get();
assertTrue( AutoscaleUtils.execute(webhook.getAnonymousExecutionURI().get()) , " for " + webhook + " in " + region);
}
}
@Test
public void testExecuteWebhookFail() throws IOException, URISyntaxException {
for (String region : api.getConfiguredRegions()) {
Group g = created.get(region).get(0);
WebhookApi webhookApi = api.getWebhookApi(region, g.getId(), g.getScalingPolicies().iterator().next().getId());
Webhook webhook = webhookApi.create("test_execute_fail", ImmutableMap.<String, Object>of("notes", "test metadata")).first().get();
URI uri = new URI(webhook.getAnonymousExecutionURI().get().toString() + "123");
assertFalse( AutoscaleUtils.execute(uri) );
}
}
@Override
@AfterClass(groups = { "integration", "live" })
public void tearDown() {
for (String region : api.getConfiguredRegions()) {
GroupApi groupApi = api.getGroupApi(region);
for (Group group : created.get(region)) {
PolicyApi policyApi = api.getPolicyApi(region, group.getId());
if (policyApi == null)
continue;
for (ScalingPolicy sgr : policyApi.list()) {
if (!policyApi.delete(sgr.getId())) {
System.out.println("Could not delete an autoscale policy after tests!");
}
}
List<CreateScalingPolicy> scalingPolicies = Lists.newArrayList();
CreateScalingPolicy scalingPolicy = CreateScalingPolicy.builder()
.cooldown(2)
.type(ScalingPolicyType.WEBHOOK)
.name("0 machines")
.targetType(ScalingPolicyTargetType.DESIRED_CAPACITY)
.target("0")
.build();
scalingPolicies.add(scalingPolicy);
FluentIterable<ScalingPolicy> scalingPolicyResponse = policyApi.create(scalingPolicies);
String policyId = scalingPolicyResponse.iterator().next().getId();
Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS);
policyApi.execute(policyId);
Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS);
policyApi.delete(policyId);
if (!groupApi.delete(group.getId()))
System.out.println("Could not delete an autoscale group after tests!");
}
}
super.tearDown();
}
}