Repository: jclouds-labs Updated Branches: refs/heads/2.0.x 784ee0207 -> fadcd5d9f
JCLOUDS-1208 Implement the TemplateOptions.inboundPorts in ProfitBricks REST Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/53439188 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/53439188 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/53439188 Branch: refs/heads/2.0.x Commit: 534391887a4aec64f523b2768f76f1e518f6ecda Parents: 784ee02 Author: Ali Bazlamit <[email protected]> Authored: Wed Jan 18 12:08:05 2017 +0200 Committer: Ignasi Barrera <[email protected]> Committed: Wed Jan 25 10:57:36 2017 +0100 ---------------------------------------------------------------------- .../ProfitBricksComputeServiceAdapter.java | 76 ++++++++++++-------- .../ProfitBricksComputeServiceLiveTest.java | 34 ++++++++- 2 files changed, 78 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/53439188/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java ---------------------------------------------------------------------- diff --git a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java index be34f3f..0f15123 100644 --- a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java +++ b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceAdapter.java @@ -17,33 +17,39 @@ package org.apache.jclouds.profitbricks.rest.compute; import static com.google.common.base.Preconditions.checkArgument; +import com.google.common.base.Predicate; import static com.google.common.base.Strings.isNullOrEmpty; +import com.google.common.base.Supplier; +import com.google.common.base.Throwables; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import static com.google.common.collect.Iterables.contains; import static com.google.common.collect.Iterables.filter; +import com.google.common.collect.Lists; import static com.google.common.util.concurrent.Futures.getUnchecked; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.inject.Inject; import static java.lang.String.format; -import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER; -import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_NIC; -import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_SERVER; -import static org.jclouds.Constants.PROPERTY_USER_THREADS; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; - import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.concurrent.Callable; - import javax.annotation.Resource; import javax.inject.Named; import javax.inject.Singleton; - import org.apache.jclouds.profitbricks.rest.ProfitBricksApi; import org.apache.jclouds.profitbricks.rest.compute.concurrent.ProvisioningJob; import org.apache.jclouds.profitbricks.rest.compute.concurrent.ProvisioningManager; import org.apache.jclouds.profitbricks.rest.compute.function.ProvisionableToImage; import org.apache.jclouds.profitbricks.rest.compute.strategy.TemplateWithDataCenter; +import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER; +import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_NIC; +import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_SERVER; import org.apache.jclouds.profitbricks.rest.domain.DataCenter; +import org.apache.jclouds.profitbricks.rest.domain.FirewallRule; import org.apache.jclouds.profitbricks.rest.domain.Image; import org.apache.jclouds.profitbricks.rest.domain.Lan; import org.apache.jclouds.profitbricks.rest.domain.Nic; @@ -60,7 +66,10 @@ import org.apache.jclouds.profitbricks.rest.ids.ServerRef; import org.apache.jclouds.profitbricks.rest.ids.VolumeRef; import org.apache.jclouds.profitbricks.rest.util.Passwords; import org.apache.jclouds.profitbricks.rest.util.Trackables; +import static org.jclouds.Constants.PROPERTY_USER_THREADS; import org.jclouds.compute.ComputeServiceAdapter; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Processor; @@ -70,23 +79,13 @@ import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.util.ComputeServiceUtils; +import static org.jclouds.compute.util.ComputeServiceUtils.getPortRangesFromList; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.LoginCredentials; import org.jclouds.logging.Logger; import org.jclouds.rest.ResourceNotFoundException; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.base.Throwables; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.inject.Inject; - @Singleton public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<ServerInDataCenter, Hardware, Provisionable, Location> { @@ -149,6 +148,7 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< final String loginUser = isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser(); final String password = options.hasLoginPassword() ? options.getLoginPassword() : Passwords.generate(); final org.jclouds.compute.domain.Image image = template.getImage(); + final int[] inboundPorts = template.getOptions().getInboundPorts(); // provision all volumes based on hardware List<? extends Volume> volumes = hardware.getVolumes(); @@ -175,12 +175,12 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< type(VolumeType.HDD); org.apache.jclouds.profitbricks.rest.domain.Volume vol = (org.apache.jclouds.profitbricks.rest.domain.Volume) provisioningManager - .provision(jobFactory.create(dataCenterId, new Supplier<Object>() { - @Override - public Object get() { - return api.volumeApi().createVolume(request.build()); - } - })); + .provision(jobFactory.create(dataCenterId, new Supplier<Object>() { + @Override + public Object get() { + return api.volumeApi().createVolume(request.build()); + } + })); volumeIds.add(vol.id()); logger.trace(">> provisioning complete for volume. returned id='%s'", vol.id()); @@ -281,15 +281,33 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< .name("jclouds" + name) .dhcp(Boolean.TRUE) .lan(lanId) - .firewallActive(Boolean.FALSE) + .firewallActive(inboundPorts.length > 0) .serverId(server.id()). build()); - + trackables.waitUntilRequestCompleted(nic); waitNICUntilAvailable.apply(NicRef.create(dataCenterId, server.id(), nic.id())); waitDcUntilAvailable.apply(dataCenterId); waitServerUntilAvailable.apply(ServerRef.create(dataCenterId, server.id())); + Map<Integer, Integer> portsRange = getPortRangesFromList(inboundPorts); + + for (Map.Entry<Integer, Integer> range : portsRange.entrySet()) { + FirewallRule rule = api.firewallApi().create( + FirewallRule.Request.creatingBuilder() + .dataCenterId(dataCenterId) + .serverId(server.id()) + .nicId(nic.id()) + .name(server.properties().name() + " jclouds-firewall") + .protocol(FirewallRule.Protocol.TCP) + .portRangeStart(range.getKey()) + .portRangeEnd(range.getValue()) + .build() + ); + trackables.waitUntilRequestCompleted(rule); + + } + //connect the rest of volumes to server;delete if fails final int volumeCount = volumeIds.size(); for (int j = 1; j < volumeCount; j++) { // skip first; already connected @@ -400,7 +418,7 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter< ImmutableList.Builder<Provisionable> provisionables = ImmutableList.builder(); provisionables.addAll(getUnchecked(images)); provisionables.addAll(getUnchecked(snapshots)); - + return provisionables.build(); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/53439188/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceLiveTest.java ---------------------------------------------------------------------- diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceLiveTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceLiveTest.java index a3a15b3..3f89fe5 100644 --- a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceLiveTest.java +++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/ProfitBricksComputeServiceLiveTest.java @@ -18,24 +18,34 @@ package org.apache.jclouds.profitbricks.rest.compute; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import static com.google.common.collect.Iterables.getOnlyElement; import com.google.inject.Module; +import org.apache.jclouds.profitbricks.rest.ProfitBricksApi; +import org.apache.jclouds.profitbricks.rest.config.ProfitBricksRateLimitModule; +import org.apache.jclouds.profitbricks.rest.domain.FirewallRule; +import org.apache.jclouds.profitbricks.rest.domain.Server; +import org.apache.jclouds.profitbricks.rest.domain.options.DepthOptions; +import org.apache.jclouds.profitbricks.rest.domain.zonescoped.DataCenterAndId; import static org.assertj.core.api.Assertions.assertThat; +import org.jclouds.compute.RunNodesException; import org.jclouds.compute.domain.ExecResponse; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; import org.jclouds.compute.internal.BaseComputeServiceLiveTest; +import org.jclouds.compute.predicates.NodePredicates; import static org.jclouds.compute.predicates.NodePredicates.inGroup; - -import org.apache.jclouds.profitbricks.rest.config.ProfitBricksRateLimitModule; import org.jclouds.logging.config.LoggingModule; import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; import org.jclouds.sshj.config.SshjSshClientModule; +import org.testng.Assert; import org.testng.annotations.Test; @Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceLiveTest") public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTest { + static ProfitBricksApi pbApi; + public ProfitBricksComputeServiceLiveTest() { provider = "profitbricks-rest"; } @@ -49,7 +59,7 @@ public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTe protected LoggingModule getLoggingModule() { return new SLF4JLoggingModule(); } - + @Override protected Iterable<Module> setupModules() { ImmutableSet.Builder<Module> modules = ImmutableSet.builder(); @@ -84,6 +94,23 @@ public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTe } @Override + protected void createAndRunAServiceInGroup(String group) throws RunNodesException { + super.createAndRunAServiceInGroup(group); + pbApi = client.getContext().unwrapApi(ProfitBricksApi.class); + + int matches = 0; + NodeMetadata node = Iterables.getOnlyElement(client.listNodesDetailsMatching(NodePredicates.inGroup(group))); + DataCenterAndId datacenterAndId = DataCenterAndId.fromSlashEncoded(node.getId()); + Server server = pbApi.serverApi().getServer(datacenterAndId.getDataCenter(), datacenterAndId.getId(), new DepthOptions().depth(5)); + for (FirewallRule rule : server.entities().nics().items().get(0).entities().firewallrules().items()) { + if (rule.properties().portRangeStart() == 22 || rule.properties().portRangeStart() == 8080) { + matches++; + } + } + Assert.assertEquals(2, matches); + } + + @Override @Test public void testCreateNodeWithCustomHardware() throws Exception { Template template = buildTemplate(templateBuilder() @@ -113,4 +140,5 @@ public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTe client.destroyNodesMatching(inGroup(group + "custom")); } } + }
