JCLOUDS-947: Properly configure live tests in ProfitBricks
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/52c6c2b7 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/52c6c2b7 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/52c6c2b7 Branch: refs/heads/master Commit: 52c6c2b7b5acf48fcddbfe7c043b133f0fc71c00 Parents: 5e82bbf Author: Reijhanniel Jearl Campos <[email protected]> Authored: Sat Nov 14 08:23:58 2015 +0800 Committer: Ignasi Barrera <[email protected]> Committed: Wed Nov 18 22:35:05 2015 +0100 ---------------------------------------------------------------------- .../DeregisterLoadBalancerRequestBinder.java | 4 +- .../RegisterLoadBalancerRequestBinder.java | 6 +- ...ProfitBricksComputeServiceContextModule.java | 93 +++++++++- .../internal/ProvisioningStatusAware.java | 27 --- .../ProvisioningStatusPollingPredicate.java | 70 -------- .../config/ProfitBricksComputeProperties.java | 1 + .../jclouds/profitbricks/domain/Location.java | 5 + .../profitbricks/features/IpBlockApi.java | 5 +- .../profitbricks/features/LoadBalancerApi.java | 15 +- .../jclouds/profitbricks/features/NicApi.java | 16 +- .../LoadBalancerIdOnlyResponseHandler.java | 51 ++++++ .../parser/nic/NicIdOnlyResponseHandler.java | 51 ++++++ .../profitbricks/BaseProfitBricksLiveTest.java | 161 +++++++++++++++-- ...DeregisterLoadBalancerRequestBinderTest.java | 17 +- .../RegisterLoadBalancerRequestBinderTest.java | 18 +- ...ofitBricksComputeServiceAdapterLiveTest.java | 74 -------- .../ProfitBricksComputeServiceLiveTest.java | 142 +++++++++++++++ .../compute/config/StatusPredicateTest.java | 145 ++++++++++++++++ .../ProvisioningStatusPollingPredicateTest.java | 173 ------------------- .../features/DataCenterApiLiveTest.java | 16 +- .../features/DrivesApiLiveTest.java | 64 +++---- .../features/FirewallApiLiveTest.java | 110 ++++++------ .../profitbricks/features/ImageApiLiveTest.java | 30 ++-- .../features/IpBlockApiLiveTest.java | 63 ++++--- .../features/IpBlockApiMockTest.java | 4 +- .../features/LoadBalancerApiLiveTest.java | 127 ++++++++------ .../features/LoadBalancerApiMockTest.java | 31 ++-- .../profitbricks/features/NicApiLiveTest.java | 104 +++++------ .../profitbricks/features/NicApiMockTest.java | 27 +-- .../features/ServerApiLiveTest.java | 71 +++----- .../features/SnapshotApiLiveTest.java | 133 +++++++------- .../features/StorageApiLiveTest.java | 65 +++---- .../LoadBalancerIdOnlyResponseHandlerTest.java | 41 +++++ .../nic/NicIdOnlyResponseHandlerTest.java | 40 +++++ .../loadbalancer/loadbalancer-create.xml | 28 ++- .../loadbalancer/loadbalancer-deregister.xml | 26 ++- .../loadbalancer/loadbalancer-register.xml | 32 ++-- .../loadbalancer/loadbalancer-update.xml | 27 ++- .../src/test/resources/logback-test.xml | 74 ++++++++ .../src/test/resources/nic/nic-delete.xml | 21 ++- .../test/resources/nic/nic-internetaccess.xml | 23 +-- .../src/test/resources/nic/nic-update.xml | 27 ++- 42 files changed, 1344 insertions(+), 914 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java index ba237c4..086fa3d 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java @@ -31,12 +31,10 @@ public class DeregisterLoadBalancerRequestBinder extends BaseProfitBricksRequest @Override protected String createPayload(LoadBalancer.Request.DeregisterPayload payload) { - requestBuilder.append("<ws:deregisterServersOnLoadBalancer>") - .append("<request>"); + requestBuilder.append("<ws:deregisterServersOnLoadBalancer>"); for (String s : payload.serverIds()) requestBuilder.append(format("<serverIds>%s</serverIds>", s)); requestBuilder.append(format("<loadBalancerId>%s</loadBalancerId>", payload.id())) - .append("</request>") .append("</ws:deregisterServersOnLoadBalancer>"); return requestBuilder.toString(); http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java index 21f1d84..3741dad 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java @@ -32,14 +32,12 @@ public class RegisterLoadBalancerRequestBinder extends BaseProfitBricksRequestBi @Override protected String createPayload(LoadBalancer.Request.RegisterPayload payload) { requestBuilder - .append("<ws:registerServersOnLoadBalancer>").append("<request>") + .append("<ws:registerServersOnLoadBalancer>") .append(format("<loadBalancerId>%s</loadBalancerId>", payload.id())); for (String s : payload.serverIds()) requestBuilder.append(format("<serverIds>%s</serverIds>", s)); - requestBuilder - .append("</request>") - .append("</ws:registerServersOnLoadBalancer>"); + requestBuilder.append("</ws:registerServersOnLoadBalancer>"); return requestBuilder.toString().replaceAll("\\s+", ""); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java index 2b45d18..b3fe313 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java @@ -16,10 +16,15 @@ */ package org.jclouds.profitbricks.compute.config; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PERIOD; import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_MAX_PERIOD; import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER; +import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_SNAPSHOT; import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_TIMEOUT; +import static org.jclouds.util.Predicates2.retry; import java.util.concurrent.TimeUnit; @@ -49,11 +54,8 @@ import org.jclouds.profitbricks.compute.function.LocationToLocation; import org.jclouds.profitbricks.compute.function.ProvisionableToImage; import org.jclouds.profitbricks.compute.function.ServerToNodeMetadata; import org.jclouds.profitbricks.compute.function.StorageToVolume; -import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware; -import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate; import org.jclouds.profitbricks.domain.ProvisioningState; import org.jclouds.profitbricks.domain.Provisionable; -import org.jclouds.util.Predicates2; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -101,10 +103,26 @@ public class ProfitBricksComputeServiceContextModule extends @Provides @Singleton @Named(POLL_PREDICATE_DATACENTER) - Predicate<String> provideWaitDataCenterUntilAvailablePredicate( + Predicate<String> provideDataCenterAvailablePredicate( final ProfitBricksApi api, ComputeConstants constants) { - return Predicates2.retry(new ProvisioningStatusPollingPredicate( - api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE), + return retry(new DataCenterProvisioningStatePredicate( + api, ProvisioningState.AVAILABLE), + constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS); + } + + @Provides + @Named(TIMEOUT_NODE_RUNNING) + Predicate<String> provideServerRunningPredicate(final ProfitBricksApi api, ComputeConstants constants) { + return retry(new ServerStatusPredicate( + api, Server.Status.RUNNING), + constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS); + } + + @Provides + @Named(TIMEOUT_NODE_SUSPENDED) + Predicate<String> provideServerSuspendedPredicate(final ProfitBricksApi api, ComputeConstants constants) { + return retry(new ServerStatusPredicate( + api, Server.Status.SHUTOFF), constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS); } @@ -117,6 +135,69 @@ public class ProfitBricksComputeServiceContextModule extends return provisioningManager; } + @Provides + @Singleton + @Named(POLL_PREDICATE_SNAPSHOT) + Predicate<String> provideSnapshotAvailablePredicate(final ProfitBricksApi api, ComputeConstants constants) { + return retry(new SnapshotProvisioningStatePredicate( + api, ProvisioningState.AVAILABLE), + constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS); + } + + static class DataCenterProvisioningStatePredicate implements Predicate<String> { + + private final ProfitBricksApi api; + private final ProvisioningState expectedState; + + public DataCenterProvisioningStatePredicate(ProfitBricksApi api, ProvisioningState expectedState) { + this.api = checkNotNull(api, "api must not be null"); + this.expectedState = checkNotNull(expectedState, "expectedState must not be null"); + } + + @Override + public boolean apply(String input) { + checkNotNull(input, "datacenter id"); + return api.dataCenterApi().getDataCenterState(input) == expectedState; + } + + } + + static class ServerStatusPredicate implements Predicate<String> { + + private final ProfitBricksApi api; + private final Server.Status expectedStatus; + + public ServerStatusPredicate(ProfitBricksApi api, Server.Status expectedStatus) { + this.api = checkNotNull(api, "api must not be null"); + this.expectedStatus = checkNotNull(expectedStatus, "expectedStatus must not be null"); + } + + @Override + public boolean apply(String input) { + checkNotNull(input, "server id"); + return api.serverApi().getServer(input).status() == expectedStatus; + } + + } + + static class SnapshotProvisioningStatePredicate implements Predicate<String> { + + private final ProfitBricksApi api; + private final ProvisioningState expectedState; + + public SnapshotProvisioningStatePredicate(ProfitBricksApi api, ProvisioningState expectedState) { + this.api = checkNotNull(api, "api must not be null"); + this.expectedState = checkNotNull(expectedState, "expectedState must not be null"); + } + + @Override + public boolean apply(String input) { + checkNotNull(input, "snapshot id"); + return api.snapshotApi().getSnapshot(input).state() == expectedState; + } + + } + @Singleton public static class ComputeConstants { http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java deleted file mode 100644 index bd00a3d..0000000 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.jclouds.profitbricks.compute.internal; - -/** - * An enumeration of ProfitBricks domain classes containing a property 'ProvisioningState'. - * - * @see ProvisioningStatusPollingPredicate - */ -public enum ProvisioningStatusAware { - - DATACENTER, SERVER, STORAGE, NIC, SNAPSHOT; -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java deleted file mode 100644 index 41c3e93..0000000 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.jclouds.profitbricks.compute.internal; - -import static com.google.common.base.Preconditions.checkNotNull; - -import org.jclouds.profitbricks.ProfitBricksApi; -import org.jclouds.profitbricks.domain.ProvisioningState; - -import com.google.common.base.Predicate; -import org.jclouds.rest.ResourceNotFoundException; - -/** - * A custom predicate for waiting until a virtual resource satisfies the given expected status - * <p> - * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some - * cases, the API user gets blocked from further requests, and will then need to contact tech support for api lock - * release. - */ -public class ProvisioningStatusPollingPredicate implements Predicate<String> { - - private final ProfitBricksApi api; - private final ProvisioningStatusAware domain; - private final ProvisioningState expect; - - public ProvisioningStatusPollingPredicate(ProfitBricksApi api, ProvisioningStatusAware domain, ProvisioningState expect) { - this.api = checkNotNull(api, "API null"); - this.expect = checkNotNull(expect, "Expected state null"); - this.domain = checkNotNull(domain, "Domain null"); - } - - @Override - public boolean apply(String input) { - checkNotNull(input, "Virtual item id can't be null."); - try { - switch (domain) { - case DATACENTER: - return expect == api.dataCenterApi().getDataCenterState(input); - case SERVER: - return expect == api.serverApi().getServer(input).state(); - case STORAGE: - return expect == api.storageApi().getStorage(input).state(); - case NIC: - return expect == api.nicApi().getNic(input).state(); - case SNAPSHOT: - return expect == api.snapshotApi().getSnapshot(input).state(); - default: - throw new IllegalArgumentException("Unknown domain '" + domain + "'"); - } - } catch (ResourceNotFoundException ex) { - // After provisioning, a node might still not be "fetchable" via API - return false; - } - } - -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java index 19b0e53..8f5840d 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java @@ -19,6 +19,7 @@ package org.jclouds.profitbricks.config; public class ProfitBricksComputeProperties { public static final String POLL_PREDICATE_DATACENTER = "jclouds.profitbricks.predicate.datacenter"; + public static final String POLL_PREDICATE_SNAPSHOT = "jclouds.profitbricks.predicate.snapshot"; public static final String POLL_TIMEOUT = "jclouds.profitbricks.poll.timeout"; public static final String POLL_PERIOD = "jclouds.profitbricks.operation.poll.initial-period"; http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java index 6102a42..834fa86 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java @@ -52,4 +52,9 @@ public enum Location { return location; return UNRECOGNIZED; } + + @Override + public String toString() { + return id; + } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java index a81293e..ca9841d 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java @@ -17,14 +17,17 @@ package org.jclouds.profitbricks.features; import java.util.List; + import javax.inject.Named; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; + import org.jclouds.Fallbacks; import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.profitbricks.domain.IpBlock; +import org.jclouds.profitbricks.domain.Location; import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope; import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler; import org.jclouds.profitbricks.http.parser.ipblock.IpBlockListResponseHandler; @@ -58,7 +61,7 @@ public interface IpBlockApi { @Named("publicipblock:reserve") @Payload("<ws:reservePublicIpBlock><request><blockSize>{blockSize}</blockSize><location>{location}</location></request></ws:reservePublicIpBlock>") @XMLResponseParser(IpBlockResponseHandler.class) - IpBlock reservePublicIpBlock(@PayloadParam("blockSize") String blockSize, @PayloadParam("location") String location); + IpBlock reservePublicIpBlock(@PayloadParam("blockSize") int blockSize, @PayloadParam("location") Location location); @POST @Named("publicipblock:addip") http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java index 3d37183..6cf8e23 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java @@ -21,7 +21,9 @@ import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; + import java.util.List; + import org.jclouds.Fallbacks; import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.profitbricks.binder.loadbalancer.CreateLoadBalancerRequestBinder; @@ -31,6 +33,7 @@ import org.jclouds.profitbricks.binder.loadbalancer.UpdateLoadBalancerRequestBin import org.jclouds.profitbricks.domain.LoadBalancer; import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope; import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler; +import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerIdOnlyResponseHandler; import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerListResponseHandler; import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerResponseHandler; import org.jclouds.rest.annotations.Fallback; @@ -62,7 +65,7 @@ public interface LoadBalancerApi { @POST @Named("loadbalancer:create") @MapBinder(CreateLoadBalancerRequestBinder.class) - @XMLResponseParser(RequestIdOnlyResponseHandler.class) + @XMLResponseParser(LoadBalancerIdOnlyResponseHandler.class) String createLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.CreatePayload payload); @POST @@ -72,10 +75,10 @@ public interface LoadBalancerApi { LoadBalancer registerLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.RegisterPayload payload); @POST - @Named("loadbalancer:Deregister") + @Named("loadbalancer:deregister") @MapBinder(DeregisterLoadBalancerRequestBinder.class) - @XMLResponseParser(LoadBalancerResponseHandler.class) - LoadBalancer deregisterLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.DeregisterPayload payload); + @XMLResponseParser(RequestIdOnlyResponseHandler.class) + String deregisterLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.DeregisterPayload payload); @POST @Named("loadbalancer:delete") @@ -85,6 +88,6 @@ public interface LoadBalancerApi { @POST @Named("loadbalancer:update") @MapBinder(UpdateLoadBalancerRequestBinder.class) - @XMLResponseParser(LoadBalancerResponseHandler.class) - LoadBalancer updateLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.UpdatePayload payload); + @XMLResponseParser(RequestIdOnlyResponseHandler.class) + String updateLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.UpdatePayload payload); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java index 57e425f..c945935 100644 --- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java @@ -37,8 +37,12 @@ import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.POST; + import java.util.List; +import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler; +import org.jclouds.profitbricks.http.parser.nic.NicIdOnlyResponseHandler; + @RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class}) @Consumes(MediaType.TEXT_XML) @Produces(MediaType.TEXT_XML) @@ -54,8 +58,8 @@ public interface NicApi { @POST @Named("nic:create") @MapBinder(CreateNicRequestBinder.class) - @XMLResponseParser(NicResponseHandler.class) - Nic createNic(@PayloadParam("nic") Nic.Request.CreatePayload payload); + @XMLResponseParser(NicIdOnlyResponseHandler.class) + String createNic(@PayloadParam("nic") Nic.Request.CreatePayload payload); @POST @Named("nic:get") @@ -67,14 +71,14 @@ public interface NicApi { @POST @Named("nic:update") @MapBinder(UpdateNicRequestBinder.class) - @XMLResponseParser(NicResponseHandler.class) - Nic updateNic(@PayloadParam("nic") Nic.Request.UpdatePayload payload); + @XMLResponseParser(RequestIdOnlyResponseHandler.class) + String updateNic(@PayloadParam("nic") Nic.Request.UpdatePayload payload); @POST @Named("nic:setInternetAccess") @MapBinder(SetInternetAccessBinder.class) - @XMLResponseParser(NicResponseHandler.class) - Nic setInternetAccess(@PayloadParam("nic") Nic.Request.SetInternetAccessPayload payload); + @XMLResponseParser(RequestIdOnlyResponseHandler.class) + String setInternetAccess(@PayloadParam("nic") Nic.Request.SetInternetAccessPayload payload); @POST @Named("nic:delete") http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java new file mode 100644 index 0000000..a239336 --- /dev/null +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java @@ -0,0 +1,51 @@ +/* + * 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.jclouds.profitbricks.http.parser.loadbalancer; + +import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler; +import org.xml.sax.SAXException; + +/** + * Handler for parsing SOAP response where <i>loadBalancerId</i> is the only <i>usable</i> value. + * + * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion + */ +public class LoadBalancerIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> { + + private String loadBalancerId; + + LoadBalancerIdOnlyResponseHandler() { + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + setPropertyOnEndTag(qName); + clearTextBuffer(); + } + + @Override + protected void setPropertyOnEndTag(String qName) { + if ("loadBalancerId".equals(qName)) + loadBalancerId = textToStringValue(); + } + + @Override + public String getResult() { + return loadBalancerId; + } + +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java new file mode 100644 index 0000000..8f8ba03 --- /dev/null +++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java @@ -0,0 +1,51 @@ +/* + * 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.jclouds.profitbricks.http.parser.nic; + +import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler; +import org.xml.sax.SAXException; + +/** + * Handler for parsing SOAP response where <i>nicId</i> is the only <i>usable</i> value. + * + * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion + */ +public class NicIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> { + + private String nicId; + + NicIdOnlyResponseHandler() { + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + setPropertyOnEndTag(qName); + clearTextBuffer(); + } + + @Override + protected void setPropertyOnEndTag(String qName) { + if ("nicId".equals(qName)) + nicId = textToStringValue(); + } + + @Override + public String getResult() { + return nicId; + } + +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java index e310b6e..524149a 100644 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java @@ -16,30 +16,171 @@ */ package org.jclouds.profitbricks; -import java.util.concurrent.TimeUnit; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; +import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER; +import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_SNAPSHOT; +import static org.testng.Assert.assertTrue; + +import java.util.List; +import java.util.Objects; +import java.util.Properties; import org.jclouds.apis.BaseApiLiveTest; -import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware; -import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate; +import org.jclouds.profitbricks.domain.DataCenter; +import org.jclouds.profitbricks.domain.Location; +import org.jclouds.profitbricks.domain.Server; import org.jclouds.profitbricks.domain.ProvisioningState; -import org.jclouds.util.Predicates2; +import org.jclouds.profitbricks.features.DataCenterApi; +import org.jclouds.profitbricks.features.ServerApi; import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.FluentIterable; +import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.Module; +import com.google.inject.TypeLiteral; +import com.google.inject.name.Names; + +import org.jclouds.profitbricks.domain.Nic; +import org.jclouds.profitbricks.features.NicApi; public abstract class BaseProfitBricksLiveTest extends BaseApiLiveTest<ProfitBricksApi> { - protected Predicate<String> dcWaitingPredicate; + public static final Location testLocation = Location.US_LAS; + + private Predicate<String> dataCenterAvailable; + private Predicate<String> snapshotAvailable; + private Predicate<String> serverRunning; + private Predicate<String> serverSuspended; public BaseProfitBricksLiveTest() { provider = "profitbricks"; } @Override - protected void initialize() { - super.initialize(); - this.dcWaitingPredicate = Predicates2.retry( - new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE), - 2l * 60l, 2l, TimeUnit.SECONDS); + protected ProfitBricksApi create(Properties props, Iterable<Module> modules) { + Injector injector = newBuilder().modules(modules).overrides(props).buildInjector(); + dataCenterAvailable = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() { + }, Names.named(POLL_PREDICATE_DATACENTER))); + snapshotAvailable = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() { + }, Names.named(POLL_PREDICATE_SNAPSHOT))); + serverRunning = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() { + }, Names.named(TIMEOUT_NODE_RUNNING))); + serverSuspended = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() { + }, Names.named(TIMEOUT_NODE_SUSPENDED))); + + return injector.getInstance(ProfitBricksApi.class); + } + + protected void assertDataCenterAvailable(DataCenter dataCenter) { + assertDataCenterAvailable(dataCenter.id()); + } + + protected void assertDataCenterAvailable(String dataCenterId) { + assertTrue(dataCenterAvailable.apply(dataCenterId), + String.format("Datacenter %s wasn't available in the configured timeout", dataCenterId)); + } + + protected void assertSnapshotAvailable(String snapshotId){ + assertTrue(snapshotAvailable.apply(snapshotId), + String.format("Snapshot %s wasn't available in the configured timeout", snapshotId)); + } + + protected void assertNodeRunning(String serverId) { + assertTrue(serverRunning.apply(serverId), String.format("Server %s did not start in the configured timeout", serverId)); + } + + protected void assertNodeSuspended(String serverId) { + assertTrue(serverSuspended.apply(serverId), String.format("Server %s did not stop in the configured timeout", serverId)); + } + + protected DataCenter findOrCreateDataCenter(final String name) { + DataCenterApi dataCenterApi = api.dataCenterApi(); + + return FluentIterable.from(dataCenterApi.getAllDataCenters()).firstMatch(new Predicate<DataCenter>() { + + @Override + public boolean apply(DataCenter input) { + boolean match = Objects.equals(input.name(), name); + if (match && input.location() == testLocation) + assertDataCenterAvailable(input); + + return match; + } + }).or(new Supplier<DataCenter>() { + + @Override + public DataCenter get() { + DataCenter dataCenter = api.dataCenterApi().createDataCenter( + DataCenter.Request.creatingPayload(name, testLocation)); + assertDataCenterAvailable(dataCenter); + + return api.dataCenterApi().getDataCenter(dataCenter.id()); + } + }); + } + + protected Server findOrCreateServer(final DataCenter dataCenter) { + return FluentIterable.from(dataCenter.servers()).firstMatch(new Predicate<Server>() { + + @Override + public boolean apply(Server input) { + return input.state() == ProvisioningState.AVAILABLE; + } + }).or(new Supplier<Server>() { + + @Override + public Server get() { + ServerApi serverApi = api.serverApi(); + String name = String.format("server-%d", dataCenter.servers().size()); + String createdServerId = serverApi.createServer( + Server.Request.creatingBuilder() + .dataCenterId(dataCenter.id()) + .name(name) + .cores(1) + .ram(256) + .build()); + assertDataCenterAvailable(dataCenter); + assertNodeRunning(createdServerId); + + return serverApi.getServer(createdServerId); + } + }); + } + + protected Nic findOrCreateNic(final DataCenter dataCenter) { + final NicApi nicApi = api.nicApi(); + final List<Nic> nics = nicApi.getAllNics(); + + return FluentIterable.from(nics).firstMatch(new Predicate<Nic>() { + + @Override + public boolean apply(Nic input) { + return Objects.equals(input.dataCenterId(), dataCenter.id()) + && input.state() == ProvisioningState.AVAILABLE; + } + }).or(new Supplier<Nic>() { + + @Override + public Nic get() { + Server server = findOrCreateServer(dataCenter); + String name = String.format("%s-nic-%d", server.name(), nics.size()); + String nicId = nicApi.createNic(Nic.Request.creatingBuilder() + .name(name) + .lanId(1) + .serverId(server.id()) + .build()); + assertDataCenterAvailable(dataCenter); + + return nicApi.getNic(nicId); + } + }); } + protected void destroyDataCenter(final DataCenter dataCenter) { + boolean success = api.dataCenterApi().deleteDataCenter(dataCenter.id()); + assertTrue(success, "DataCenter wasn't deleted"); + } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java index b1fa5c3..c690fb3 100644 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java @@ -16,11 +16,12 @@ */ package org.jclouds.profitbricks.binder.loadbalancer; -import com.google.common.collect.Lists; -import java.util.List; -import org.jclouds.profitbricks.domain.LoadBalancer; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; + +import com.google.common.collect.ImmutableList; + +import org.jclouds.profitbricks.domain.LoadBalancer; import org.testng.annotations.Test; @Test(groups = "unit", testName = "DeregisterLoadBalancerRequestBinderTest") @@ -29,13 +30,9 @@ public class DeregisterLoadBalancerRequestBinderTest { @Test public void testDeregisterPayload() { DeregisterLoadBalancerRequestBinder binder = new DeregisterLoadBalancerRequestBinder(); - List<String> serverIds = Lists.newArrayList(); - serverIds.add("1"); - serverIds.add("2"); - - LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request.createDeregisteringPayload("load-balancer-id", serverIds); - String actual = binder.createPayload(payload); + String actual = binder.createPayload(LoadBalancer.Request.createDeregisteringPayload( + "load-balancer-id", ImmutableList.of("1", "2"))); assertNotNull(actual, "Binder returned null payload"); assertEquals(expectedPayload, actual); @@ -43,10 +40,8 @@ public class DeregisterLoadBalancerRequestBinderTest { private final String expectedPayload = (" <ws:deregisterServersOnLoadBalancer>\n" - + " <request>" + " <serverIds>1</serverIds>\n" + " <serverIds>2</serverIds>\n" + " <loadBalancerId>load-balancer-id</loadBalancerId>\n" - + " </request>" + " </ws:deregisterServersOnLoadBalancer>").replaceAll("\\s+", ""); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java index db42403..8f2e5a9 100644 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java @@ -16,11 +16,12 @@ */ package org.jclouds.profitbricks.binder.loadbalancer; -import com.google.common.collect.Lists; -import java.util.List; -import org.jclouds.profitbricks.domain.LoadBalancer; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; + +import org.jclouds.profitbricks.domain.LoadBalancer; + +import com.google.common.collect.ImmutableList; import org.testng.annotations.Test; @Test(groups = "unit", testName = "RegisterLoadBalancerRequestBinderTest") @@ -29,13 +30,8 @@ public class RegisterLoadBalancerRequestBinderTest { @Test public void testRegisterPayload() { RegisterLoadBalancerRequestBinder binder = new RegisterLoadBalancerRequestBinder(); - List<String> serverIds = Lists.newArrayList(); - serverIds.add("1"); - serverIds.add("2"); - - LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.createRegisteringPaylod("load-balancer-id", serverIds); - - String actual = binder.createPayload(payload); + String actual = binder.createPayload(LoadBalancer.Request.createRegisteringPaylod( + "load-balancer-id", ImmutableList.of("1", "2"))); assertNotNull(actual, "Binder returned null payload"); assertEquals(expectedPayload, actual); @@ -43,10 +39,8 @@ public class RegisterLoadBalancerRequestBinderTest { private final String expectedPayload = (" <ws:registerServersOnLoadBalancer>\n" - + " <request>" + " <loadBalancerId>load-balancer-id</loadBalancerId>\n" + " <serverIds>1</serverIds>\n" + " <serverIds>2</serverIds>\n" - + " </request>" + " </ws:registerServersOnLoadBalancer>").replaceAll("\\s+", ""); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java deleted file mode 100644 index 83540a5..0000000 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.jclouds.profitbricks.compute; - -import org.jclouds.compute.domain.NodeMetadata; -import org.testng.annotations.Test; - -import org.jclouds.compute.internal.BaseComputeServiceLiveTest; -import org.jclouds.sshj.config.SshjSshClientModule; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.inject.Module; -import org.jclouds.compute.domain.ExecResponse; -import org.jclouds.logging.config.LoggingModule; -import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; - -@Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceAdapterLiveTest") -public class ProfitBricksComputeServiceAdapterLiveTest extends BaseComputeServiceLiveTest { - - public ProfitBricksComputeServiceAdapterLiveTest() { - provider = "profitbricks"; - } - - @Override - protected Module getSshModule() { - return new SshjSshClientModule(); - } - - @Override - protected LoggingModule getLoggingModule() { - return new SLF4JLoggingModule(); - } - - @Override - public void testOptionToNotBlock() throws Exception { - // ProfitBricks implementation intentionally blocks until the node is 'AVAILABLE' - } - - @Override - protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) { - // ProfitBricks doesn't support tags - } - - @Override - protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) { - // ProfitBricks doesn't support user metadata - } - - @Override - protected void checkResponseEqualsHostname(ExecResponse execResponse, NodeMetadata node1) { - // ProfitBricks doesn't support hostname - } - - @Override - protected void checkOsMatchesTemplate(NodeMetadata node) { - // Not enough description from API to match template - } - -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java new file mode 100644 index 0000000..2599f71 --- /dev/null +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java @@ -0,0 +1,142 @@ +/* + * 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.jclouds.profitbricks.compute; + +import static org.jclouds.profitbricks.BaseProfitBricksLiveTest.testLocation; +import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER; + +import java.util.Objects; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.FluentIterable; + +import org.jclouds.compute.domain.NodeMetadata; +import org.testng.annotations.Test; + +import org.jclouds.compute.internal.BaseComputeServiceLiveTest; +import org.jclouds.sshj.config.SshjSshClientModule; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Key; +import com.google.inject.Module; +import com.google.inject.TypeLiteral; +import com.google.inject.name.Names; + +import org.jclouds.compute.domain.ExecResponse; +import org.jclouds.logging.config.LoggingModule; +import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; +import org.jclouds.profitbricks.ProfitBricksApi; +import org.jclouds.profitbricks.domain.DataCenter; +import org.jclouds.profitbricks.features.DataCenterApi; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeGroups; + +@Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceLiveTest") +public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTest { + + private static final String TEST_DC_NAME = "computeServiceLiveTest" + System.currentTimeMillis(); + + private DataCenter dataCenter; + + public ProfitBricksComputeServiceLiveTest() { + provider = "profitbricks"; + } + + @BeforeGroups(groups = {"integration", "live"}) + @Override + public void setupContext() { + super.setupContext(); + + final DataCenterApi api = getDataCenterApi(); + final Predicate<String> predicate = getDataCenterPredicate(); + dataCenter = FluentIterable.from(api.getAllDataCenters()).firstMatch(new Predicate<DataCenter>() { + + @Override + public boolean apply(DataCenter input) { + boolean match = Objects.equals(input.name(), TEST_DC_NAME); + if (match && input.location() == testLocation) + return predicate.apply(input.id()); + return match; + } + }).or(new Supplier<DataCenter>() { + + @Override + public DataCenter get() { + DataCenter dataCenter = api.createDataCenter( + DataCenter.Request.creatingPayload(TEST_DC_NAME, testLocation)); + predicate.apply(dataCenter.id()); + + return api.getDataCenter(dataCenter.id()); + } + }); + } + + @AfterClass(groups = {"integration", "live"}, alwaysRun = true) + @Override + protected void tearDownContext() { + super.tearDownContext(); + if (dataCenter != null) + getDataCenterApi().deleteDataCenter(dataCenter.id()); + } + + private Predicate<String> getDataCenterPredicate() { + return client.getContext().utils().injector().getInstance(Key.get(new TypeLiteral<Predicate<String>>() { + }, Names.named(POLL_PREDICATE_DATACENTER))); + } + + private DataCenterApi getDataCenterApi() { + return client.getContext().unwrapApi(ProfitBricksApi.class).dataCenterApi(); + } + + @Override + protected Module getSshModule() { + return new SshjSshClientModule(); + } + + @Override + protected LoggingModule getLoggingModule() { + return new SLF4JLoggingModule(); + } + + @Override + public void testOptionToNotBlock() throws Exception { + // ProfitBricks implementation intentionally blocks until the node is 'AVAILABLE' + } + + @Override + protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) { + // ProfitBricks doesn't support tags + } + + @Override + protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) { + // ProfitBricks doesn't support user metadata + } + + @Override + protected void checkResponseEqualsHostname(ExecResponse execResponse, NodeMetadata node1) { + // ProfitBricks doesn't support hostname + } + + @Override + protected void checkOsMatchesTemplate(NodeMetadata node) { + // Not enough description from API to match template + } + +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java new file mode 100644 index 0000000..9c2b228 --- /dev/null +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java @@ -0,0 +1,145 @@ +/* + * 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.jclouds.profitbricks.compute.config; + +import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer; +import static org.testng.Assert.assertEquals; + +import java.util.concurrent.TimeUnit; + +import org.jclouds.profitbricks.ProfitBricksApi; +import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.DataCenterProvisioningStatePredicate; +import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.ServerStatusPredicate; +import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.SnapshotProvisioningStatePredicate; +import org.jclouds.profitbricks.domain.ProvisioningState; +import org.jclouds.profitbricks.domain.Server; +import org.jclouds.profitbricks.domain.Snapshot; +import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest; +import org.jclouds.util.Predicates2; +import org.testng.annotations.Test; + +import com.google.common.base.Predicate; +import com.squareup.okhttp.mockwebserver.MockResponse; +import com.squareup.okhttp.mockwebserver.MockWebServer; + + +/** + * Test class for {@link DataCenterProvisioningStatePredicate} and {@link ServerStatusPredicate} + */ +@Test(groups = "unit", testName = "ProvisioningStatusPollingPredicateTest") +public class StatusPredicateTest extends BaseProfitBricksMockTest { + + @Test + public void testDataCenterPredicate() throws Exception { + MockWebServer server = mockWebServer(); + + byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml"); + byte[] payloadAvailable = payloadFromResource("/datacenter/datacenter-state.xml"); + + // wait 3 times + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadAvailable)); + + server.enqueue(new MockResponse().setBody(payloadAvailable)); + + ProfitBricksApi pbApi = api(server.getUrl(rootUrl)); + + Predicate<String> waitUntilAvailable = Predicates2.retry( + new DataCenterProvisioningStatePredicate(pbApi, ProvisioningState.AVAILABLE), + 30l, 1l, TimeUnit.SECONDS); + + String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"; + try { + waitUntilAvailable.apply(id); + ProvisioningState finalState = pbApi.dataCenterApi().getDataCenterState(id); + assertRequestHasCommonProperties(server.takeRequest()); + assertEquals(finalState, ProvisioningState.AVAILABLE); + } finally { + pbApi.close(); + server.shutdown(); + } + } + + @Test + public void testServerPredicate() throws Exception { + MockWebServer server = mockWebServer(); + + byte[] payloadInProcess = payloadFromResource("/server/server-state-inprocess.xml"); + byte[] payloadAvailable = payloadFromResource("/server/server.xml"); + + // wait 3 times + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadAvailable)); + + server.enqueue(new MockResponse().setBody(payloadAvailable)); + + ProfitBricksApi pbApi = api(server.getUrl(rootUrl)); + + Predicate<String> waitUntilAvailable = Predicates2.retry( + new ServerStatusPredicate(pbApi, Server.Status.RUNNING), + 30l, 1l, TimeUnit.SECONDS); + + String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop"; + try { + waitUntilAvailable.apply(id); + Server remoteServer = pbApi.serverApi().getServer(id); + assertEquals(remoteServer.status(), Server.Status.RUNNING); + assertRequestHasCommonProperties(server.takeRequest()); + } finally { + pbApi.close(); + server.shutdown(); + } + } + + @Test + public void testSnapshotPredicate() throws Exception { + MockWebServer server = mockWebServer(); + + byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml"); + byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml"); + + // wait 3 times + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadInProcess)); + server.enqueue(new MockResponse().setBody(payloadAvailable)); + + server.enqueue(new MockResponse().setBody(payloadAvailable)); + + ProfitBricksApi pbApi = api(server.getUrl(rootUrl)); + + Predicate<String> waitUntilAvailable = Predicates2.retry( + new SnapshotProvisioningStatePredicate(pbApi, ProvisioningState.AVAILABLE), + 30l, 1l, TimeUnit.SECONDS); + + String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh"; + try { + waitUntilAvailable.apply(id); + Snapshot snapshot = pbApi.snapshotApi().getSnapshot(id); + assertEquals(snapshot.state(), ProvisioningState.AVAILABLE); + assertRequestHasCommonProperties(server.takeRequest()); + } finally { + pbApi.close(); + server.shutdown(); + } + } + +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java deleted file mode 100644 index 690412a..0000000 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * 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.jclouds.profitbricks.compute.internal; - -import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer; -import static org.testng.Assert.assertEquals; - -import java.util.concurrent.TimeUnit; - -import org.jclouds.profitbricks.ProfitBricksApi; -import org.jclouds.profitbricks.domain.ProvisioningState; -import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest; -import org.jclouds.util.Predicates2; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; -import com.squareup.okhttp.mockwebserver.MockResponse; -import com.squareup.okhttp.mockwebserver.MockWebServer; - -/** - * Tests for the {@link ProvisioningStatusPollingPredicate} class. - * <p> - */ -@Test(groups = "unit", testName = "ProvisioningStatusPollingPredicateTest") -public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMockTest { - - @Test - public void testDataCenterPredicate() throws Exception { - MockWebServer server = mockWebServer(); - - byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml"); - byte[] payloadAvailable = payloadFromResource("/datacenter/datacenter-state.xml"); - - // wait 3 times - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - ProfitBricksApi pbApi = api(server.getUrl(rootUrl)); - - Predicate<String> waitUntilAvailable = Predicates2.retry( - new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE), - 30l, 1l, TimeUnit.SECONDS); - - String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"; - try { - waitUntilAvailable.apply(id); - ProvisioningState finalState = pbApi.dataCenterApi().getDataCenterState(id); - assertRequestHasCommonProperties(server.takeRequest()); - assertEquals(finalState, ProvisioningState.AVAILABLE); - } finally { - pbApi.close(); - server.shutdown(); - } - } - - @Test - public void testServerPredicate() throws Exception { - MockWebServer server = mockWebServer(); - - byte[] payloadInProcess = payloadFromResource("/server/server-state-inprocess.xml"); - byte[] payloadAvailable = payloadFromResource("/server/server.xml"); - - // wait 3 times - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - ProfitBricksApi pbApi = api(server.getUrl(rootUrl)); - - Predicate<String> waitUntilAvailable = Predicates2.retry( - new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE), - 30l, 1l, TimeUnit.SECONDS); - - String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop"; - try { - waitUntilAvailable.apply(id); - ProvisioningState finalState = pbApi.serverApi().getServer(id).state(); - assertRequestHasCommonProperties(server.takeRequest()); - assertEquals(finalState, ProvisioningState.AVAILABLE); - } finally { - pbApi.close(); - server.shutdown(); - } - } - - @Test - public void testStoragePredicate() throws Exception { - MockWebServer server = mockWebServer(); - - byte[] payloadInProcess = payloadFromResource("/storage/storage-state-inprocess.xml"); - byte[] payloadAvailable = payloadFromResource("/storage/storage.xml"); - - // wait 3 times - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - ProfitBricksApi pbApi = api(server.getUrl(rootUrl)); - - Predicate<String> waitUntilAvailable = Predicates2.retry( - new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.STORAGE, ProvisioningState.AVAILABLE), - 30l, 1l, TimeUnit.SECONDS); - - String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh"; - try { - waitUntilAvailable.apply(id); - ProvisioningState finalState = pbApi.storageApi().getStorage(id).state(); - assertRequestHasCommonProperties(server.takeRequest()); - assertEquals(finalState, ProvisioningState.AVAILABLE); - } finally { - pbApi.close(); - server.shutdown(); - } - } - - @Test - public void testSnapshotPredicate() throws Exception { - MockWebServer server = mockWebServer(); - - byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml"); - byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml"); - - // wait 3 times - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadInProcess)); - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - server.enqueue(new MockResponse().setBody(payloadAvailable)); - - ProfitBricksApi pbApi = api(server.getUrl(rootUrl)); - - Predicate<String> waitUntilAvailable = Predicates2.retry( - new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE), - 30l, 1l, TimeUnit.SECONDS); - - String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh"; - try { - waitUntilAvailable.apply(id); - ProvisioningState finalState = pbApi.snapshotApi().getSnapshot(id).state(); - assertRequestHasCommonProperties(server.takeRequest()); - assertEquals(finalState, ProvisioningState.AVAILABLE); - } finally { - pbApi.close(); - server.shutdown(); - } - } - -} http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java index 6bcf053..33a086c 100644 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java @@ -20,6 +20,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; import java.util.List; @@ -28,12 +29,10 @@ import org.jclouds.profitbricks.domain.DataCenter; import org.jclouds.profitbricks.domain.Location; import org.jclouds.profitbricks.domain.ProvisioningState; -import static org.testng.Assert.assertTrue; - import org.testng.annotations.AfterClass; import org.testng.annotations.Test; -@Test(groups = "live", testName = "DataCenterApiLiveTest", singleThreaded = true) +@Test(groups = "live", testName = "DataCenterApiLiveTest") public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest { private String dcId; @@ -45,7 +44,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest { ); assertNotNull(dc); - dcWaitingPredicate.apply(dc.id()); + assertDataCenterAvailable(dc); dcId = dc.id(); } @@ -87,7 +86,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest { ); assertNotNull(dataCenter); - dcWaitingPredicate.apply(dcId); + assertDataCenterAvailable(dataCenter); DataCenter fetchedDc = api.dataCenterApi().getDataCenter(dcId); @@ -118,10 +117,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest { @AfterClass(alwaysRun = true) public void testDeleteDataCenter() { - if (dcId != null) { - boolean result = api.dataCenterApi().deleteDataCenter(dcId); - - assertTrue(result, "Created test data center was not deleted."); - } + boolean result = api.dataCenterApi().deleteDataCenter(dcId); + assertTrue(result, "Created test data center was not deleted."); } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java index 2f3c767..ff4dbb4 100644 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java @@ -16,51 +16,48 @@ */ package org.jclouds.profitbricks.features; -import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; -import java.util.List; - import org.jclouds.profitbricks.BaseProfitBricksLiveTest; +import org.jclouds.profitbricks.domain.DataCenter; import org.jclouds.profitbricks.domain.Drive; import org.jclouds.profitbricks.domain.Image; import org.jclouds.profitbricks.domain.Server; import org.testng.annotations.Test; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import com.google.common.base.Predicate; import com.google.common.collect.Iterables; -@Test(groups = "live", testName = "DrivesApiLiveTest", singleThreaded = true) +@Test(groups = "live", testName = "DrivesApiLiveTest") public class DrivesApiLiveTest extends BaseProfitBricksLiveTest { - public String serverId; - public String imageId; - - @Override - protected void initialize() { - super.initialize(); - - List<Server> servers = api.serverApi().getAllServers(); - assertFalse(servers.isEmpty(), "At least one server is required to run drives test."); - - Server server = Iterables.getFirst(servers, null); - assertNotNull(server); - - this.serverId = server.id(); - - List<Image> images = api.imageApi().getAllImages(); - assertFalse(images.isEmpty(), "At least one image is required to run drives test."); - - Image image = Iterables.getFirst(images, null); - assertNotNull(image); - - this.imageId = image.id(); + private DataCenter dataCenter; + private Server server; + private Image image; + + @BeforeClass + public void setupTest() { + dataCenter = findOrCreateDataCenter("drivesApiLiveTest" + System.currentTimeMillis()); + server = findOrCreateServer(dataCenter); + image = Iterables.tryFind(api.imageApi().getAllImages(), new Predicate<Image>() { + + @Override + public boolean apply(Image input) { + return input.location() == dataCenter.location() + && input.type() == Image.Type.CDROM; + } + }).get(); } @Test public void addRomDriveToServerTest() { - String requestId = api.drivesApi().addRomDriveToServer(Drive.Request.AddRomDriveToServerPayload.builder() - .serverId(serverId) - .imageId("05cadf29-6c12-11e4-beeb-52540066fee9") + assertDataCenterAvailable(dataCenter); + String requestId = api.drivesApi().addRomDriveToServer( + Drive.Request.AddRomDriveToServerPayload.builder() + .serverId(server.id()) + .imageId(image.id()) .deviceNumber("0") .build()); assertNotNull(requestId); @@ -68,8 +65,13 @@ public class DrivesApiLiveTest extends BaseProfitBricksLiveTest { @Test(dependsOnMethods = "addRomDriveToServerTest") public void removeRomDriveFromServerTest() { - String requestId = api.drivesApi().removeRomDriveFromServer(imageId, serverId); - + assertDataCenterAvailable(dataCenter); + String requestId = api.drivesApi().removeRomDriveFromServer(image.id(), server.id()); assertNotNull(requestId); } + + @AfterClass(alwaysRun = true) + public void cleanUp() { + destroyDataCenter(dataCenter); + } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java index 772667a..c5b63f2 100644 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java @@ -16,79 +16,58 @@ */ package org.jclouds.profitbricks.features; -import com.google.common.collect.Iterables; - -import java.util.List; - -import org.jclouds.profitbricks.BaseProfitBricksLiveTest; -import org.jclouds.profitbricks.domain.Firewall; -import org.jclouds.profitbricks.domain.Nic; - import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; -import java.util.concurrent.TimeUnit; +import java.util.List; -import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware; -import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate; +import org.jclouds.profitbricks.BaseProfitBricksLiveTest; +import org.jclouds.profitbricks.domain.DataCenter; +import org.jclouds.profitbricks.domain.Firewall; +import org.jclouds.profitbricks.domain.Nic; import org.jclouds.profitbricks.domain.Firewall.Protocol; -import org.jclouds.profitbricks.domain.ProvisioningState; -import org.jclouds.util.Predicates2; import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; -@Test(groups = "live", testName = "FirewallApiLiveTest", singleThreaded = true) + +@Test(groups = "live", testName = "FirewallApiLiveTest") public class FirewallApiLiveTest extends BaseProfitBricksLiveTest { - private Predicate<String> waitUntilAvailable; + private DataCenter dataCenter; private Nic nic; private Firewall createdFirewall; - private Firewall.Rule createdFirewallRule; - - @Override - protected void initialize() { - super.initialize(); - List<Nic> nics = api.nicApi().getAllNics(); - assertFalse(nics.isEmpty(), "Must atleast have 1 NIC available for firewall testing."); - - this.nic = Iterables.tryFind(nics, new Predicate<Nic>() { - - @Override - public boolean apply(Nic input) { - return input.state() == ProvisioningState.AVAILABLE; - } - }).orNull(); - - assertNotNull(nic, "No available NIC for firewall testing was found."); - this.waitUntilAvailable = Predicates2.retry( - new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.NIC, ProvisioningState.AVAILABLE), - 2l * 60l, 2l, TimeUnit.SECONDS); + @BeforeClass + public void setupTest() { + dataCenter = findOrCreateDataCenter("firewallApiLiveTest" + System.currentTimeMillis()); + nic = findOrCreateNic(dataCenter); } @Test public void testAddFirewallRuleToNic() { + assertDataCenterAvailable(dataCenter); Firewall firewall = api.firewallApi().addFirewallRuleToNic( - Firewall.Request.createAddRulePayload(nic.id(), ImmutableList.of( + Firewall.Request.createAddRulePayload( + nic.id(), ImmutableList.of( Firewall.Rule.builder() .name("test-rule-tcp") .protocol(Protocol.TCP) .build() - )) + ) + ) ); assertNotNull(firewall); - assertNotNull(firewall.rules()); + assertFalse(firewall.rules().isEmpty()); + assertDataCenterAvailable(dataCenter); - waitUntilAvailable.apply(nic.id()); createdFirewall = firewall; - createdFirewallRule = Iterables.getOnlyElement(firewall.rules()); } @Test(dependsOnMethods = "testAddFirewallRuleToNic") @@ -109,37 +88,52 @@ public class FirewallApiLiveTest extends BaseProfitBricksLiveTest { @Test(dependsOnMethods = "testAddFirewallRuleToNic") public void testActivateFirewall() { - boolean result = api.firewallApi().activateFirewall(ImmutableList.of(createdFirewall.id())); - - waitUntilAvailable.apply(nic.id()); - + assertDataCenterAvailable(dataCenter); + boolean result = api.firewallApi().activateFirewall( + ImmutableList.of(createdFirewall.id())); + assertDataCenterAvailable(dataCenter); assertTrue(result); + + Firewall firewall = api.firewallApi().getFirewall(createdFirewall.id()); + assertTrue(firewall.active(), "Firewall wasn't activated"); } @Test(dependsOnMethods = "testActivateFirewall") void testDeactivateFirewall() { - boolean result = api.firewallApi().deactivateFirewall(ImmutableList.of(createdFirewall.id())); - - waitUntilAvailable.apply(nic.id()); - + assertDataCenterAvailable(dataCenter); + boolean result = api.firewallApi().deactivateFirewall( + ImmutableList.of(createdFirewall.id())); + assertDataCenterAvailable(dataCenter); assertTrue(result); + + Firewall firewall = api.firewallApi().getFirewall(createdFirewall.id()); + assertFalse(firewall.active(), "Firewall wasn't deactivated"); } - @Test(dependsOnMethods = "testActivateFirewall") + @Test(dependsOnMethods = "testDeactivateFirewall") void testRemoveFirewallRule() { - boolean result = api.firewallApi().removeFirewallRules(ImmutableList.of(createdFirewallRule.id())); + assertDataCenterAvailable(dataCenter); + for (Firewall.Rule rule : createdFirewall.rules()) { + boolean result = api.firewallApi().removeFirewallRules( + ImmutableList.of(rule.id())); - waitUntilAvailable.apply(nic.id()); + assertTrue(result); + assertDataCenterAvailable(dataCenter); - assertTrue(result); + } + Firewall firewall = api.firewallApi().getFirewall(createdFirewall.id()); + assertTrue(firewall.rules().isEmpty(), "Not all rules removed"); } - @AfterClass(alwaysRun = true) + @Test(dependsOnMethods = "testRemoveFirewallRule") public void testDeleteFirewall() { - if (createdFirewall != null) { - boolean result = api.firewallApi().deleteFirewall(ImmutableList.of(createdFirewall.id())); + assertDataCenterAvailable(dataCenter); + boolean result = api.firewallApi().deleteFirewall(ImmutableList.of(createdFirewall.id())); + assertTrue(result, "Created firewall was not deleted."); + } - assertTrue(result, "Created firewall was not deleted."); - } + @AfterClass(alwaysRun = true) + public void cleanUp() { + destroyDataCenter(dataCenter); } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java index 2299a0c..b71cd8d 100644 --- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java +++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java @@ -16,20 +16,24 @@ */ package org.jclouds.profitbricks.features; -import com.google.common.collect.Iterables; -import java.util.List; -import org.jclouds.profitbricks.BaseProfitBricksLiveTest; -import org.jclouds.profitbricks.domain.Image; import static org.testng.Assert.assertEquals; + import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; + +import java.util.List; + +import org.jclouds.profitbricks.BaseProfitBricksLiveTest; +import org.jclouds.profitbricks.domain.Image; import org.testng.annotations.Test; -@Test(groups = "live", testName = "ImageApiLiveTest", singleThreaded = true) +import com.google.common.collect.Iterables; + +@Test(groups = "live", testName = "ImageApiLiveTest") public class ImageApiLiveTest extends BaseProfitBricksLiveTest { - private String imageId; + private Image image; @Test public void testGetAllImages() { @@ -37,22 +41,22 @@ public class ImageApiLiveTest extends BaseProfitBricksLiveTest { assertNotNull(images); assertFalse(images.isEmpty(), "No images found."); - imageId = Iterables.getFirst(images, null).id(); + + image = Iterables.getFirst(images, null); + assertNotNull(image); } @Test(dependsOnMethods = "testGetAllImages") public void testGetImage() { - Image image = api.imageApi().getImage(imageId); + Image fetchedImage = api.imageApi().getImage(image.id()); - assertNotNull(image); - assertEquals(image.id(), imageId); + assertNotNull(fetchedImage); + assertEquals(fetchedImage, image); } @Test public void testGetNonExistingImage() { String id = "random-non-existing-id"; - Image image = api.imageApi().getImage(id); - - assertNull(image, "Should've just returned null"); + assertNull(api.imageApi().getImage(id), "Should've just returned null"); } }
