/*
* 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.camp.brooklyn;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import java.io.StringReader;
import java.util.Map;
import java.util.Set;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.location.MachineLocation;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.location.LocationPredicates;
import org.apache.brooklyn.core.location.Machines;
import org.apache.brooklyn.core.location.access.PortForwardManager;
import org.apache.brooklyn.core.location.cloud.CloudLocationConfig;
import org.apache.brooklyn.entity.software.base.DoNothingSoftwareProcess;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
import com.google.api.client.repackaged.com.google.common.base.Joiner;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.net.HostAndPort;
import org.apache.brooklyn.location.byon.FixedListMachineProvisioningLocation;
import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.net.UserAndHostAndPort;
public class ByonLocationsYamlTest extends AbstractYamlTest {
private static final Logger log = LoggerFactory.getLogger(ByonLocationsYamlTest.class);
@Test
@SuppressWarnings("unchecked")
public void testByonSpec() throws Exception {
String yaml = Joiner.on("\n").join(
"location: byon(user=myuser,mykey=myval,hosts=\"1.1.1.1\")",
"services:",
"- serviceType: org.apache.brooklyn.entity.stock.BasicApplication");
Entity app = createStartWaitAndLogApplication(new StringReader(yaml));
FixedListMachineProvisioningLocation<SshMachineLocation> loc = (FixedListMachineProvisioningLocation<SshMachineLocation>) Iterables.get(app.getLocations(), 0);
Set<SshMachineLocation> machines = loc.getAvailable();
SshMachineLocation machine = Iterables.getOnlyElement(machines);
assertMachine(machine, UserAndHostAndPort.fromParts("myuser", "1.1.1.1", 22), ImmutableMap.of("mykey", "myval"));
}
@Test
@SuppressWarnings("unchecked")
public void testByonMachine() throws Exception {
String yaml = Joiner.on("\n").join(
"location:",
" byon:",
" hosts:",
" - ssh: 1.1.1.1:8022",
" privateAddresses: [10.0.0.1]",
" password: mypassword",
" user: myuser",
" mykey: myval",
"services:",
"- serviceType: org.apache.brooklyn.entity.stock.BasicApplication");
Entity app = createStartWaitAndLogApplication(new StringReader(yaml));
FixedListMachineProvisioningLocation<SshMachineLocation> loc = (FixedListMachineProvisioningLocation<SshMachineLocation>) Iterables.get(app.getLocations(), 0);
Set<SshMachineLocation> machines = loc.getAvailable();
SshMachineLocation machine = Iterables.getOnlyElement(machines);
assertMachine(machine, UserAndHostAndPort.fromParts("myuser", "1.1.1.1", 8022), ImmutableMap.of(
SshMachineLocation.PASSWORD.getName(), "mypassword",
"mykey", "myval"));
assertEquals(machine.getPrivateAddresses(), ImmutableSet.of("10.0.0.1"));
}
@Test
@SuppressWarnings("unchecked")
public void testByonWindowsMachine() throws Exception {
String yaml = Joiner.on("\n").join(
"location:",
" byon:",
" hosts:",
" - winrm: 1.1.1.1:8985",
" privateAddresses: [10.0.0.1]",
" password: mypassword",
" user: myuser",
" mykey: myval",
" osFamily: windows",
"services:",
"- serviceType: org.apache.brooklyn.entity.stock.BasicApplication");
Entity app = createStartWaitAndLogApplication(new StringReader(yaml));
FixedListMachineProvisioningLocation<WinRmMachineLocation> loc = (FixedListMachineProvisioningLocation<WinRmMachineLocation>) Iterables.get(app.getLocations(), 0);
Set<WinRmMachineLocation> machines = loc.getAvailable();
WinRmMachineLocation machine = Iterables.getOnlyElement(machines);
assertMachine(machine, UserAndHostAndPort.fromParts("myuser", "1.1.1.1", 8985), ImmutableMap.of(
SshMachineLocation.PASSWORD.getName(), "mypassword",
"mykey", "myval"));
assertEquals(machine.getPrivateAddresses(), ImmutableSet.of("10.0.0.1"));
}
@Test
@SuppressWarnings("unchecked")
public void testByonMultiMachine() throws Exception {
String yaml = Joiner.on("\n").join(
"location:",
" byon:",
" hosts:",
" - ssh: 1.1.1.1:8022",
" privateAddresses: [10.0.0.1]",
" password: mypassword",
" user: myuser",
" mykey: myval1",
" - ssh: 1.1.1.2:8022",
" privateAddresses: [10.0.0.2]",
" password: mypassword",
" user: myuser",
" mykey: myval2",
" - winrm: 1.1.1.3:8985",
" privateAddresses: [10.0.0.3]",
" password: mypassword",
" user: myuser",
" mykey: myval3",
" osFamily: windows",
"services:",
"- serviceType: org.apache.brooklyn.entity.stock.BasicApplication");
Entity app = createStartWaitAndLogApplication(new StringReader(yaml));
FixedListMachineProvisioningLocation<MachineLocation> loc = (FixedListMachineProvisioningLocation<MachineLocation>) Iterables.get(app.getLocations(), 0);
Set<MachineLocation> machines = loc.getAvailable();
assertEquals(machines.size(), 3, "machines="+machines);
SshMachineLocation machine1 = (SshMachineLocation) Iterables.find(machines, LocationPredicates.configEqualTo(ConfigKeys.newStringConfigKey("mykey"), "myval1"));
SshMachineLocation machine2 = (SshMachineLocation) Iterables.find(machines, LocationPredicates.configEqualTo(ConfigKeys.newStringConfigKey("mykey"), "myval2"));
WinRmMachineLocation machine3 = (WinRmMachineLocation) Iterables.find(machines, Predicates.instanceOf(WinRmMachineLocation.class));
assertMachine(machine1, UserAndHostAndPort.fromParts("myuser", "1.1.1.1", 8022), ImmutableMap.of(
SshMachineLocation.PASSWORD.getName(), "mypassword",
"mykey", "myval1"));
assertEquals(machine1.getPrivateAddresses(), ImmutableSet.of("10.0.0.1"));
assertMachine(machine2, UserAndHostAndPort.fromParts("myuser", "1.1.1.2", 8022), ImmutableMap.of(
SshMachineLocation.PASSWORD.getName(), "mypassword",
"mykey", "myval2"));
assertEquals(machine2.getPrivateAddresses(), ImmutableSet.of("10.0.0.2"));
assertMachine(machine3, UserAndHostAndPort.fromParts("myuser", "1.1.1.3", 8985), ImmutableMap.of(
SshMachineLocation.PASSWORD.getName(), "mypassword",
"mykey", "myval3"));
assertEquals(machine3.getPrivateAddresses(), ImmutableSet.of("10.0.0.3"));
}
@Test
@SuppressWarnings("unchecked")
public void testByonPortMapping() throws Exception {
String yaml = Joiner.on("\n").join(
"location:",
" byon:",
" hosts:",
" - ssh: 1.1.1.1:22",
" privateAddresses: [10.0.0.1]",
" tcpPortMappings: {22: \"83.222.229.1:12001\", 8080: \"83.222.229.1:12002\"}",
" password: mypassword",
" user: myuser",
" mykey: myval1",
" - winrm: 1.1.1.2:8985",
" privateAddresses: [10.0.0.2]",
" tcpPortMappings: {8985: \"83.222.229.2:12003\", 8080: \"83.222.229.2:12004\"}",
" password: mypassword",
" user: myuser",
" mykey: myval2",
" osFamily: windows",
"services:",
"- serviceType: org.apache.brooklyn.entity.stock.BasicApplication");
Entity app = createStartWaitAndLogApplication(new StringReader(yaml));
FixedListMachineProvisioningLocation<MachineLocation> loc = (FixedListMachineProvisioningLocation<MachineLocation>) Iterables.get(app.getLocations(), 0);
PortForwardManager pfm = (PortForwardManager) mgmt().getLocationRegistry().resolve("portForwardManager(scope=global)");
Set<MachineLocation> machines = loc.getAvailable();
assertEquals(machines.size(), 2, "machines="+machines);
SshMachineLocation machine1 = (SshMachineLocation) Iterables.find(machines, LocationPredicates.configEqualTo(ConfigKeys.newStringConfigKey("mykey"), "myval1"));
WinRmMachineLocation machine2 = (WinRmMachineLocation) Iterables.find(machines, Predicates.instanceOf(WinRmMachineLocation.class));
assertMachine(machine1, UserAndHostAndPort.fromParts("myuser", "83.222.229.1", 12001), ImmutableMap.of(
SshMachineLocation.PASSWORD.getName(), "mypassword",
"mykey", "myval1"));
assertEquals(machine1.getPrivateAddresses(), ImmutableSet.of("10.0.0.1"));
assertEquals(pfm.lookup(machine1, 22), HostAndPort.fromParts("83.222.229.1", 12001));
assertEquals(pfm.lookup(machine1, 8080), HostAndPort.fromParts("83.222.229.1", 12002));
assertNull(pfm.lookup(machine1, 12345));
assertMachine(machine2, UserAndHostAndPort.fromParts("myuser", "83.222.229.2", 12003), ImmutableMap.of(
SshMachineLocation.PASSWORD.getName(), "mypassword",
"mykey", "myval2"));
assertEquals(machine2.getPrivateAddresses(), ImmutableSet.of("10.0.0.2"));
assertEquals(pfm.lookup(machine2, 8985), HostAndPort.fromParts("83.222.229.2", 12003));
assertEquals(pfm.lookup(machine2, 8080), HostAndPort.fromParts("83.222.229.2", 12004));
assertNull(pfm.lookup(machine2, 12345));
}
@Test
@SuppressWarnings("unchecked")
public void testPassesInboundPortsToMachineAndRemovesOnceMachineReleased() throws Exception {
String yaml = Joiner.on("\n").join(
"location:",
" byon:",
" hosts:",
" - ssh: 1.1.1.1:22",
" password: mypassword",
" user: myuser",
"services:",
"- type: org.apache.brooklyn.entity.software.base.DoNothingSoftwareProcess",
" brooklyn.config:",
" requiredOpenLoginPorts: [22, 1024]");
Entity app = createStartWaitAndLogApplication(new StringReader(yaml));
DoNothingSoftwareProcess entity = (DoNothingSoftwareProcess) Iterables.find(Entities.descendants(app), Predicates.instanceOf(DoNothingSoftwareProcess.class));
FixedListMachineProvisioningLocation<MachineLocation> loc = (FixedListMachineProvisioningLocation<MachineLocation>) Iterables.get(app.getLocations(), 0);
// Machine should have been given the inbound-ports
SshMachineLocation machine = Machines.findUniqueMachineLocation(entity.getLocations(), SshMachineLocation.class).get();
Asserts.assertEqualsIgnoringOrder((Iterable<?>)machine.config().get(CloudLocationConfig.INBOUND_PORTS), ImmutableList.of(22, 1024));
// Stop the entity; should release the machine
entity.stop();
MachineLocation availableMachine = Iterables.getOnlyElement(loc.getAvailable());
assertEquals(availableMachine, machine);
assertNull(machine.config().get(CloudLocationConfig.INBOUND_PORTS));
}
private void assertMachine(SshMachineLocation machine, UserAndHostAndPort conn, Map<String, ?> config) {
assertEquals(machine.getAddress().getHostAddress(), conn.getHostAndPort().getHostText());
assertEquals(machine.getPort(), conn.getHostAndPort().getPort());
assertEquals(machine.getUser(), conn.getUser());
for (Map.Entry<String, ?> entry : config.entrySet()) {
Object actualVal = machine.getConfig(ConfigKeys.newConfigKey(Object.class, entry.getKey()));
assertEquals(actualVal, entry.getValue());
}
}
private void assertMachine(WinRmMachineLocation machine, UserAndHostAndPort conn, Map<String, ?> config) {
assertEquals(machine.getAddress().getHostAddress(), conn.getHostAndPort().getHostText());
assertEquals(machine.getConfig(WinRmMachineLocation.WINRM_PORT), (Integer) conn.getHostAndPort().getPort());
assertEquals(machine.getUser(), conn.getUser());
for (Map.Entry<String, ?> entry : config.entrySet()) {
Object actualVal = machine.getConfig(ConfigKeys.newConfigKey(Object.class, entry.getKey()));
assertEquals(actualVal, entry.getValue());
}
}
@Override
protected Logger getLogger() {
return log;
}
}