/* * 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; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import java.net.InetAddress; import java.util.Map; import java.util.Set; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.location.byon.FixedListMachineProvisioningLocation; import org.apache.brooklyn.util.collections.MutableMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; public class JcloudsByonLocationResolverAwsLiveTest extends AbstractJcloudsLiveTest { private static final String AWS_REGION = "eu-west-1"; private static final String AWS_LOCATION_SPEC = "jclouds:aws-ec2:"+AWS_REGION; private String awsVmUser; private String awsVmInstanceId; private String awsVmIp; private String awsVmHostname; private LocalManagementContext classManagementContext; private JcloudsLocation classEc2Loc; private JcloudsSshMachineLocation classEc2Vm; @BeforeClass(groups="Live") public void setUpClass() throws Exception { classManagementContext = newManagementContext(); classEc2Loc = (JcloudsLocation) classManagementContext.getLocationRegistry().resolve(AWS_LOCATION_SPEC); classEc2Vm = (JcloudsSshMachineLocation)classEc2Loc.obtain(MutableMap.<String,Object>builder() .put("hardwareId", AWS_EC2_SMALL_HARDWARE_ID) .put("inboundPorts", ImmutableList.of(22)) .build()); awsVmUser = classEc2Vm.getUser(); awsVmInstanceId = classEc2Vm.getNode().getProviderId(); // id without region (e.g. "i-6ff96d2f" instead of "eu-west-1/i-6ff96d2f") awsVmIp = classEc2Vm.getAddress().getHostAddress(); awsVmHostname = classEc2Vm.getAddress().getHostName(); } @AfterClass(alwaysRun=true) public void tearDownClass() throws Exception { try { if (classEc2Vm != null) { classEc2Loc.release(classEc2Vm); } } finally { if (classManagementContext != null) classManagementContext.terminate(); } } // TODO Requires that a VM already exists; could create that VM first to make test more robust @Test(groups={"Live"}) public void testResolvesJcloudsByonAws() throws Exception { String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\""+AWS_REGION+"\",user=\""+awsVmUser+"\",hosts=\""+awsVmInstanceId+"\",anotherprop=myval)"; FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve(spec); Set<JcloudsSshMachineLocation> machines = loc.getAllMachines(); JcloudsSshMachineLocation machine = Iterables.getOnlyElement(machines); assertEquals(machine.getParent().getProvider(), "aws-ec2"); assertEquals(machine.getAddress().getHostAddress(), awsVmIp); assertEquals(machine.getAddress().getHostName(), awsVmHostname); assertEquals(machine.getUser(), awsVmUser); assertEquals(machine.config().getBag().getStringKey("anotherprop"), "myval"); assertTrue(machine.isSshable()); } @Test(groups={"Live"}) public void testResolvesNamedJcloudsByon() throws Exception { String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\""+AWS_REGION+"\",user=\""+awsVmUser+"\",hosts=\""+awsVmInstanceId+"\")"; brooklynProperties.put("brooklyn.location.named.mynamed", spec); FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve("named:mynamed"); assertEquals(loc.obtain().getAddress(), InetAddress.getByName(awsVmHostname)); } @Test(groups={"Live"}) public void testJcloudsPropertiesPrecedence() throws Exception { String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\""+AWS_REGION+"\",user=\""+awsVmUser+"\",hosts=\""+awsVmInstanceId+"\")"; brooklynProperties.put("brooklyn.location.named.mynamed", spec); // prefer those in spec string over everything else brooklynProperties.put("brooklyn.location.named.mynamed.user", "user-inNamed"); brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.user", "user-inProviderSpecific"); brooklynProperties.put("brooklyn.jclouds.aws-ec2.user", "user-inProviderSpecificDeprecated"); brooklynProperties.put("brooklyn.location.jclouds.user", "user-inJcloudsGeneric"); brooklynProperties.put("brooklyn.jclouds.user", "user-inJcloudsGenericDeprecated"); brooklynProperties.put("brooklyn.location.user", "user-inLocationGeneric"); // prefer those in "named" over everything else (except spec string itself) brooklynProperties.put("brooklyn.location.named.mynamed.privateKeyFile", "privateKeyFile-inNamed"); brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.privateKeyFile", "privateKeyFile-inProviderSpecific"); brooklynProperties.put("brooklyn.jclouds.aws-ec2.privateKeyFile", "privateKeyFile-inProviderSpecificDeprecated"); brooklynProperties.put("brooklyn.location.jclouds.privateKeyFile", "privateKeyFile-inJcloudsGeneric"); brooklynProperties.put("brooklyn.jclouds.privateKeyFile", "privateKeyFile-inJcloudsGenericDeprecated"); brooklynProperties.put("brooklyn.location.privateKeyFile", "privateKeyFile-inLocationGeneric"); // prefer those in provider-specific over generic brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.publicKeyFile", "publicKeyFile-inProviderSpecific"); brooklynProperties.put("brooklyn.jclouds.aws-ec2.publicKeyFile", "publicKeyFile-inProviderSpecificDeprecated"); brooklynProperties.put("brooklyn.location.jclouds.publicKeyFile", "publicKeyFile-inJcloudsGeneric"); brooklynProperties.put("brooklyn.jclouds.publicKeyFile", "publicKeyFile-inJcloudsGenericDeprecated"); brooklynProperties.put("brooklyn.location.publicKeyFile", "publicKeyFile-inLocationGeneric"); // prefer those in provider-specific (deprecated scope) over generic brooklynProperties.put("brooklyn.jclouds.aws-ec2.securityGroups", "securityGroups-inProviderSpecificDeprecated"); brooklynProperties.put("brooklyn.location.jclouds.securityGroups", "securityGroups-inJcloudsGeneric"); brooklynProperties.put("brooklyn.jclouds.securityGroups", "securityGroups-inJcloudsGenericDeprecated"); brooklynProperties.put("brooklyn.location.securityGroups", "securityGroups-inLocationGeneric"); // prefer those in jclouds-generic over location-generic brooklynProperties.put("brooklyn.location.jclouds.loginUser", "loginUser-inJcloudsGeneric"); brooklynProperties.put("brooklyn.jclouds.loginUser", "loginUser-inJcloudsGenericDeprecated"); brooklynProperties.put("brooklyn.location.loginUser", "loginUser-inLocationGeneric"); // prefer those in jclouds-generic (deprecated) over location-generic brooklynProperties.put("brooklyn.jclouds.imageId", "imageId-inJcloudsGenericDeprecated"); brooklynProperties.put("brooklyn.location.imageId", "imageId-inLocationGeneric"); // prefer location-generic if nothing else brooklynProperties.put("brooklyn.location.keyPair", "keyPair-inLocationGeneric"); // prefer deprecated properties in "named" over those less specific brooklynProperties.put("brooklyn.location.named.mynamed.private-key-data", "privateKeyData-inNamed"); brooklynProperties.put("brooklyn.jclouds.aws-ec2.privateKeyData", "privateKeyData-inProviderSpecific"); brooklynProperties.put("brooklyn.jclouds.privateKeyData", "privateKeyData-inJcloudsGeneric"); // prefer "named" over everything else: confirm deprecated don't get transformed to overwrite it accidentally brooklynProperties.put("brooklyn.location.named.mynamed.privateKeyPassphrase", "privateKeyPassphrase-inNamed"); brooklynProperties.put("brooklyn.jclouds.aws-ec2.private-key-passphrase", "privateKeyPassphrase-inProviderSpecific"); brooklynProperties.put("brooklyn.jclouds.private-key-passphrase", "privateKeyPassphrase-inJcloudsGeneric"); Map<String, Object> conf = resolve("named:mynamed").obtain().config().getBag().getAllConfig(); assertEquals(conf.get("user"), awsVmUser); assertEquals(conf.get("privateKeyFile"), "privateKeyFile-inNamed"); assertEquals(conf.get("publicKeyFile"), "publicKeyFile-inProviderSpecific"); assertEquals(conf.get("securityGroups"), "securityGroups-inProviderSpecificDeprecated"); assertEquals(conf.get("loginUser"), "loginUser-inJcloudsGeneric"); assertEquals(conf.get("imageId"), "imageId-inJcloudsGenericDeprecated"); assertEquals(conf.get("keyPair"), "keyPair-inLocationGeneric"); assertEquals(conf.get("privateKeyData"), "privateKeyData-inNamed"); assertEquals(conf.get("privateKeyPassphrase"), "privateKeyPassphrase-inNamed"); } @SuppressWarnings("unchecked") private FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> resolve(String spec) { return (FixedListMachineProvisioningLocation<JcloudsSshMachineLocation>) managementContext.getLocationRegistry().resolve(spec); } }