/*
* 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.location.jclouds.zone;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.List;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
import org.apache.brooklyn.location.jclouds.AbstractJcloudsLiveTest;
import org.apache.brooklyn.location.jclouds.JcloudsLocation;
import org.jclouds.domain.LocationScope;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.apache.brooklyn.location.jclouds.JcloudsSshMachineLocation;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
public class AwsAvailabilityZoneExtensionTest {
public static final String PROVIDER = AbstractJcloudsLiveTest.AWS_EC2_PROVIDER;
public static final String REGION_NAME = AbstractJcloudsLiveTest.AWS_EC2_USEAST_REGION_NAME;
public static final String LOCATION_SPEC = PROVIDER + (REGION_NAME == null ? "" : ":" + REGION_NAME);
public static final String SMALL_HARDWARE_ID = AbstractJcloudsLiveTest.AWS_EC2_SMALL_HARDWARE_ID;
public static final String US_EAST_IMAGE_ID = "us-east-1/ami-7d7bfc14"; // centos 6.3
private LocalManagementContext mgmt;
private JcloudsLocation loc;
private AwsAvailabilityZoneExtension zoneExtension;
@BeforeMethod(alwaysRun=true)
public void setUp() throws Exception {
mgmt = new LocalManagementContext();
loc = (JcloudsLocation) mgmt.getLocationRegistry().resolve(LOCATION_SPEC);
zoneExtension = new AwsAvailabilityZoneExtension(mgmt, loc);
}
@AfterMethod(alwaysRun=true)
public void tearDown() throws Exception {
if (mgmt != null) Entities.destroyAll(mgmt);
}
@Test(groups={"Live", "Sanity"})
public void testFindsZones() throws Exception {
List<Location> subLocations = zoneExtension.getSubLocations(Integer.MAX_VALUE);
List<String> zoneNames = getRegionsOf(subLocations);
assertTrue(subLocations.size() >= 3, "zones="+subLocations);
assertTrue(zoneNames.containsAll(ImmutableList.of(REGION_NAME+"a", REGION_NAME+"b", REGION_NAME+"c")), "zoneNames="+zoneNames);
}
@Test(groups={"Live", "Sanity"})
public void testFiltersZones() throws Exception {
List<Location> subLocations = zoneExtension.getSubLocationsByName(Predicates.containsPattern(REGION_NAME+"[ab]"), Integer.MAX_VALUE);
List<String> zoneNames = getRegionsOf(subLocations);
assertTrue(subLocations.size() == 2, "zones="+subLocations);
assertTrue(zoneNames.containsAll(ImmutableList.of(REGION_NAME+"a", REGION_NAME+"b")), "zoneNames="+zoneNames);
}
// TODO choosing a specific availability zone looks dangerous!
// TODO report this on brooklyn issues
// org.jclouds.aws.AWSResponseException: request POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1 failed with code 400,
// error: AWSError{requestId='5d360cc7-9c43-4683-8093-de3b081de87d', requestToken='null', code='Unsupported',
// message='The requested Availability Zone is currently constrained and we are no longer accepting new customer requests for t1/m1/c1/m2/m3 instance types.
// Please retry your request by not specifying an Availability Zone or choosing us-east-1e, us-east-1b, us-east-1c.', context='{Response=, Errors=}'}
@Test(groups={"Live"})
public void testSubLocationIsUsable() throws Exception {
String zoneName = REGION_NAME+"b";
List<Location> subLocations = zoneExtension.getSubLocationsByName(Predicates.equalTo(zoneName), Integer.MAX_VALUE);
JcloudsLocation subLocation = (JcloudsLocation) Iterables.getOnlyElement(subLocations);
JcloudsSshMachineLocation machine = null;
try {
machine = (JcloudsSshMachineLocation)subLocation.obtain(ImmutableMap.builder()
.put(JcloudsLocation.IMAGE_ID, US_EAST_IMAGE_ID)
.put(JcloudsLocation.HARDWARE_ID, SMALL_HARDWARE_ID)
.put(JcloudsLocation.INBOUND_PORTS, ImmutableList.of(22))
.build());
org.jclouds.domain.Location machineLoc = machine.getNode().getLocation();
assertEquals(machineLoc.getScope(), LocationScope.ZONE, "machineLoc="+machineLoc);
assertEquals(machineLoc.getId(), zoneName, "machineLoc="+machineLoc);
} finally {
if (machine != null) {
subLocation.release(machine);
}
}
}
protected List<String> getRegionsOf(List<Location> locs) {
List<String> result = Lists.newArrayList();
for (Location loc : locs) {
result.add(((JcloudsLocation)loc).getRegion());
}
return result;
}
}