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 <[email protected]> Authored: Tue Oct 11 01:38:56 2016 +0200 Committer: Ignasi Barrera <[email protected]> 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); }
