You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/10/10 23:39:16 UTC
[2/2] jclouds-labs git commit: AzureComputeServiceLiveTest passing
AzureComputeServiceLiveTest passing
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/4045789e
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/4045789e
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/4045789e
Branch: refs/heads/fix/AzureTemplateBuilderLiveTest
Commit: 4045789efc3541f18884c0469454f4efb9474e9a
Parents: 716ab74
Author: Ignasi Barrera <na...@apache.org>
Authored: Tue Oct 11 01:38:56 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Oct 11 01:38:56 2016 +0200
----------------------------------------------------------------------
.../arm/AzureComputeProviderMetadata.java | 2 +-
.../arm/compute/AzureComputeServiceAdapter.java | 31 ++++----
.../AzureComputeServiceContextModule.java | 30 ++++++++
.../arm/compute/functions/VMImageToImage.java | 13 ++--
.../functions/VirtualMachineToNodeMetadata.java | 77 ++++++++++++++------
.../arm/domain/VirtualMachineInstance.java | 49 ++++++++++++-
.../arm/domain/VirtualMachineProperties.java | 1 +
.../compute/AzureComputeServiceLiveTest.java | 43 +++++++----
.../arm/features/VirtualMachineApiLiveTest.java | 47 ++++--------
9 files changed, 194 insertions(+), 99 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
index ef15313..86f1420 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java
@@ -116,7 +116,7 @@ public class AzureComputeProviderMetadata extends BaseProviderMetadata {
properties.put(API_VERSION_PREFIX + "GetVirtualMachine", "2016-03-30");
properties.put(API_VERSION_PREFIX + "GetVirtualMachineInstance", "2016-03-30");
properties.put(API_VERSION_PREFIX + "CreateVirtualMachine", "2016-03-30");
- properties.put(API_VERSION_PREFIX + "ListVirtualMachines", "2016-06-01");
+ properties.put(API_VERSION_PREFIX + "ListVirtualMachines", "2015-06-15");
properties.put(API_VERSION_PREFIX + "DeleteVirtualMachine", "2016-03-30");
return properties;
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
index b50e5f0..6e3e3bb 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
@@ -16,6 +16,12 @@
*/
package org.jclouds.azurecompute.arm.compute;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Iterables.contains;
+import static com.google.common.collect.Iterables.filter;
+import static org.jclouds.compute.config.ComputeServiceProperties.IMAGE_LOGIN_USER;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+
import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -81,13 +87,6 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.Iterables.contains;
-import static com.google.common.collect.Iterables.filter;
-import static org.jclouds.compute.config.ComputeServiceProperties.IMAGE_LOGIN_USER;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
-import static org.jclouds.util.Predicates2.retry;
-
/**
* Defines the connection between the {@link AzureComputeApi} implementation and the jclouds
* {@link org.jclouds.compute.ComputeService}.
@@ -99,20 +98,21 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
private Logger logger = Logger.NULL;
- private String azureGroup;
+ private final String azureGroup;
private final CleanupResources cleanupResources;
private final AzureComputeApi api;
private final AzureComputeConstants azureComputeConstants;
private final Supplier<Set<String>> regionIds;
private final Predicate<String> nodeRunningPredicate;
+ private final Predicate<String> publicIpAvailable;
@Inject
AzureComputeServiceAdapter(final AzureComputeApi api, final AzureComputeConstants azureComputeConstants,
CleanupResources cleanupResources, @Region Supplier<Set<String>> regionIds,
- @Named(TIMEOUT_NODE_RUNNING) Predicate<String> nodeRunningPredicate) {
+ @Named(TIMEOUT_NODE_RUNNING) Predicate<String> nodeRunningPredicate,
+ @Named("PublicIpAvailable") Predicate<String> publicIpAvailable) {
this.api = api;
this.azureComputeConstants = azureComputeConstants;
- // TODO remove this constant, use `group`
this.azureGroup = azureComputeConstants.azureResourceGroup();
logger.debug("AzureComputeServiceAdapter set azuregroup to: " + azureGroup);
@@ -120,6 +120,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
this.cleanupResources = cleanupResources;
this.regionIds = regionIds;
this.nodeRunningPredicate = nodeRunningPredicate;
+ this.publicIpAvailable = publicIpAvailable;
}
@Override
@@ -382,11 +383,11 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
String publicIpAddressName = "public-address-" + name;
PublicIPAddress ip = ipApi.createOrUpdate(publicIpAddressName, locationName, ImmutableMap.of("jclouds", name), properties);
- retry(new Predicate<String>() {
- @Override public boolean apply(String name) {
- return api.getPublicIPAddressApi(azureGroup).get(name).properties().provisioningState().equals("Succeeded");
- }
- }, 10 * 1000).apply(publicIpAddressName);
+ publicIpAvailable.apply(publicIpAddressName);
+ // Refresh after last polling
+ ip = api.getPublicIPAddressApi(azureGroup).get(publicIpAddressName);
+ checkState(ip.properties().provisioningState().equals("Succeeded"),
+ "Public IP was not provisioned in the configured timeout");
final NetworkInterfaceCardProperties networkInterfaceCardProperties =
NetworkInterfaceCardProperties.builder()
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
index 896b880..7af1730 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java
@@ -34,6 +34,7 @@ import org.jclouds.azurecompute.arm.compute.functions.VirtualMachineToNodeMetada
import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions;
import org.jclouds.azurecompute.arm.compute.strategy.CreateResourceGroupThenCreateNodes;
import org.jclouds.azurecompute.arm.domain.Location;
+import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
import org.jclouds.azurecompute.arm.domain.ResourceDefinition;
import org.jclouds.azurecompute.arm.domain.VMHardware;
import org.jclouds.azurecompute.arm.domain.VMImage;
@@ -232,6 +233,15 @@ public class AzureComputeServiceContextModule
return retry(new VirtualMachineInStatePredicate(api, azureGroup, ProvisioningState.DELETED), timeouts.nodeTerminated,
pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod);
}
+
+ @Provides
+ @Named("PublicIpAvailable")
+ protected Predicate<String> providePublicIpAvailablePredicate(final AzureComputeApi api, final AzureComputeServiceContextModule.AzureComputeConstants azureComputeConstants,
+ Timeouts timeouts, PollPeriod pollPeriod) {
+ String azureGroup = azureComputeConstants.azureResourceGroup();
+ return retry(new PublicIpAvailablePredicate(api, azureGroup), azureComputeConstants.operationTimeout(),
+ azureComputeConstants.operationPollInitialPeriod(), azureComputeConstants.operationPollMaxPeriod());
+ }
@VisibleForTesting
static class ActionDonePredicate implements Predicate<URI> {
@@ -290,5 +300,25 @@ public class AzureComputeServiceContextModule
return state == provisioningState;
}
}
+
+ @VisibleForTesting
+ static class PublicIpAvailablePredicate implements Predicate<String> {
+
+ private final AzureComputeApi api;
+ private final String azureGroup;
+
+ public PublicIpAvailablePredicate(AzureComputeApi api, String azureGroup) {
+ this.api = checkNotNull(api, "api must not be null");
+ this.azureGroup = checkNotNull(azureGroup, "azuregroup must not be null");
+ }
+
+ @Override
+ public boolean apply(String name) {
+ checkNotNull(name, "name cannot be null");
+ PublicIPAddress publicIp = api.getPublicIPAddressApi(azureGroup).get(name);
+ if (publicIp == null) return false;
+ return publicIp.properties().provisioningState().equalsIgnoreCase("Succeeded");
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java
index 1d2a49d..5c10654 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VMImageToImage.java
@@ -37,7 +37,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
public class VMImageToImage implements Function<VMImage, Image> {
- private static final String UNRECOGNIZED = "UNRECOGNIZED";
private static final String UBUNTU = "Ubuntu";
private static final String WINDOWS = "Windows";
private static final String OPENLOGIC = "openLogic";
@@ -45,8 +44,8 @@ public class VMImageToImage implements Function<VMImage, Image> {
private static final String COREOS = "CoreOS";
private static final String OPENSUSE = "openSUSE";
private static final String SUSE = "SUSE";
- private static final String SQL_SERVER = "SQL Server";
- private static final String ORACLE_lINUX = "Oracle Linux";
+ private static final String SLES = "SLES";
+ private static final String ORACLE_lINUX = "Oracle-Linux";
private static final String RHEL = "RHEL";
private final Supplier<Set<? extends org.jclouds.domain.Location>> locations;
@@ -139,11 +138,11 @@ public class VMImageToImage implements Function<VMImage, Image> {
final String label = image.offer();
OsFamily family = OsFamily.UNRECOGNIZED;
- if (label.contains(CENTOS)) {
+ if (label.contains(CENTOS) || label.contains(OPENLOGIC)) {
family = OsFamily.CENTOS;
- } else if (label.contains(OPENLOGIC)) {
- family = OsFamily.CENTOS;
- } else if (label.contains(SUSE)) {
+ } else if (label.contains(COREOS)) {
+ family = OsFamily.COREOS;
+ } else if (label.contains(SUSE) || label.contains(SLES) || label.contains(OPENSUSE)) {
family = OsFamily.SUSE;
} else if (label.contains(UBUNTU)) {
family = OsFamily.UBUNTU;
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
index 8075f02..475d584 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java
@@ -25,12 +25,17 @@ import javax.inject.Inject;
import javax.inject.Named;
import org.jclouds.azurecompute.arm.AzureComputeApi;
+import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule.AzureComputeConstants;
import org.jclouds.azurecompute.arm.domain.IdReference;
import org.jclouds.azurecompute.arm.domain.ImageReference;
import org.jclouds.azurecompute.arm.domain.IpConfiguration;
import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus.PowerState;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties.ProvisioningState;
import org.jclouds.collect.Memoized;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
@@ -43,7 +48,10 @@ import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.Logger;
+import autovalue.shaded.com.google.common.common.base.Joiner;
+
import com.google.common.base.Function;
+import com.google.common.base.Functions;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
@@ -54,6 +62,7 @@ import com.google.common.collect.Lists;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.transform;
public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, NodeMetadata> {
@@ -67,19 +76,30 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, N
//
// To get details about the resource(s) deployed via template, one needs to query the
// various resources after the deployment has "SUCCEEDED".
- private static final Map<VirtualMachineProperties.ProvisioningState, NodeMetadata.Status> STATUS_TO_NODESTATUS =
- ImmutableMap.<VirtualMachineProperties.ProvisioningState, NodeMetadata.Status>builder().
- put(VirtualMachineProperties.ProvisioningState.ACCEPTED, NodeMetadata.Status.PENDING).
- put(VirtualMachineProperties.ProvisioningState.READY, NodeMetadata.Status.PENDING).
- put(VirtualMachineProperties.ProvisioningState.CREATING, NodeMetadata.Status.PENDING).
- put(VirtualMachineProperties.ProvisioningState.RUNNING, NodeMetadata.Status.PENDING).
- put(VirtualMachineProperties.ProvisioningState.CANCELED, NodeMetadata.Status.TERMINATED).
- put(VirtualMachineProperties.ProvisioningState.FAILED, NodeMetadata.Status.ERROR).
- put(VirtualMachineProperties.ProvisioningState.DELETED, NodeMetadata.Status.TERMINATED).
- put(VirtualMachineProperties.ProvisioningState.SUCCEEDED, NodeMetadata.Status.RUNNING).
- put(VirtualMachineProperties.ProvisioningState.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED).
- build();
-
+ private static final Function<VirtualMachineProperties.ProvisioningState, NodeMetadata.Status> PROVISIONINGSTATE_TO_NODESTATUS = Functions
+ .forMap(
+ ImmutableMap.<VirtualMachineProperties.ProvisioningState, NodeMetadata.Status> builder()
+ .put(VirtualMachineProperties.ProvisioningState.ACCEPTED, NodeMetadata.Status.PENDING)
+ .put(VirtualMachineProperties.ProvisioningState.READY, NodeMetadata.Status.PENDING)
+ .put(VirtualMachineProperties.ProvisioningState.CREATING, NodeMetadata.Status.PENDING)
+ .put(VirtualMachineProperties.ProvisioningState.RUNNING, NodeMetadata.Status.PENDING)
+ .put(VirtualMachineProperties.ProvisioningState.UPDATING, NodeMetadata.Status.PENDING)
+ .put(VirtualMachineProperties.ProvisioningState.SUCCEEDED, NodeMetadata.Status.RUNNING)
+ .put(VirtualMachineProperties.ProvisioningState.DELETED, NodeMetadata.Status.TERMINATED)
+ .put(VirtualMachineProperties.ProvisioningState.CANCELED, NodeMetadata.Status.TERMINATED)
+ .put(VirtualMachineProperties.ProvisioningState.FAILED, NodeMetadata.Status.ERROR)
+ .put(VirtualMachineProperties.ProvisioningState.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED)
+ .build(), NodeMetadata.Status.UNRECOGNIZED);
+
+ private static final Function<VirtualMachineStatus.PowerState, NodeMetadata.Status> POWERSTATE_TO_NODESTATUS = Functions
+ .forMap(
+ ImmutableMap.<PowerState, NodeMetadata.Status> builder()
+ .put(PowerState.RUNNING, NodeMetadata.Status.RUNNING)
+ .put(PowerState.STOPPED, NodeMetadata.Status.SUSPENDED)
+ .put(PowerState.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED).build(),
+ NodeMetadata.Status.UNRECOGNIZED);
+
+ private final String azureGroup;
private final AzureComputeApi api;
private final GroupNamingConvention nodeNamingConvention;
private final Supplier<Map<String, ? extends Image>> images;
@@ -88,18 +108,17 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, N
private final Map<String, Credentials> credentialStore;
@Inject
- VirtualMachineToNodeMetadata(
- AzureComputeApi api,
- GroupNamingConvention.Factory namingConvention,
- Supplier<Map<String, ? extends Image>> images,
- Supplier<Map<String, ? extends Hardware>> hardwares,
- @Memoized Supplier<Set<? extends Location>> locations, Map<String, Credentials> credentialStore) {
+ VirtualMachineToNodeMetadata(AzureComputeApi api, GroupNamingConvention.Factory namingConvention,
+ Supplier<Map<String, ? extends Image>> images, Supplier<Map<String, ? extends Hardware>> hardwares,
+ @Memoized Supplier<Set<? extends Location>> locations, Map<String, Credentials> credentialStore,
+ final AzureComputeConstants azureComputeConstants) {
this.api = api;
this.nodeNamingConvention = namingConvention.createWithoutPrefix();
this.images = checkNotNull(images, "images cannot be null");
this.locations = checkNotNull(locations, "locations cannot be null");
this.hardwares = checkNotNull(hardwares, "hardwares cannot be null");
this.credentialStore = credentialStore;
+ this.azureGroup = azureComputeConstants.azureResourceGroup();
}
@Override
public NodeMetadata apply(VirtualMachine virtualMachine) {
@@ -110,7 +129,21 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, N
builder.hostname(virtualMachine.name());
String group = this.nodeNamingConvention.extractGroup(virtualMachine.name());
builder.group(group);
- builder.status(getStatus(virtualMachine.properties().provisioningState()));
+
+ ProvisioningState provisioningState = virtualMachine.properties().provisioningState();
+ if (ProvisioningState.SUCCEEDED.equals(provisioningState)) {
+ // If the provisioning succeeded, we need to query the *real* status of the VM
+ VirtualMachineInstance instanceDetails = api.getVirtualMachineApi(azureGroup).getInstanceDetails(virtualMachine.name());
+ builder.status(POWERSTATE_TO_NODESTATUS.apply(instanceDetails.powerState()));
+ builder.backendStatus(Joiner.on(',').join(transform(instanceDetails.statuses(), new Function<VirtualMachineStatus, String>() {
+ @Override public String apply(VirtualMachineStatus input) {
+ return input.code();
+ }
+ })));
+ } else {
+ builder.status(PROVISIONINGSTATE_TO_NODESTATUS.apply(provisioningState));
+ builder.backendStatus(provisioningState.name());
+ }
Credentials credentials = credentialStore.get("node#" + virtualMachine.name());
builder.credentials(LoginCredentials.fromCredentials(credentials));
@@ -177,10 +210,6 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, N
return publicIpAddresses;
}
- private NodeMetadata.Status getStatus(VirtualMachineProperties.ProvisioningState provisioningState) {
- return STATUS_TO_NODESTATUS.get(provisioningState);
- }
-
protected Location getLocation(final String locationName) {
return find(locations.get(), new Predicate<Location>() {
@Override
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
index b0ed6d5..4e4a90b 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineInstance.java
@@ -16,13 +16,23 @@
*/
package org.jclouds.azurecompute.arm.domain;
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableList;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.getFirst;
+import static com.google.common.collect.Iterables.transform;
+import static org.jclouds.util.Predicates2.startsWith;
+
+import java.util.Date;
import java.util.List;
+
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus.PowerState;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties.ProvisioningState;
+import org.jclouds.azurecompute.arm.util.GetEnumValue;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.json.SerializedNames;
-import java.util.Date;
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
/**
* A virtual machine instance view that is valid for your subscription.
@@ -32,6 +42,19 @@ public abstract class VirtualMachineInstance {
@AutoValue
public abstract static class VirtualMachineStatus {
+
+ public static final String PROVISIONING_STATE_PREFIX = "ProvisioningState/";
+ public static final String POWER_STATE_PREFIX = "PowerState/";
+
+ public enum PowerState {
+ RUNNING,
+ STOPPED,
+ UNRECOGNIZED;
+
+ public static PowerState fromValue(final String text) {
+ return (PowerState) GetEnumValue.fromValueOrDefault(text, PowerState.UNRECOGNIZED);
+ }
+ }
@Nullable
public abstract String code();
@@ -61,6 +84,26 @@ public abstract class VirtualMachineInstance {
@Nullable
public abstract List<VirtualMachineStatus> statuses();
+
+ public ProvisioningState provisioningState() {
+ return ProvisioningState.fromValue(firstStatus(VirtualMachineStatus.PROVISIONING_STATE_PREFIX));
+ }
+
+ public PowerState powerState() {
+ return PowerState.fromValue(firstStatus(VirtualMachineStatus.POWER_STATE_PREFIX));
+ }
+
+ private String firstStatus(final String type) {
+ return getFirst(transform(filter(transform(statuses(), new Function<VirtualMachineStatus, String>() {
+ @Override public String apply(VirtualMachineStatus input) {
+ return input.code();
+ }
+ }), startsWith(type)), new Function<String, String>() {
+ @Override public String apply(String input) {
+ return input.substring(type.length());
+ }
+ }), null);
+ }
@SerializedNames({"platformUpdateDomain", "platformFaultDomain", "statuses"})
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
index e59f7c1..eb9520a 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VirtualMachineProperties.java
@@ -37,6 +37,7 @@ public abstract class VirtualMachineProperties {
DELETED,
SUCCEEDED,
RUNNING,
+ UPDATING,
UNRECOGNIZED;
public static ProvisioningState fromValue(final String text) {
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
index 9caea43..66a6e0e 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
@@ -17,12 +17,14 @@
package org.jclouds.azurecompute.arm.compute;
import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.IMAGE_PUBLISHERS;
import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.RESOURCE_GROUP_NAME;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_PORT_OPEN;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
+import static org.jclouds.compute.options.TemplateOptions.Builder.authorizePublicKey;
import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS;
import java.util.Properties;
@@ -31,10 +33,16 @@ import java.util.concurrent.TimeUnit;
import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
import org.jclouds.logging.config.LoggingModule;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.providers.ProviderMetadata;
+import org.jclouds.scriptbuilder.domain.Statement;
+import org.jclouds.scriptbuilder.domain.Statements;
+import org.jclouds.scriptbuilder.statements.java.InstallJDK;
+import org.jclouds.scriptbuilder.statements.login.AdminAccess;
import org.jclouds.sshj.config.SshjSshClientModule;
import org.testng.annotations.Test;
@@ -51,7 +59,7 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
public AzureComputeServiceLiveTest() {
provider = "azurecompute-arm";
nonBlockDurationSeconds = 300;
- group = "az-u";
+ group = "az-r";
}
@Override
@@ -78,8 +86,9 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
properties.setProperty(TIMEOUT_PORT_OPEN, defaultTimeout);
properties.setProperty(TIMEOUT_NODE_TERMINATED, defaultTimeout);
properties.setProperty(TIMEOUT_NODE_SUSPENDED, defaultTimeout);
- properties.put(RESOURCE_GROUP_NAME, "a2");
- properties.put(PROPERTY_REGIONS, "northeurope");
+ properties.put(RESOURCE_GROUP_NAME, "jc");
+ properties.put(PROPERTY_REGIONS, "eastus");
+ properties.put(IMAGE_PUBLISHERS, "Canonical");
AzureLiveTestUtils.defaultProperties(properties);
checkNotNull(setIfTestSystemPropertyPresent(properties, "oauth.endpoint"), "test.oauth.endpoint");
@@ -88,25 +97,27 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
}
@Override
+ protected TemplateBuilder templateBuilder() {
+ return super.templateBuilder().options(
+ authorizePublicKey(keyPair.get("public")).overrideLoginPrivateKey(keyPair.get("private")));
+ }
+
+ @Override
protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
// User metadata not yet supported
}
@Override
+ protected Template addRunScriptToTemplate(Template template) {
+ template.getOptions().runScript(
+ Statements.newStatementList(new Statement[] { AdminAccess.standard(), Statements.exec("sleep 50"),
+ InstallJDK.fromOpenJDK() }));
+ return template;
+ }
+
+ @Override
protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
// Tags not yet supported
}
-
-
-
-// @Override
-// protected Template addRunScriptToTemplate(Template template) {
-// template.getOptions().runScript(Statements.newStatementList(new Statement[]{AdminAccess.standard(), Statements.exec("sleep 50"), InstallJDK.fromOpenJDK()}));
-// return template;
-// }
-
-// @Override
-// protected Map<? extends NodeMetadata, ExecResponse> runScriptWithCreds(String group, OperatingSystem os, LoginCredentials creds) throws RunScriptOnNodesException {
-// return this.client.runScriptOnNodesMatching(NodePredicates.runningInGroup(group), Statements.newStatementList(Statements.exec("sleep 50"), InstallJDK.fromOpenJDK()), org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials(creds).nameTask("runScriptWithCreds"));
-// }
+
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4045789e/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java
index 087c6ef..9cc6089 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/VirtualMachineApiLiveTest.java
@@ -16,6 +16,10 @@
*/
package org.jclouds.azurecompute.arm.features;
+import static org.jclouds.util.Predicates2.retry;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
@@ -41,6 +45,7 @@ import org.jclouds.azurecompute.arm.domain.Subnet;
import org.jclouds.azurecompute.arm.domain.VHD;
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus.PowerState;
import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
import org.testng.Assert;
@@ -48,17 +53,11 @@ import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
-import com.google.common.base.Function;
import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.gson.internal.LinkedTreeMap;
-import static org.jclouds.util.Predicates2.retry;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
@Test(groups = "live", testName = "VirtualMachineApiLiveTest")
public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
@@ -146,21 +145,21 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
@Test(dependsOnMethods = "testStart")
public void testStop() {
api().stop(vmName);
- assertTrue(stateReached("PowerState", "VM stopped"), "stop operation did not complete in the configured timeout");
+ assertTrue(stateReached(PowerState.STOPPED), "stop operation did not complete in the configured timeout");
}
@Test(dependsOnMethods = "testGet")
public void testStart() {
api().start(vmName);
- assertTrue(stateReached("PowerState", "VM running"), "start operation did not complete in the configured timeout");
+ assertTrue(stateReached(PowerState.RUNNING), "start operation did not complete in the configured timeout");
}
@Test(dependsOnMethods = "testStop")
public void testRestart() {
api().start(vmName);
- assertTrue(stateReached("PowerState", "VM running"), "start operation did not complete in the configured timeout");
+ assertTrue(stateReached(PowerState.RUNNING), "start operation did not complete in the configured timeout");
api().restart(vmName);
- assertTrue(stateReached("PowerState", "VM running"), "restart operation did not complete in the configured timeout");
+ assertTrue(stateReached(PowerState.RUNNING), "restart operation did not complete in the configured timeout");
}
@Test(dependsOnMethods = "testCreate")
@@ -180,7 +179,7 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
@Test(dependsOnMethods = "testRestart")
public void testGeneralize() throws IllegalStateException {
api().stop(vmName);
- assertTrue(stateReached("PowerState", "VM stopped"), "restart operation did not complete in the configured timeout");
+ assertTrue(stateReached(PowerState.STOPPED), "restart operation did not complete in the configured timeout");
api().generalize(vmName);
}
@@ -261,33 +260,15 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
return api.getNetworkInterfaceCardApi(resourceGroupName).createOrUpdate(networkInterfaceCardName, locationName, networkInterfaceCardProperties, tags);
}
- private boolean waitForState(String name, final String state, final String displayStatus) {
- return FluentIterable.from(api().getInstanceDetails(name).statuses())
- .filter(new Predicate<VirtualMachineInstance.VirtualMachineStatus>() {
- @Override
- public boolean apply(VirtualMachineInstance.VirtualMachineStatus input) {
- return input.code().substring(0, 10).equals(state);
- }
- })
- .transform(new Function<VirtualMachineInstance.VirtualMachineStatus, String>() {
- @Override
- public String apply(VirtualMachineInstance.VirtualMachineStatus input) {
- return input.displayStatus();
- }
- })
- .anyMatch(new Predicate<String>() {
- @Override
- public boolean apply(String input) {
- return input.equals(displayStatus);
- }
- });
+ private boolean waitForState(String name, final PowerState state) {
+ return api().getInstanceDetails(name).powerState().equals(state);
}
- private boolean stateReached(final String state, final String displayStatus) {
+ private boolean stateReached(final PowerState state) {
return retry(new Predicate<String>() {
@Override
public boolean apply(String name) {
- return waitForState(name, state, displayStatus);
+ return waitForState(name, state);
}
}, 60 * 4 * 1000).apply(vmName);
}