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:15 UTC

[1/2] jclouds-labs git commit: wip

Repository: jclouds-labs
Updated Branches:
  refs/heads/fix/AzureTemplateBuilderLiveTest 5b832bfc6 -> 4045789ef


wip


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/716ab744
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/716ab744
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/716ab744

Branch: refs/heads/fix/AzureTemplateBuilderLiveTest
Commit: 716ab744f112e8f652f2c300e1ce5eea3df83a22
Parents: 5b832bf
Author: Ignasi Barrera <na...@apache.org>
Authored: Wed Oct 5 17:10:59 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Oct 5 17:10:59 2016 +0200

----------------------------------------------------------------------
 .../arm/AzureComputeProviderMetadata.java       |  4 +-
 .../arm/compute/functions/VMImageToImage.java   |  3 +
 .../arm/filters/ApiVersionFilter.java           | 12 +--
 .../arm/functions/CleanupResources.java         |  3 +-
 .../azurecompute/arm/util/GetEnumValue.java     |  1 -
 .../compute/AzureComputeServiceLiveTest.java    | 87 +++++++++-----------
 6 files changed, 49 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/716ab744/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 5224410..ef15313 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
@@ -94,9 +94,9 @@ public class AzureComputeProviderMetadata extends BaseProviderMetadata {
       properties.put(DEFAULT_DATADISKSIZE, "100");
       properties.put(IMAGE_PUBLISHERS, "Canonical,RedHat");
       // Default credentials for all images
-      properties.put(TEMPLATE, "osFamily=UBUNTU,os64Bit=true,osVersionMatches=16.04.0-LTS");
       properties.put(IMAGE_LOGIN_USER, "jclouds:Password12345!");
-      properties.put(IMAGE_AUTHENTICATE_SUDO, "true");      
+      properties.put(IMAGE_AUTHENTICATE_SUDO, "true");
+      properties.put(TEMPLATE, "imageNameMatches=UbuntuServer,osVersionMatches=1[45]\\.[01][04]\\.[0-9]-LTS");
       properties.put(TIMEOUT_NODE_TERMINATED, 60 * 10 * 1000);
       // Api versions used in each API
       properties.put(API_VERSION_PREFIX + DeploymentApi.class.getSimpleName(), "2016-02-01");

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/716ab744/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 51ea075..1d2a49d 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
@@ -47,6 +47,7 @@ public class VMImageToImage implements Function<VMImage, Image> {
    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 RHEL = "RHEL";
 
    private final Supplier<Set<? extends org.jclouds.domain.Location>> locations;
 
@@ -150,6 +151,8 @@ public class VMImageToImage implements Function<VMImage, Image> {
                family = OsFamily.WINDOWS;
             } else if (label.contains(ORACLE_lINUX)) {
                family = OsFamily.OEL;
+            } else if (label.contains(RHEL)) {
+               family = OsFamily.RHEL;
             }
 
             String sku = image.sku();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/716ab744/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java
index f03950b..904c2e8 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java
@@ -58,18 +58,19 @@ public class ApiVersionFilter implements HttpRequestFilter {
       checkArgument(request instanceof GeneratedHttpRequest,
             "This filter can only be applied to GeneratedHttpRequest objects");
       GeneratedHttpRequest generatedRequest = (GeneratedHttpRequest) request;
-      
+
       // Look if there is a custom api version for the current method
       String commandName = config.getCommandName(generatedRequest.getInvocation());
       String customApiVersion = versions.get(commandName);
-      
+
       if (customApiVersion == null) {
-         // No custom config for the specific method. Let's look for custom config for the class
+         // No custom config for the specific method. Let's look for custom
+         // config for the class
          Invokable<?, ?> invoked = generatedRequest.getInvocation().getInvokable();
          String className = invoked.getOwnerType().getRawType().getSimpleName();
          customApiVersion = versions.get(className);
       }
-      
+
       if (customApiVersion != null) {
          return request.toBuilder().replaceQueryParam("api-version", customApiVersion).build();
       }
@@ -77,8 +78,7 @@ public class ApiVersionFilter implements HttpRequestFilter {
       return request;
    }
 
-   private static final Map<String, String> versions(
-         Function<Predicate<String>, Map<String, String>> filterStringsBoundByName) {
+   private static Map<String, String> versions(Function<Predicate<String>, Map<String, String>> filterStringsBoundByName) {
       Map<String, String> stringBoundWithApiVersionPrefix = filterStringsBoundByName
             .apply(startsWith(API_VERSION_PREFIX));
       return transformKeys(stringBoundWithApiVersionPrefix, new Function<String, String>() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/716ab744/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
index e035ba6..f44c761 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
@@ -16,8 +16,6 @@
  */
 package  org.jclouds.azurecompute.arm.functions;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
-
 import java.net.URI;
 import java.util.List;
 import java.util.Map;
@@ -41,6 +39,7 @@ import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 import static com.google.common.base.Preconditions.checkNotNull;

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/716ab744/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
index 4a61613..f42bad3 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
@@ -20,7 +20,6 @@ import java.util.EnumSet;
 
 public class GetEnumValue {
 
-   @SuppressWarnings("unchecked")
    public static <T extends Enum<T>> Enum<T> fromValueOrDefault(String text, Enum<T> defaultValue) {
       if (text != null) {
          EnumSet<T> elements = EnumSet.allOf(defaultValue.getDeclaringClass());

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/716ab744/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 81edddb..9caea43 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
@@ -16,49 +16,37 @@
  */
 package org.jclouds.azurecompute.arm.compute;
 
-import java.util.Map;
+import static com.google.common.base.Preconditions.checkNotNull;
+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.location.reference.LocationConstants.PROPERTY_REGIONS;
+
 import java.util.Properties;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
 import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
 import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
-import org.jclouds.compute.RunScriptOnNodesException;
-import org.jclouds.compute.domain.ExecResponse;
 import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.OperatingSystem;
-import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
-import org.jclouds.compute.predicates.NodePredicates;
-import org.jclouds.domain.LoginCredentials;
 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;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
 
-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.TEMPLATE;
-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;
-
 /**
  * Live tests for the {@link org.jclouds.compute.ComputeService} integration.
  */
 @Test(groups = "live", singleThreaded = true, testName = "AzureComputeServiceLiveTest")
 public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
-   protected int nonBlockDurationSeconds = 30;
 
    public AzureComputeServiceLiveTest() {
       provider = "azurecompute-arm";
@@ -78,22 +66,20 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
 
    @Override
    protected ProviderMetadata createProviderMetadata() {
-      AzureComputeProviderMetadata pm = AzureComputeProviderMetadata.builder().build();
-      return pm;
+      return AzureComputeProviderMetadata.builder().build();
    }
 
    @Override
    protected Properties setupProperties() {
       Properties properties = super.setupProperties();
-      long scriptTimeout = TimeUnit.MILLISECONDS.convert(60, TimeUnit.MINUTES);
-      properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, scriptTimeout + "");
-      properties.setProperty(TIMEOUT_NODE_RUNNING, scriptTimeout + "");
-      properties.setProperty(TIMEOUT_PORT_OPEN, scriptTimeout + "");
-      properties.setProperty(TIMEOUT_NODE_TERMINATED, scriptTimeout + "");
-      properties.setProperty(TIMEOUT_NODE_SUSPENDED, scriptTimeout + "");
-      properties.put(RESOURCE_GROUP_NAME, "j5s");
-      properties.put(TEMPLATE, "osFamily=UBUNTU,os64Bit=true,osVersionMatches=16.04.0-LTS,locationId=northeurope");
-      properties.put(IMAGE_PUBLISHERS, "Canonical");
+      String defaultTimeout = String.valueOf(TimeUnit.MILLISECONDS.convert(60, TimeUnit.MINUTES));
+      properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, defaultTimeout);
+      properties.setProperty(TIMEOUT_NODE_RUNNING, defaultTimeout);
+      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");
 
       AzureLiveTestUtils.defaultProperties(properties);
       checkNotNull(setIfTestSystemPropertyPresent(properties, "oauth.endpoint"), "test.oauth.endpoint");
@@ -102,24 +88,25 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
    }
 
    @Override
-   protected Template refreshTemplate() {
-      return this.template = addRunScriptToTemplate(this.buildTemplate(this.client.templateBuilder()));
-   }
-
-   @Override
-   protected Template addRunScriptToTemplate(Template template) {
-      template.getOptions().runScript(Statements.newStatementList(new Statement[]{AdminAccess.standard(), Statements.exec("sleep 50"), InstallJDK.fromOpenJDK()}));
-      return template;
-   }
-
-   @Override
-   @Test( enabled = false)
-   protected void weCanCancelTasks(NodeMetadata node) throws InterruptedException, ExecutionException {
-      return;
+   protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
+      // User metadata not yet supported
    }
 
    @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"));
+   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"));
+//   }
 }


[2/2] jclouds-labs git commit: AzureComputeServiceLiveTest passing

Posted by na...@apache.org.
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);
    }