/* * 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.entity.machine; import static org.testng.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.util.List; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.location.MachineProvisioningLocation; import org.apache.brooklyn.core.entity.BrooklynConfigKeys; import org.apache.brooklyn.core.internal.BrooklynProperties; import org.apache.brooklyn.core.location.Machines; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport; import org.apache.brooklyn.entity.AbstractSoftlayerLiveTest; import org.apache.brooklyn.location.jclouds.JcloudsLocation; import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.util.core.config.ConfigBag; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.google.common.base.CaseFormat; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; public class SetHostnameCustomizerLiveTest extends BrooklynAppLiveTestSupport { public static final String PROVIDER = AbstractSoftlayerLiveTest.PROVIDER; public static final String REGION = "ams01"; public static final String PROVIDER_IMAGE_ID = "CENTOS_6_64"; public static final String LOCATION_SPEC = PROVIDER + ":" + REGION; public static final int MAX_TAG_LENGTH = AbstractSoftlayerLiveTest.MAX_TAG_LENGTH; public static final int MAX_VM_NAME_LENGTH = AbstractSoftlayerLiveTest.MAX_VM_NAME_LENGTH; protected BrooklynProperties brooklynProperties; protected MachineProvisioningLocation<SshMachineLocation> loc; @BeforeMethod(alwaysRun=true) public void setUp() throws Exception { super.setUp(); List<String> propsToRemove = ImmutableList.of("imageId", "imageDescriptionRegex", "imageNameRegex", "inboundPorts", "hardwareId", "minRam"); // Don't let any defaults from brooklyn.properties (except credentials) interfere with test brooklynProperties = BrooklynProperties.Factory.newDefault(); for (String propToRemove : propsToRemove) { for (String propVariant : ImmutableList.of(propToRemove, CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, propToRemove))) { brooklynProperties.remove("brooklyn.locations.jclouds."+PROVIDER+"."+propVariant); brooklynProperties.remove("brooklyn.locations."+propVariant); brooklynProperties.remove("brooklyn.jclouds."+PROVIDER+"."+propVariant); brooklynProperties.remove("brooklyn.jclouds."+propVariant); } } // Also removes scriptHeader (e.g. if doing `. ~/.bashrc` and `. ~/.profile`, then that can cause "stdin: is not a tty") brooklynProperties.remove("brooklyn.ssh.config.scriptHeader"); mgmt = new LocalManagementContext(brooklynProperties); super.setUp(); loc = (MachineProvisioningLocation<SshMachineLocation>) mgmt.getLocationRegistry().resolve(LOCATION_SPEC); } @Test(groups = {"Live"}) public void testSetFixedHostname() throws Exception { SetHostnameCustomizer customizer = new SetHostnameCustomizer(ConfigBag.newInstance() .configure(SetHostnameCustomizer.FIXED_HOSTNAME, "myhostname")); MachineEntity entity = app.createAndManageChild(EntitySpec.create(MachineEntity.class) .configure(BrooklynConfigKeys.SKIP_ON_BOX_BASE_DIR_RESOLUTION, true) .configure(MachineEntity.PROVISIONING_PROPERTIES.subKey(JcloudsLocation.MACHINE_LOCATION_CUSTOMIZERS.getName()), ImmutableSet.of(customizer)) .configure(MachineEntity.PROVISIONING_PROPERTIES.subKey(JcloudsLocation.IMAGE_ID.getName()), PROVIDER_IMAGE_ID)); app.start(ImmutableList.of(loc)); SshMachineLocation machine = Machines.findUniqueMachineLocation(entity.getLocations(), SshMachineLocation.class).get(); assertEquals(getHostname(machine), "myhostname"); } @Test(groups = {"Live"}) public void testSetAutogeneratedHostname() throws Exception { SetHostnameCustomizer customizer = new SetHostnameCustomizer(ConfigBag.newInstance()); MachineEntity entity = app.createAndManageChild(EntitySpec.create(MachineEntity.class) .configure(BrooklynConfigKeys.SKIP_ON_BOX_BASE_DIR_RESOLUTION, true) .configure(MachineEntity.PROVISIONING_PROPERTIES.subKey(JcloudsLocation.MACHINE_LOCATION_CUSTOMIZERS.getName()), ImmutableSet.of(customizer)) .configure(MachineEntity.PROVISIONING_PROPERTIES.subKey(JcloudsLocation.IMAGE_ID.getName()), "CENTOS_6_64")); app.start(ImmutableList.of(loc)); SshMachineLocation machine = Machines.findUniqueMachineLocation(entity.getLocations(), SshMachineLocation.class).get(); String ip; if (machine.getPrivateAddresses().isEmpty()) { ip = Iterables.get(machine.getPublicAddresses(), 0); } else { ip = Iterables.get(machine.getPrivateAddresses(), 0); } String expected = "ip-"+(ip.replace(".", "-")+"-"+machine.getId()); assertEquals(getHostname(machine), expected); } protected String getHostname(SshMachineLocation machine) { ByteArrayOutputStream outstream = new ByteArrayOutputStream(); ByteArrayOutputStream errstream = new ByteArrayOutputStream(); int result = machine.execScript(ImmutableMap.of("out", outstream, "err", errstream), "getHostname", ImmutableList.of("echo hostname=`hostname`")); assertEquals(result, 0); String out = new String(outstream.toByteArray()); String err = new String(errstream.toByteArray()); for (String line : out.split("\n")) { if (line.contains("hostname=") && !line.contains("`hostname`")) { return line.substring(line.indexOf("hostname=") + "hostname=".length()).trim(); } } throw new IllegalStateException(String.format("No hostname found for %s (got %s; %s)", machine, out, err)); } }