/* * 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 com.google.common.base.Preconditions.checkNotNull; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import java.net.InetAddress; import java.util.Collections; import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.api.location.MachineLocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; public class JcloudsLocationRegisterMachineLiveTest extends AbstractJcloudsLiveTest { private static final Logger LOG = LoggerFactory.getLogger(JcloudsLocationRegisterMachineLiveTest.class); private static final String EUWEST_IMAGE_ID = AWS_EC2_EUWEST_REGION_NAME+"/"+"ami-ce7b6fba"; @BeforeMethod(alwaysRun=true) @Override public void setUp() throws Exception { super.setUp(); jcloudsLocation = (JcloudsLocation) managementContext.getLocationRegistry().resolve(AWS_EC2_PROVIDER+":"+AWS_EC2_EUWEST_REGION_NAME); } @Test(groups = { "Live", "Live-sanity" }) public void testRegisterWithIncorrectId() throws Exception { try { jcloudsLocation.registerMachine(ImmutableMap.of("id", "incorrectid", "hostname", "myhostname", "user", "myusername")); } catch (IllegalArgumentException e) { if (e.getMessage().contains("node not found")) { // success } else { throw e; } } } @Test(groups = { "Live" }) public void testRegisterVm() throws Exception { // FIXME How to create a machine - go directly through jclouds instead? // Going through LocationRegistry.resolve, loc and loc2 might be same instance // Create a VM through jclouds JcloudsSshMachineLocation machine = obtainMachine(ImmutableMap.of("imageId", EUWEST_IMAGE_ID)); assertTrue(machine.isSshable()); LOG.info("obtained "+machine); String id = checkNotNull(machine.getJcloudsId(), "id"); InetAddress address = checkNotNull(machine.getAddress(), "address"); String hostname = checkNotNull(address.getHostName(), "hostname"); String user = checkNotNull(machine.getUser(), "user"); // Create a new jclouds location, and re-bind the existing VM to that JcloudsLocation loc2 = (JcloudsLocation) managementContext.getLocationRegistry().resolve(AWS_EC2_PROVIDER+":"+AWS_EC2_EUWEST_REGION_NAME); MachineLocation machineLocation = loc2.registerMachine(ImmutableMap.of("id", id, "hostname", hostname, "user", user)); assertTrue(machineLocation instanceof SshMachineLocation); SshMachineLocation machine2 = (SshMachineLocation) machineLocation; LOG.info("Registered " + machine2); // Confirm the re-bound machine is wired up assertTrue(machine2.isSshable()); assertEquals(ImmutableSet.copyOf(loc2.getChildren()), ImmutableSet.of(machine2)); // Confirm can release the re-bound machine via the new jclouds location loc2.release(machine2); assertFalse(machine.isSshable()); assertEquals(ImmutableSet.copyOf(loc2.getChildren()), Collections.emptySet()); } @Test(groups = { "Live" }) public void testRegisterVmDeprecated() throws Exception { // FIXME See comments in testRegisterVm // Create a VM through jclouds JcloudsSshMachineLocation machine = obtainMachine(ImmutableMap.of("imageId", EUWEST_IMAGE_ID)); assertTrue(machine.isSshable()); String id = machine.getJcloudsId(); InetAddress address = machine.getAddress(); String hostname = address.getHostName(); String username = machine.getUser(); // Create a new jclouds location, and re-bind the existing VM to that JcloudsLocation loc2 = (JcloudsLocation) managementContext.getLocationRegistry().resolve(AWS_EC2_PROVIDER+":"+AWS_EC2_EUWEST_REGION_NAME); // pass deprecated userName MachineLocation machineLocation = loc2.registerMachine(ImmutableMap.of("id", id, "hostname", hostname, "userName", username)); assertTrue(machineLocation instanceof SshMachineLocation); SshMachineLocation machine2 = (SshMachineLocation) machineLocation; // Confirm the re-bound machine is wired up assertTrue(machine2.isSshable()); assertEquals(ImmutableSet.copyOf(loc2.getChildren()), ImmutableSet.of(machine2)); // Confirm can release the re-bound machine via the new jclouds location loc2.release(machine2); assertFalse(machine.isSshable()); assertEquals(ImmutableSet.copyOf(loc2.getChildren()), Collections.emptySet()); } // Useful for debugging; accesss a hard-coded existing instance so don't need to wait for provisioning a new one @Test(enabled=false, groups = { "Live" }) public void testRegisterVmToHardcodedInstance() throws Exception { String id = "eu-west-1/i-5504f21d"; InetAddress address = InetAddress.getByName("ec2-176-34-93-58.eu-west-1.compute.amazonaws.com"); String hostname = address.getHostName(); String username = "root"; MachineLocation machineLocation = jcloudsLocation.registerMachine(ImmutableMap.of("id", id, "hostname", hostname, "userName", username)); assertTrue(machineLocation instanceof SshMachineLocation); SshMachineLocation machine = (SshMachineLocation) machineLocation; // Confirm the re-bound machine is wired up assertTrue(machine.isSshable()); assertEquals(ImmutableSet.copyOf(jcloudsLocation.getChildren()), ImmutableSet.of(machine)); } }