/* * 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 java.util.Map; import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.core.location.Locations; import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.os.Os; import org.apache.brooklyn.util.ssh.BashCommands; import org.apache.brooklyn.util.stream.Streams; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; /** * Extra-special tests for deploying SUSE VMs, because we've had so many problems. For example: * <ul> * <li>{@code groupadd -f}: You are using an undocumented option (-f); and exits with 9 * <li>path does not by default contain groupadd etc (see {@link BashCommands#sbinPath()} * </ul> */ public class JcloudsSuseLiveTest extends AbstractJcloudsLiveTest { public static final String AWS_EC2_REGION_NAME = AWS_EC2_USEAST_REGION_NAME; public static final String AWS_EC2_LOCATION_SPEC = "jclouds:" + AWS_EC2_PROVIDER + (AWS_EC2_REGION_NAME == null ? "" : ":" + AWS_EC2_REGION_NAME); public static final String AWS_IMAGE_ID = "us-east-1/ami-8dd105e6"; // TODO Also requires https://github.com/jclouds/jclouds/pull/827 @Test(groups = {"Live", "WIP"}) protected void testSuseUsingJcloudsSshInit() throws Exception { jcloudsLocation = (JcloudsLocation) managementContext.getLocationRegistry().resolve(AWS_EC2_LOCATION_SPEC); JcloudsSshMachineLocation machine = createEc2Machine(ImmutableMap.<String,Object>of( JcloudsLocation.USE_JCLOUDS_SSH_INIT.getName(), true, JcloudsLocation.USER.getName(), "myname")); assertSshable(machine); assertSshable(ImmutableMap.builder() .put("address", machine.getAddress()) .put("user", "myname") .put(SshMachineLocation.PRIVATE_KEY_FILE, Os.tidyPath("~/.ssh/id_rsa")) .build()); } // TODO Also requires https://github.com/jclouds/jclouds/pull/??? (see BROOKLYN-188, for checking if group exists) @Test(groups = {"Live", "WIP"}) protected void testSuseSkippingJcloudsSshInit() throws Exception { jcloudsLocation = (JcloudsLocation) managementContext.getLocationRegistry().resolve(AWS_EC2_LOCATION_SPEC); JcloudsSshMachineLocation machine = createEc2Machine(ImmutableMap.<String,Object>of( JcloudsLocation.USE_JCLOUDS_SSH_INIT.getName(), false, JcloudsLocation.USER.getName(), "myname")); assertSshable(machine); assertSshable(ImmutableMap.builder() .put("address", machine.getAddress()) .put("user", "myname") .put(SshMachineLocation.PRIVATE_KEY_FILE, Os.tidyPath("~/.ssh/id_rsa")) .build()); } private JcloudsSshMachineLocation createEc2Machine(Map<String,? extends Object> conf) throws Exception { return obtainMachine(MutableMap.<String,Object>builder() .putAll(conf) .putIfAbsent("imageId", AWS_IMAGE_ID) .putIfAbsent("loginUser", "ec2-user") .putIfAbsent("hardwareId", AWS_EC2_SMALL_HARDWARE_ID) .putIfAbsent("inboundPorts", ImmutableList.of(22)) .build()); } protected void assertSshable(Map<?,?> machineConfig) { SshMachineLocation machineWithThatConfig = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) .configure(machineConfig)); try { assertSshable(machineWithThatConfig); } finally { Streams.closeQuietly(machineWithThatConfig); Locations.unmanage(machineWithThatConfig); } } }