You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2016/01/20 23:37:04 UTC

[2/3] jclouds-labs git commit: [JCLOUDS-981, JCLOUDS-982] remove Optional from AzureComputeTemplateOptions

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/main/java/org/jclouds/azurecompute/compute/strategy/impl/AzureAdaptingComputeServiceStrategies.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/strategy/impl/AzureAdaptingComputeServiceStrategies.java b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/strategy/impl/AzureAdaptingComputeServiceStrategies.java
deleted file mode 100644
index c99f3a4..0000000
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/strategy/impl/AzureAdaptingComputeServiceStrategies.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.azurecompute.compute.strategy.impl;
-
-import com.google.common.base.Function;
-import java.util.Map;
-import javax.inject.Inject;
-import org.jclouds.azurecompute.compute.AzureComputeServiceAdapter;
-import org.jclouds.azurecompute.domain.Deployment;
-import org.jclouds.azurecompute.domain.Location;
-import org.jclouds.azurecompute.domain.OSImage;
-import org.jclouds.azurecompute.domain.RoleSize;
-import org.jclouds.compute.ComputeServiceAdapter;
-import org.jclouds.compute.config.ComputeServiceAdapterContextModule.AddDefaultCredentialsToImage;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate;
-import org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies;
-import org.jclouds.domain.Credentials;
-
-public class AzureAdaptingComputeServiceStrategies
-        extends AdaptingComputeServiceStrategies<Deployment, RoleSize, OSImage, Location> {
-
-   private final AzureComputeServiceAdapter client;
-
-   private final Function<Deployment, NodeMetadata> nodeMetadataAdapter;
-
-   @Inject
-   public AzureAdaptingComputeServiceStrategies(
-           final Map<String, Credentials> credentialStore,
-           final PrioritizeCredentialsFromTemplate prioritizeCredentialsFromTemplate,
-           final ComputeServiceAdapter<Deployment, RoleSize, OSImage, Location> client,
-           final Function<Deployment, NodeMetadata> nodeMetadataAdapter,
-           final Function<OSImage, Image> imageAdapter,
-           final AddDefaultCredentialsToImage addDefaultCredentialsToImage) {
-
-      super(credentialStore,
-              prioritizeCredentialsFromTemplate,
-              client,
-              nodeMetadataAdapter,
-              imageAdapter,
-              addDefaultCredentialsToImage);
-
-      this.client = (AzureComputeServiceAdapter) client;
-      this.nodeMetadataAdapter = nodeMetadataAdapter;
-   }
-
-   @Override
-   public NodeMetadata destroyNode(final String id) {
-      final Deployment node = client.internalDestroyNode(id);
-      return node == null
-              ? null
-              : nodeMetadataAdapter.apply(node);
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Deployment.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Deployment.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Deployment.java
index 617d3df..a1db92f 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Deployment.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Deployment.java
@@ -96,6 +96,7 @@ public abstract class Deployment {
       FAILED_STARTING_VM("FailedStartingVM", false),
       UNRESPONSIVE_ROLE("UnresponsiveRole"),
       PROVISIONING("Provisioning"),
+      PROVISIONING_FAILED("ProvisioningFailed", false),
       /**
        * Not parsable into one of the above.
        */

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java
index 86419dc..2cf93ad 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java
@@ -16,18 +16,16 @@
  */
 package org.jclouds.azurecompute.domain;
 
-import static com.google.common.collect.ImmutableList.copyOf;
-
 import java.net.URI;
-import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.rest.annotations.SinceApiVersion;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import org.jclouds.rest.annotations.SinceApiVersion;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * To create a new deployment/role
@@ -106,7 +104,7 @@ public abstract class DeploymentParams {
     */
    public abstract OSImage.Type os();
 
-   public abstract List<ExternalEndpoint> externalEndpoints();
+   public abstract Set<ExternalEndpoint> externalEndpoints();
 
    /**
     * {@link org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkSite#name}
@@ -128,138 +126,49 @@ public abstract class DeploymentParams {
 
    public abstract List<String> subnetNames();
 
-   public Builder toBuilder() {
-      return builder().fromDeploymentParams(this);
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_DeploymentParams.Builder()
+              .externalEndpoints(ImmutableSet.<ExternalEndpoint> of())
+              .subnetNames(ImmutableList.<String> of());
    }
 
-   public static final class Builder {
-
-      private String name;
-
-      private RoleSize.Type size;
-
-      private String username;
-
-      private String password;
-
-      private String sourceImageName;
-
-      private URI mediaLink;
-
-      private OSImage.Type os;
-
-      private List<ExternalEndpoint> externalEndpoints = Lists.newArrayList();
-
-      private String virtualNetworkName;
-
-      private String reservedIPName;
-
-      private List<String> subnetNames = Lists.newArrayList();
-
-      public Builder name(final String name) {
-         this.name = name;
-         return this;
-      }
-
-      public Builder size(final RoleSize.Type size) {
-         this.size = size;
-         return this;
-      }
-
-      public Builder username(final String username) {
-         this.username = username;
-         return this;
-      }
-
-      public Builder password(final String password) {
-         this.password = password;
-         return this;
-      }
+   abstract Builder toBuilder();
 
-      public Builder sourceImageName(final String sourceImageName) {
-         this.sourceImageName = sourceImageName;
-         return this;
-      }
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder name(String name);
+      public abstract Builder size(RoleSize.Type roleSize);
+      public abstract Builder username(String username);
+      public abstract Builder password(String password);
+      public abstract Builder sourceImageName(String sourceImageName);
+      public abstract Builder mediaLink(URI mediaLink);
+      public abstract Builder os(OSImage.Type os);
+      public abstract Builder externalEndpoints(Set<ExternalEndpoint> externalEndpoints);
+      public abstract Builder virtualNetworkName(String virtualNetworkName);
+      public abstract Builder reservedIPName(String reservedIPName);
+      public abstract Builder subnetNames(List<String> subnetNames);
 
-      public Builder mediaLink(final URI mediaLink) {
-         this.mediaLink = mediaLink;
-         return this;
-      }
+      abstract Set<ExternalEndpoint> externalEndpoints();
+      abstract List<String> subnetNames();
 
-      public Builder os(final OSImage.Type os) {
-         this.os = os;
-         return this;
-      }
-
-      public Builder externalEndpoint(final ExternalEndpoint endpoint) {
-         externalEndpoints.add(endpoint);
-         return this;
-      }
-
-      public Builder externalEndpoints(final Collection<ExternalEndpoint> externalEndpoints) {
-         this.externalEndpoints.addAll(externalEndpoints);
-         return this;
-      }
-
-      public Builder virtualNetworkName(final String virtualNetworkName) {
-         this.virtualNetworkName = virtualNetworkName;
-         return this;
-      }
-
-      public Builder reservedIPName(final String reservedIPName) {
-         this.reservedIPName = reservedIPName;
-         return this;
-      }
-
-      public Builder subnetName(final String subnetName) {
-         subnetNames.add(subnetName);
-         return this;
-      }
-
-      public Builder subnetNames(final Collection<String> subnetNames) {
-         this.subnetNames.addAll(subnetNames);
-         return this;
-      }
+      abstract DeploymentParams autoBuild();
 
       public DeploymentParams build() {
-         return DeploymentParams.create(
-                 name,
-                 size,
-                 username,
-                 password,
-                 sourceImageName,
-                 mediaLink,
-                 os,
-                 ImmutableList.copyOf(externalEndpoints),
-                 virtualNetworkName,
-                 reservedIPName,
-                 ImmutableList.copyOf(subnetNames));
-      }
-
-      public Builder fromDeploymentParams(final DeploymentParams deploymentParams) {
-         return name(deploymentParams.name())
-                 .size(deploymentParams.size())
-                 .username(deploymentParams.username())
-                 .password(deploymentParams.password())
-                 .sourceImageName(deploymentParams.sourceImageName())
-                 .mediaLink(deploymentParams.mediaLink())
-                 .os(deploymentParams.os())
-                 .externalEndpoints(deploymentParams.externalEndpoints())
-                 .subnetNames(deploymentParams.subnetNames())
-                 .reservedIPName(reservedIPName);
+         externalEndpoints(externalEndpoints() != null ? ImmutableSet.copyOf(externalEndpoints()) : null);
+         subnetNames(subnetNames() != null ? ImmutableList.copyOf(subnetNames()) : null);
+         return autoBuild();
       }
    }
 
-   private static DeploymentParams create(final String name, final RoleSize.Type size,
-           final String username, final String password, final String sourceImageName,
-           final URI mediaLink, final OSImage.Type os, final List<ExternalEndpoint> externalEndpoints,
-           final String virtualNetworkName, final String reservedIPName, final List<String> subnetNames) {
-
-      return new AutoValue_DeploymentParams(name, size, username, password, sourceImageName, mediaLink, os,
-              copyOf(externalEndpoints), virtualNetworkName, reservedIPName, copyOf(subnetNames));
+   public static DeploymentParams create(String name, RoleSize.Type size, String username,
+                                         String password, String sourceImageName, URI mediaLink,
+                                         OSImage.Type os, Set<ExternalEndpoint> externalEndpoints,
+                                         String virtualNetworkName, String reservedIPName,
+                                         List<String> subnetNames) {
+      return builder().name(name).size(size).username(username).password(password)
+              .sourceImageName(sourceImageName).mediaLink(mediaLink).os(os)
+              .externalEndpoints(externalEndpoints).virtualNetworkName(virtualNetworkName)
+              .reservedIPName(reservedIPName).subnetNames(subnetNames)
+              .build();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/main/java/org/jclouds/azurecompute/features/VirtualMachineApi.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/features/VirtualMachineApi.java b/azurecompute/src/main/java/org/jclouds/azurecompute/features/VirtualMachineApi.java
index 968b406..2285a9d 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/features/VirtualMachineApi.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/features/VirtualMachineApi.java
@@ -90,6 +90,19 @@ public interface VirtualMachineApi {
    @Produces(MediaType.APPLICATION_XML)
    @ResponseParser(ParseRequestIdHeader.class)
    @Payload(value = "<ShutdownRoleOperation xmlns=\"http://schemas.microsoft.com/windowsazure\">"
+           + "<OperationType>ShutdownRoleOperation</OperationType>" +
+           "<PostShutdownAction>{postShutdownAction}</PostShutdownAction></ShutdownRoleOperation>")
+   String shutdown(@PathParam("name") String name, @PayloadParam("postShutdownAction") String postShutdownAction);
+
+   /**
+    * http://msdn.microsoft.com/en-us/library/jj157195
+    */
+   @Named("ShutdownRole")
+   @POST
+   @Path("/roleinstances/{name}/Operations")
+   @Produces(MediaType.APPLICATION_XML)
+   @ResponseParser(ParseRequestIdHeader.class)
+   @Payload(value = "<ShutdownRoleOperation xmlns=\"http://schemas.microsoft.com/windowsazure\">"
            + "<OperationType>ShutdownRoleOperation</OperationType></ShutdownRoleOperation>")
    String shutdown(@PathParam("name") String name);
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/main/java/org/jclouds/azurecompute/options/AzureComputeTemplateOptions.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/options/AzureComputeTemplateOptions.java b/azurecompute/src/main/java/org/jclouds/azurecompute/options/AzureComputeTemplateOptions.java
deleted file mode 100644
index 7ffdd19..0000000
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/options/AzureComputeTemplateOptions.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.azurecompute.options;
-
-import java.util.Map;
-
-import org.jclouds.compute.options.TemplateOptions;
-
-import com.google.common.base.Optional;
-
-/**
- * Contains options supported by the {@link org.jclouds.compute.ComputeService#createNodesInGroup(
- * String, int, org.jclouds.compute.options.TemplateOptions)} operation.
- *
- * <h2>Usage</h2> The recommended way to instantiate a {@link AzureComputeTemplateOptions} object is to statically
- * import {@code AzureComputeTemplateOptions.*} and invoke a static creation method followed by an instance mutator (if
- * needed):
- * <p>
- *
- * <pre>
- * import static org.jclouds.compute.options.AzureComputeTemplateOptions.Builder.*;
- * ComputeService client = // get connection
- * templateBuilder.options(inboundPorts(22, 80, 8080, 443));
- * Set&lt;? extends NodeMetadata&gt; set = client.createNodesInGroup(tag, 2, templateBuilder.build());
- * </pre>
- *
- */
-public class AzureComputeTemplateOptions extends TemplateOptions implements Cloneable {
-
-   private Optional<String> virtualNetworkName = Optional.absent();
-
-   private Optional<String> addressSpaceAddressPrefix = Optional.absent();
-
-   private Optional<String> subnetName = Optional.absent();
-
-   private Optional<String> subnetAddressPrefix = Optional.absent();
-
-   private Optional<String> storageAccountName = Optional.absent();
-
-   private Optional<String> storageAccountType = Optional.absent();
-
-   private Optional<String> networkSecurityGroupName = Optional.absent();
-
-   private Optional<String> reservedIPName = Optional.absent();
-
-   @Override
-   public AzureComputeTemplateOptions clone() {
-      final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-      copyTo(options);
-      return options;
-   }
-
-   @Override
-   public void copyTo(final TemplateOptions to) {
-      super.copyTo(to);
-      if (to instanceof AzureComputeTemplateOptions) {
-         final AzureComputeTemplateOptions eTo = AzureComputeTemplateOptions.class.cast(to);
-         if (virtualNetworkName.isPresent()) {
-            eTo.virtualNetworkName(virtualNetworkName.get());
-         }
-         if (addressSpaceAddressPrefix.isPresent()) {
-            eTo.addressSpaceAddressPrefix(addressSpaceAddressPrefix.get());
-         }
-         if (subnetName.isPresent()) {
-            eTo.subnetName(subnetName.get());
-         }
-         if (networkSecurityGroupName.isPresent()) {
-            eTo.subnetName(networkSecurityGroupName.get());
-         }
-         if (subnetAddressPrefix.isPresent()) {
-            eTo.subnetAddressPrefix(subnetAddressPrefix.get());
-         }
-         if (storageAccountName.isPresent()) {
-            eTo.storageAccountName(storageAccountName.get());
-         }
-         if (storageAccountType.isPresent()) {
-            eTo.storageAccountType(storageAccountType.get());
-         }
-         if (reservedIPName.isPresent()) {
-            eTo.reservedIPName(reservedIPName.get());
-         }
-      }
-   }
-
-   public TemplateOptions virtualNetworkName(final String virtualNetworkName) {
-      this.virtualNetworkName = Optional.of(virtualNetworkName);
-      return this;
-   }
-
-   public TemplateOptions addressSpaceAddressPrefix(final String addressSpaceAddressPrefix) {
-      this.addressSpaceAddressPrefix = Optional.of(addressSpaceAddressPrefix);
-      return this;
-   }
-
-   public TemplateOptions subnetName(final String subnetName) {
-      this.subnetName = Optional.of(subnetName);
-      return this;
-   }
-
-   public TemplateOptions networkSecurityGroupName(final String networkSecurityGroupName) {
-      this.networkSecurityGroupName = Optional.of(networkSecurityGroupName);
-      return this;
-   }
-
-   public TemplateOptions subnetAddressPrefix(final String subnetAddressPrefix) {
-      this.subnetAddressPrefix = Optional.of(subnetAddressPrefix);
-      return this;
-   }
-
-   public TemplateOptions storageAccountName(final String storageAccountName) {
-      this.storageAccountName = Optional.of(storageAccountName);
-      return this;
-   }
-
-   public TemplateOptions storageAccountType(final String storageAccountType) {
-      this.storageAccountType = Optional.of(storageAccountType);
-      return this;
-   }
-
-   public TemplateOptions reservedIPName(final String reservedIPName) {
-      this.reservedIPName = Optional.of(reservedIPName);
-      return this;
-   }
-
-   public Optional<String> getVirtualNetworkName() {
-      return virtualNetworkName;
-   }
-
-   public Optional<String> getAddressSpaceAddressPrefix() {
-      return addressSpaceAddressPrefix;
-   }
-
-   public Optional<String> getSubnetName() {
-      return subnetName;
-   }
-
-   public Optional<String> getSubnetAddressPrefix() {
-      return subnetAddressPrefix;
-   }
-
-   public Optional<String> getStorageAccountName() {
-      return storageAccountName;
-   }
-
-   public Optional<String> getStorageAccountType() {
-      return storageAccountType;
-   }
-
-   public Optional<String> getNetworkSecurityGroupName() {
-      return networkSecurityGroupName;
-   }
-
-   public Optional<String> getReservedIPName() {
-      return reservedIPName;
-   }
-
-   public static class Builder {
-
-      /**
-       * @see #virtualNetworkName
-       */
-      public static AzureComputeTemplateOptions virtualNetworkName(final String virtualNetworkName) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.virtualNetworkName(virtualNetworkName));
-      }
-
-      /**
-       * @see #addressSpaceAddressPrefix
-       */
-      public static AzureComputeTemplateOptions addressSpaceAddressPrefix(final String addressSpaceAddressPrefix) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.addressSpaceAddressPrefix(addressSpaceAddressPrefix));
-      }
-
-      /**
-       * @see #subnetName
-       */
-      public static AzureComputeTemplateOptions subnetName(final String subnetName) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.subnetName(subnetName));
-      }
-
-      /**
-       * @see #networkSecurityGroupName
-       */
-      public static AzureComputeTemplateOptions networkSecurityGroupName(final String networkSecurityGroupName) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.subnetName(networkSecurityGroupName));
-      }
-
-      /**
-       * @see #subnetAddressPrefix
-       */
-      public static AzureComputeTemplateOptions subnetAddressPrefix(final String subnetAddressPrefix) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.subnetAddressPrefix(subnetAddressPrefix));
-      }
-
-      /**
-       * @see #storageAccountName
-       */
-      public static AzureComputeTemplateOptions storageAccountName(final String storageAccountName) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.storageAccountName(storageAccountName));
-      }
-
-      /**
-       * @see #storageAccountType
-       */
-      public static AzureComputeTemplateOptions storageAccountType(final String storageAccountType) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.storageAccountType(storageAccountType));
-      }
-
-      // methods that only facilitate returning the correct object type
-      /**
-       * @see org.jclouds.compute.options.TemplateOptions#inboundPorts(int...)
-       */
-      public static AzureComputeTemplateOptions inboundPorts(final int... ports) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.inboundPorts(ports));
-      }
-
-      /**
-       * @see org.jclouds.compute.options.TemplateOptions#blockOnPort(int, int)
-       */
-      public static AzureComputeTemplateOptions blockOnPort(final int port, final int seconds) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.blockOnPort(port, seconds));
-      }
-
-      /**
-       * @see org.jclouds.compute.options.TemplateOptions#userMetadata(java.util.Map)
-       */
-      public static AzureComputeTemplateOptions userMetadata(final Map<String, String> userMetadata) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.userMetadata(userMetadata));
-      }
-
-      /**
-       * @see org.jclouds.compute.options.TemplateOptions#userMetadata(String, String)
-       */
-      public static AzureComputeTemplateOptions userMetadata(final String key, final String value) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.userMetadata(key, value));
-      }
-
-      /**
-       * @see org.jclouds.compute.options.TemplateOptions#nodeNames(Iterable)
-       */
-      public static AzureComputeTemplateOptions nodeNames(final Iterable<String> nodeNames) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.nodeNames(nodeNames));
-      }
-
-      /**
-       * @see org.jclouds.compute.options.TemplateOptions#networks(Iterable)
-       */
-      public static AzureComputeTemplateOptions networks(final Iterable<String> networks) {
-         final AzureComputeTemplateOptions options = new AzureComputeTemplateOptions();
-         return AzureComputeTemplateOptions.class.cast(options.networks(networks));
-      }
-   }
-
-   // methods that only facilitate returning the correct object type
-   /**
-    * @see org.jclouds.compute.options.TemplateOptions#blockOnPort(int, int)
-    */
-   @Override
-   public AzureComputeTemplateOptions blockOnPort(final int port, final int seconds) {
-      return AzureComputeTemplateOptions.class.cast(super.blockOnPort(port, seconds));
-   }
-
-   /**
-    * @see org.jclouds.compute.options.TemplateOptions#inboundPorts(int...)
-    */
-   @Override
-   public AzureComputeTemplateOptions inboundPorts(final int... ports) {
-      return AzureComputeTemplateOptions.class.cast(super.inboundPorts(ports));
-   }
-
-   /**
-    * @see org.jclouds.compute.options.TemplateOptions#authorizePublicKey(String)
-    */
-   @Override
-   public AzureComputeTemplateOptions authorizePublicKey(final String publicKey) {
-      return AzureComputeTemplateOptions.class.cast(super.authorizePublicKey(publicKey));
-   }
-
-   /**
-    * @see org.jclouds.compute.options.TemplateOptions#installPrivateKey(String)
-    */
-   @Override
-   public AzureComputeTemplateOptions installPrivateKey(final String privateKey) {
-      return AzureComputeTemplateOptions.class.cast(super.installPrivateKey(privateKey));
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public AzureComputeTemplateOptions userMetadata(final Map<String, String> userMetadata) {
-      return AzureComputeTemplateOptions.class.cast(super.userMetadata(userMetadata));
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public AzureComputeTemplateOptions userMetadata(final String key, final String value) {
-      return AzureComputeTemplateOptions.class.cast(super.userMetadata(key, value));
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public AzureComputeTemplateOptions nodeNames(final Iterable<String> nodeNames) {
-      return AzureComputeTemplateOptions.class.cast(super.nodeNames(nodeNames));
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public AzureComputeTemplateOptions networks(final Iterable<String> networks) {
-      return AzureComputeTemplateOptions.class.cast(super.networks(networks));
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/main/java/org/jclouds/azurecompute/util/ConflictManagementPredicate.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/util/ConflictManagementPredicate.java b/azurecompute/src/main/java/org/jclouds/azurecompute/util/ConflictManagementPredicate.java
index c859c50..1f940bf 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/util/ConflictManagementPredicate.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/util/ConflictManagementPredicate.java
@@ -19,9 +19,6 @@ package org.jclouds.azurecompute.util;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.jclouds.azurecompute.domain.Operation.Status.FAILED;
-
-import com.google.common.base.Predicate;
-
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -37,6 +34,8 @@ import org.jclouds.http.HttpResponseException;
 import org.jclouds.logging.Logger;
 import org.jclouds.util.Predicates2;
 
+import com.google.common.base.Predicate;
+
 /**
  * Conflict errors (409 response status code) management predicate.
  */
@@ -103,7 +102,7 @@ public class ConflictManagementPredicate implements Predicate<String> {
    /**
     * {@inheritDoc }
     *
-    * @param input interested object/operaton descripton or requestId.
+    * @param input interested object/operation description or requestId.
     * @return predicate evaluation.
     */
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/AzureComputeProviderMetadataLive.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/AzureComputeProviderMetadataLive.java b/azurecompute/src/test/java/org/jclouds/azurecompute/AzureComputeProviderMetadataLive.java
deleted file mode 100644
index c09f0d0..0000000
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/AzureComputeProviderMetadataLive.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.azurecompute;
-
-import static org.jclouds.azurecompute.config.AzureComputeProperties.OPERATION_POLL_INITIAL_PERIOD;
-import static org.jclouds.azurecompute.config.AzureComputeProperties.OPERATION_POLL_MAX_PERIOD;
-import static org.jclouds.azurecompute.config.AzureComputeProperties.OPERATION_TIMEOUT;
-import static org.jclouds.azurecompute.config.AzureComputeProperties.TCP_RULE_FORMAT;
-import static org.jclouds.azurecompute.config.AzureComputeProperties.TCP_RULE_REGEXP;
-import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE;
-
-import com.google.auto.service.AutoService;
-import java.net.URI;
-import java.util.Properties;
-import org.jclouds.azurecompute.domain.Region;
-import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
-import org.jclouds.providers.ProviderMetadata;
-
-@AutoService(ProviderMetadata.class)
-public class AzureComputeProviderMetadataLive extends AzureComputeProviderMetadata {
-
-   @Override
-   public Builder toBuilder() {
-      return new Builder().fromProviderMetadata(this);
-   }
-
-   public AzureComputeProviderMetadataLive() {
-      super(new Builder());
-   }
-
-   public static Properties defaultProperties() {
-      final Properties properties = AzureManagementApiMetadata.defaultProperties();
-      properties.setProperty(TEMPLATE, "osFamily=UBUNTU,osVersionMatches=.*14\\.10,loginUser=jclouds,"
-              + "locationId=" + BaseAzureComputeApiLiveTest.LOCATION);
-      properties.setProperty(OPERATION_TIMEOUT, "600000");
-      properties.setProperty(OPERATION_POLL_INITIAL_PERIOD, "5");
-      properties.setProperty(OPERATION_POLL_MAX_PERIOD, "15");
-      properties.setProperty(TCP_RULE_FORMAT, "tcp_%s-%s");
-      properties.setProperty(TCP_RULE_REGEXP, "tcp_\\d{1,5}-\\d{1,5}");
-      return properties;
-   }
-
-   public AzureComputeProviderMetadataLive(final Builder builder) {
-      super(builder);
-   }
-
-   public static class Builder extends AzureComputeProviderMetadata.Builder {
-
-      protected Builder() {
-         id("azurecompute")
-                 .name("Microsoft Azure Service Management Service")
-                 .apiMetadata(new AzureManagementApiMetadata())
-                 .endpoint("https://management.core.windows.net/SUBSCRIPTION_ID")
-                 .homepage(URI.create("https://www.windowsazure.com/"))
-                 .console(URI.create("https://windows.azure.com/default.aspx"))
-                 .linkedServices("azureblob", "azurequeue", "azuretable")
-                 .iso3166Codes(Region.iso3166Codes())
-                 .defaultProperties(AzureComputeProviderMetadataLive.defaultProperties());
-      }
-
-      @Override
-      public AzureComputeProviderMetadataLive build() {
-         return new AzureComputeProviderMetadataLive(this);
-      }
-
-      @Override
-      public Builder fromProviderMetadata(final ProviderMetadata providerMetadata) {
-         super.fromProviderMetadata(providerMetadata);
-         return this;
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/binders/DeploymentParamsToXMLTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/binders/DeploymentParamsToXMLTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/binders/DeploymentParamsToXMLTest.java
new file mode 100644
index 0000000..cc21a98
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/binders/DeploymentParamsToXMLTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.azurecompute.binders;
+
+import static org.testng.Assert.assertEquals;
+import java.net.URI;
+
+import org.jclouds.azurecompute.domain.DeploymentParams;
+import org.jclouds.azurecompute.domain.OSImage;
+import org.jclouds.azurecompute.domain.RoleSize;
+import org.jclouds.http.HttpRequest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+/**
+ * Tests behavior of {@code DeploymentParamsToXML}
+ */
+@Test(groups = "unit")
+public class DeploymentParamsToXMLTest {
+   Injector injector = Guice.createInjector();
+   DeploymentParamsToXML binder = injector
+         .getInstance(DeploymentParamsToXML.class);
+
+   public void testDeploymentParamsToXmlString() {
+      DeploymentParams.Builder paramsBuilder = DeploymentParams.builder()
+              .name("name")
+              .os(OSImage.Type.LINUX)
+              .username("loginUser")
+              .password("loginPassword")
+              .sourceImageName("sourceImageName")
+              .mediaLink(URI.create("http://medialink"))
+              .size(RoleSize.Type.BASIC_A0)
+              .externalEndpoints(ImmutableSet.of(DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort(22, 22)))
+              .virtualNetworkName("virtualNetworkName")
+              .reservedIPName("reservedIPName")
+              .subnetNames(ImmutableList.of("subnetName"));
+
+      HttpRequest request = HttpRequest.builder().method("POST").endpoint("http://localhost")
+            .addFormParam("InstanceId", "i-foo").build();
+      request = binder.bindToRequest(request, paramsBuilder.build());
+      assertEquals(
+            request.getPayload().getRawContent(),
+            "<Deployment xmlns=\"http://schemas.microsoft.com/windowsazure\"><Name>name</Name><DeploymentSlot>Production</DeploymentSlot><Label>name</Label><RoleList><Role><RoleName>name</RoleName><RoleType>PersistentVMRole</RoleType><ConfigurationSets><ConfigurationSet><ConfigurationSetType>LinuxProvisioningConfiguration</ConfigurationSetType><HostName>name</HostName><UserName>loginUser</UserName><UserPassword>loginPassword</UserPassword><DisableSshPasswordAuthentication>false</DisableSshPasswordAuthentication><SSH><PublicKeys/><KeyPairs/></SSH></ConfigurationSet><ConfigurationSet><ConfigurationSetType>NetworkConfiguration</ConfigurationSetType><InputEndpoints><InputEndpoint><LocalPort>22</LocalPort><Name>tcp_22-22</Name><Port>22</Port><Protocol>tcp</Protocol></InputEndpoint></InputEndpoints><SubnetNames><SubnetName>subnetName</SubnetName></SubnetNames></ConfigurationSet></ConfigurationSets><DataVirtualHardDisks/><OSVirtualHardDisk><HostCaching>ReadWrite</HostCaching><MediaLink>htt
 p://medialink</MediaLink><SourceImageName>sourceImageName</SourceImageName><OS>Linux</OS></OSVirtualHardDisk><RoleSize>Basic_A0</RoleSize></Role></RoleList><VirtualNetworkName>virtualNetworkName</VirtualNetworkName><ReservedIPName>reservedIPName</ReservedIPName></Deployment>");
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapterLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapterLiveTest.java
deleted file mode 100644
index f4b6f56..0000000
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapterLiveTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.azurecompute.compute;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Sets;
-import java.util.Properties;
-import java.util.Random;
-import java.util.Set;
-
-import org.jclouds.azurecompute.AzureComputeApi;
-import org.jclouds.azurecompute.domain.Deployment;
-import org.jclouds.azurecompute.domain.RoleSize;
-import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
-import org.jclouds.azurecompute.options.AzureComputeTemplateOptions;
-import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
-import org.jclouds.compute.domain.ExecResponse;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.compute.domain.TemplateBuilder;
-import org.jclouds.ssh.SshClient;
-import org.jclouds.ssh.SshClient.Factory;
-import org.jclouds.sshj.config.SshjSshClientModule;
-
-import org.testng.annotations.Test;
-import org.testng.annotations.AfterGroups;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.net.HostAndPort;
-import com.google.common.net.InetAddresses;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-import java.util.Arrays;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.jclouds.util.Predicates2.retry;
-
-@Test(groups = "live", singleThreaded = true, testName = "AzureComputeServiceAdapterLiveTest")
-public class AzureComputeServiceAdapterLiveTest extends BaseAzureComputeApiLiveTest {
-
-   private AzureComputeServiceAdapter adapter;
-
-   private TemplateBuilder templateBuilder;
-
-   private Factory sshFactory;
-
-   private String storageServiceName = null;
-
-   @Override
-   protected String getStorageServiceName() {
-      if (storageServiceName == null) {
-         storageServiceName = String.format("%3.20sacsa", System.getProperty("user.name") + RAND).toLowerCase();
-      }
-      return storageServiceName;
-   }
-
-   @Override
-   protected AzureComputeApi create(final Properties props, final Iterable<Module> modules) {
-      final Injector injector = newBuilder().modules(modules).overrides(props).buildInjector();
-      adapter = injector.getInstance(AzureComputeServiceAdapter.class);
-      templateBuilder = injector.getInstance(TemplateBuilder.class);
-      sshFactory = injector.getInstance(SshClient.Factory.class);
-      return injector.getInstance(AzureComputeApi.class);
-   }
-
-   @Test
-   public void testListLocations() {
-      assertFalse(Iterables.isEmpty(adapter.listLocations()), "locations must not be empty");
-   }
-
-   @Test
-   public void testListImages() {
-      assertFalse(Iterables.isEmpty(adapter.listImages()), "images must not be empty");
-   }
-
-   /**
-    * Functionally equivalent to {@link AzureComputeServiceContextLiveTest#testLaunchNode()}.
-    */
-   @Test
-   public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() {
-      final String groupName = String.format("%s%d-group-acsalt",
-              System.getProperty("user.name"),
-              new Random(999).nextLong());
-
-      final String name = String.format("%1.5s%dacsalt", System.getProperty("user.name"), new Random(999).nextInt());
-
-      templateBuilder.imageId(BaseAzureComputeApiLiveTest.IMAGE_NAME);
-      templateBuilder.hardwareId("BASIC_A0");
-      templateBuilder.locationId(BaseAzureComputeApiLiveTest.LOCATION);
-      final Template template = templateBuilder.build();
-
-      // test passing custom options
-      final AzureComputeTemplateOptions options = template.getOptions().as(AzureComputeTemplateOptions.class);
-      options.inboundPorts(22);
-      options.storageAccountName(getStorageServiceName());
-      options.virtualNetworkName(VIRTUAL_NETWORK_NAME);
-      options.subnetName(DEFAULT_SUBNET_NAME);
-      options.addressSpaceAddressPrefix(DEFAULT_ADDRESS_SPACE);
-      options.subnetAddressPrefix(DEFAULT_SUBNET_ADDRESS_SPACE);
-      options.nodeNames(Arrays.asList(name));
-
-      NodeAndInitialCredentials<Deployment> deployment = null;
-      try {
-         deployment = adapter.createNodeWithGroupEncodedIntoName(groupName, name, template);
-         assertEquals(deployment.getNode().name(), name);
-         assertEquals(deployment.getNodeId(), deployment.getNode().name());
-
-         // wait for node to start...
-         final Set<Deployment> nodes = Sets.newHashSet();
-         retry(new Predicate<String>() {
-
-            @Override
-            public boolean apply(final String input) {
-               final Deployment node = adapter.getNode(input);
-               if (node != null) {
-                  nodes.add(node);
-               }
-               return !nodes.isEmpty();
-            }
-         }, 600, 30, 30, SECONDS).apply(name);
-
-         assertFalse(nodes.isEmpty());
-         final Deployment node = nodes.iterator().next();
-         assert InetAddresses.isInetAddress(node.virtualIPs().get(0).address()) : deployment;
-
-         final SshClient client = sshFactory.create(
-                 HostAndPort.fromParts(node.virtualIPs().get(0).address(), 22),
-                 deployment.getCredentials());
-         client.connect();
-         final ExecResponse hello = client.exec("echo hello");
-         assertEquals(hello.getOutput().trim(), "hello");
-      } finally {
-         if (deployment != null) {
-            adapter.destroyNode(deployment.getNodeId());
-         }
-      }
-   }
-
-   @Test
-   public void testListHardwareProfiles() {
-      final Iterable<RoleSize> roleSizes = adapter.listHardwareProfiles();
-      assertFalse(Iterables.isEmpty(roleSizes));
-
-      for (RoleSize roleSize : roleSizes) {
-         assertNotNull(roleSize);
-      }
-   }
-
-   @AfterGroups(groups = "live", alwaysRun = true)
-   @Override
-   protected void tearDown() {
-      super.tearDown();
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module>of(getLoggingModule(), new SshjSshClientModule());
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceContextLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceContextLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceContextLiveTest.java
index 925f8a8..dbcfd38 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceContextLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceContextLiveTest.java
@@ -17,69 +17,31 @@
 package org.jclouds.azurecompute.compute;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.testng.Assert.assertTrue;
-import java.util.Arrays;
+import static org.jclouds.compute.predicates.NodePredicates.inGroup;
+import static org.jclouds.compute.predicates.NodePredicates.runningInGroup;
+import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 
-import org.jclouds.azurecompute.AzureComputeApi;
+import org.jclouds.azurecompute.compute.options.AzureComputeTemplateOptions;
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
-import org.jclouds.azurecompute.options.AzureComputeTemplateOptions;
-import org.jclouds.azurecompute.util.ConflictManagementPredicate;
 import org.jclouds.compute.RunNodesException;
+import org.jclouds.compute.RunScriptOnNodesException;
 import org.jclouds.compute.domain.ExecResponse;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
-import org.jclouds.ssh.SshClient;
 import org.jclouds.sshj.config.SshjSshClientModule;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
+import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.Iterables;
-import com.google.common.reflect.TypeToken;
 import com.google.inject.Module;
 
 @Test(groups = "live", testName = "AzureComputeServiceContextLiveTest")
 public class AzureComputeServiceContextLiveTest extends BaseComputeServiceContextLiveTest {
 
-   private static final int RAND = new Random().nextInt(999);
-
-   private AzureComputeApi api;
-
-   private String storageServiceName = null;
-
-   protected String getStorageServiceName() {
-      if (storageServiceName == null) {
-         storageServiceName = String.format("%3.20sacsc", System.getProperty("user.name") + RAND).toLowerCase();
-      }
-      return storageServiceName;
-   }
-
-   @BeforeClass
-   public void setup() {
-      api = newBuilder().
-              modules(setupModules()).
-              overrides(setupProperties()).
-              buildApi(new TypeToken<AzureComputeApi>(getClass()) {
-
-                 private static final long serialVersionUID = 309104475566522958L;
-
-              });
-   }
-
-   @AfterClass(alwaysRun = true)
-   public void tearDown() {
-      assertTrue(new ConflictManagementPredicate(api) {
-
-         @Override
-         protected String operation() {
-            return api.getStorageAccountApi().delete(getStorageServiceName());
-         }
-      }.apply(getStorageServiceName()));
-   }
+   private static final int COUNT = 2;
 
    @Override
    protected Module getSshModule() {
@@ -87,56 +49,79 @@ public class AzureComputeServiceContextLiveTest extends BaseComputeServiceContex
    }
 
    public AzureComputeServiceContextLiveTest() {
-      super();
-
       provider = "azurecompute";
    }
 
-   /**
-    * Functionally equivalent to
-    * {@link AzureComputeServiceAdapterLiveTest#testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials}.
-    *
-    * @throws RunNodesException
-    */
+
    @Test
-   public void testLaunchNode() throws RunNodesException {
+   public void testWindowsNode() throws RunNodesException {
+      final String groupName = String.format("win-%s", System.getProperty("user.name"));
+
+      final TemplateBuilder templateBuilder = view.getComputeService().templateBuilder();
+      //templateBuilder.imageId("3a50f22b388a4ff7ab41029918570fa6__Windows-Server-2012-Essentials-20141204-enus");
+      templateBuilder.imageId("a699494373c04fc0bc8f2bb1389d6106__Nano_TP4_Azure_20151118_8GB.vhd");
+      templateBuilder.hardwareId("BASIC_A2");
+      templateBuilder.locationId(BaseAzureComputeApiLiveTest.LOCATION);
+      final Template template = templateBuilder.build();
 
-       final String groupName = String.format("%s%d-group-acsclt",
-              System.getProperty("user.name"),
-              new Random(999).nextInt());
+      // test passing custom options
+      final AzureComputeTemplateOptions options = template.getOptions().as(AzureComputeTemplateOptions.class);
+      options.inboundPorts(5985);
 
-      final String name = String.format("%1.5s%dacsclt", System.getProperty("user.name"), new Random(999).nextInt());
+      try {
+         Set<? extends NodeMetadata> nodes = view.getComputeService().createNodesInGroup(groupName, 1, template);
+         assertThat(nodes).hasSize(1);
+      } finally {
+         view.getComputeService().destroyNodesMatching(inGroup(groupName));
+      }
+   }
+
+   @Test
+   public void testLaunchNodes() throws RunNodesException {
+      final int rand = new Random().nextInt(999);
+      final String groupName = String.format("%s%d-group-acsclt", System.getProperty("user.name"), rand);
 
       final TemplateBuilder templateBuilder = view.getComputeService().templateBuilder();
       templateBuilder.imageId(BaseAzureComputeApiLiveTest.IMAGE_NAME);
       templateBuilder.hardwareId("BASIC_A0");
       templateBuilder.locationId(BaseAzureComputeApiLiveTest.LOCATION);
-      final Template tmp = templateBuilder.build();
+      final Template template = templateBuilder.build();
 
       // test passing custom options
-      final AzureComputeTemplateOptions options = tmp.getOptions().as(AzureComputeTemplateOptions.class);
+      final AzureComputeTemplateOptions options = template.getOptions().as(AzureComputeTemplateOptions.class);
       options.inboundPorts(22);
-      options.storageAccountName(getStorageServiceName());
-      options.virtualNetworkName(BaseAzureComputeApiLiveTest.VIRTUAL_NETWORK_NAME);
-      options.subnetName(BaseAzureComputeApiLiveTest.DEFAULT_SUBNET_NAME);
-      options.addressSpaceAddressPrefix(BaseAzureComputeApiLiveTest.DEFAULT_ADDRESS_SPACE);
-      options.subnetAddressPrefix(BaseAzureComputeApiLiveTest.DEFAULT_SUBNET_ADDRESS_SPACE);
-      options.nodeNames(Arrays.asList(name));
-
-      NodeMetadata node = null;
+
       try {
-         final Set<? extends NodeMetadata> nodes = view.getComputeService().createNodesInGroup(groupName, 1, tmp);
-         node = Iterables.getOnlyElement(nodes);
+         Set<? extends NodeMetadata> nodes = view.getComputeService().createNodesInGroup(groupName, COUNT, template);
+         assertThat(nodes).hasSize(COUNT);
 
-         final SshClient client = view.utils().sshForNode().apply(node);
-         client.connect();
-         final ExecResponse hello = client.exec("echo hello");
-         assertThat(hello.getOutput().trim()).isEqualTo("hello");
-      } finally {
-         if (node != null) {
-            view.getComputeService().destroyNode(node.getId());
+         Map<? extends NodeMetadata, ExecResponse> responses = view.getComputeService().runScriptOnNodesMatching(runningInGroup(groupName), "echo hello");
+         assertThat(responses).hasSize(COUNT);
+
+         for (ExecResponse execResponse : responses.values()) {
+            assertThat(execResponse.getOutput().trim()).isEqualTo("hello");
          }
+      } catch (RunScriptOnNodesException e) {
+         Assert.fail();
+      } finally {
+         view.getComputeService().destroyNodesMatching(inGroup(groupName));
       }
    }
 
+   @Test(expectedExceptions = { IllegalStateException.class })
+   public void testNotExistingStorageAccount() throws RunNodesException {
+      final int rand = new Random().nextInt(999);
+      final String groupName = String.format("%s%d-group-acsclt", System.getProperty("user.name"), rand);
+
+      final String storageServiceName = "not3x1st1ng";
+
+      final Template template = view.getComputeService().templateBuilder().build();
+
+      // test passing custom options
+      final AzureComputeTemplateOptions options = template.getOptions().as(AzureComputeTemplateOptions.class);
+      options.storageAccountName(storageServiceName);
+
+      Set<? extends NodeMetadata> nodes = view.getComputeService().createNodesInGroup(groupName, 1, template);
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceLiveTest.java
index e9b4f29..6eb0220 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceLiveTest.java
@@ -16,20 +16,27 @@
  */
 package org.jclouds.azurecompute.compute;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
+import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
 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.sshj.config.SshjSshClientModule;
 import org.testng.annotations.Test;
 
-@Test(groups = {"integration", "live"}, singleThreaded = true, testName = "AzureComputeServiceLiveTest")
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+
+@Test(groups = {"integration", "live"}, singleThreaded = true, testName = "AzureComputeServiceLiveTest", alwaysRun = false)
 public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
 
    public AzureComputeServiceLiveTest() {
       super();
       provider = "azurecompute";
+      // this is 30 seconds by default, but Azure will take anyway longer because we need to wait for a non-null
+      // Deployment object to be returned: see the end of AzureComputeServiceAdapter#createNodeWithGroupEncodedIntoName
+      nonBlockDurationSeconds = 600;
    }
 
    @Override
@@ -43,15 +50,14 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
    }
 
    @Override
-   public void testOptionToNotBlock() throws Exception {
-      // this is 30 seconds by default, but Azure will take anyway longer because we need to wait for a non-null
-      // Deployment object to be returned: see the end of AzureComputeServiceAdapter#createNodeWithGroupEncodedIntoName
-      nonBlockDurationSeconds = 120;
-      super.testOptionToNotBlock();
-   }
-
-   @Override
    protected Module getSshModule() {
       return new SshjSshClientModule();
    }
+
+   protected Template buildTemplate(TemplateBuilder templateBuilder) {
+      return templateBuilder.imageId(BaseAzureComputeApiLiveTest.IMAGE_NAME)
+              .hardwareId("BASIC_A1")
+              .locationId(BaseAzureComputeApiLiveTest.LOCATION)
+              .build();
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiLiveTest.java
index 17e5f3a..6982300 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiLiveTest.java
@@ -19,30 +19,29 @@ package org.jclouds.azurecompute.features;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.jclouds.util.Predicates2.retry;
+import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.assertEquals;
-
+import java.util.List;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.jclouds.azurecompute.compute.AzureComputeServiceAdapter;
 import org.jclouds.azurecompute.domain.CloudService;
+import org.jclouds.azurecompute.domain.CloudServiceProperties;
 import org.jclouds.azurecompute.domain.Deployment;
 import org.jclouds.azurecompute.domain.DeploymentParams;
 import org.jclouds.azurecompute.domain.OSImage;
+import org.jclouds.azurecompute.domain.Role;
 import org.jclouds.azurecompute.domain.RoleSize;
-import org.jclouds.azurecompute.domain.CloudServiceProperties;
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
+import org.jclouds.azurecompute.util.ConflictManagementPredicate;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import java.util.List;
-import java.util.logging.Level;
-import org.jclouds.azurecompute.domain.Role;
-import org.jclouds.azurecompute.util.ConflictManagementPredicate;
+import com.google.common.collect.ImmutableSet;
 
 @Test(groups = "live", testName = "DeploymentApiLiveTest", singleThreaded = true)
 public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
@@ -93,10 +92,8 @@ public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
               .mediaLink(AzureComputeServiceAdapter.createMediaLink(storageService.serviceName(), DEPLOYMENT))
               .username("test")
               .password("supersecurePassword1!")
-              .size(RoleSize.Type.BASIC_A2)
-              .subnetName(Iterables.get(virtualNetworkSite.subnets(), 0).name())
-              .virtualNetworkName(virtualNetworkSite.name())
-              .externalEndpoint(DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort(22, 22))
+              .size(RoleSize.Type.BASIC_A0)
+              .externalEndpoints(ImmutableSet.of(DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort(22, 22)))
               .build();
       final String requestId = api().create(params);
       assertTrue(operationSucceeded.apply(requestId), requestId);
@@ -110,7 +107,6 @@ public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
       assertThat(deployment.slot()).isEqualTo(Deployment.Slot.PRODUCTION);
       assertThat(deployment.roleList().size()).isEqualTo(1);
       assertThat(deployment.roleInstanceList().size()).isEqualTo(1);
-      assertThat(deployment.virtualNetworkName()).isEqualTo(virtualNetworkSite.name());
 
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java
index 8fecadc..7d35311 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java
@@ -19,7 +19,6 @@ package org.jclouds.azurecompute.features;
 import static org.jclouds.azurecompute.domain.DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort;
 import static org.jclouds.azurecompute.domain.DeploymentParams.ExternalEndpoint.inboundUdpToLocalPort;
 import static org.testng.Assert.assertEquals;
-
 import java.net.URI;
 
 import org.jclouds.azurecompute.domain.DeploymentParams;
@@ -30,6 +29,7 @@ import org.jclouds.azurecompute.xml.DeploymentHandlerTest;
 import org.jclouds.azurecompute.xml.ListOSImagesHandlerTest;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableSet;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 
 @Test(groups = "unit", testName = "DeploymentApiMockTest")
@@ -51,8 +51,8 @@ public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
                  .username("username").password("testpwd")
                  .virtualNetworkName("my-virtualNetworkName")
                  .reservedIPName("myreservedip")
-                 .externalEndpoint(inboundTcpToLocalPort(80, 8080))
-                 .externalEndpoint(inboundUdpToLocalPort(53, 53)).build();
+                 .externalEndpoints(ImmutableSet.of(inboundTcpToLocalPort(80, 8080), inboundUdpToLocalPort(53, 53)))
+                 .build();
 
          assertEquals(api.create(params), "request-1");
 
@@ -77,8 +77,8 @@ public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
                  .sourceImageName(OSImage.name()).mediaLink(OSImage.mediaLink()).os(OSImage.os())
                  .username("username").password("testpwd")
                  .virtualNetworkName("my-virtualNetworkName")
-                 .externalEndpoint(inboundTcpToLocalPort(80, 8080))
-                 .externalEndpoint(inboundUdpToLocalPort(53, 53)).build();
+                 .externalEndpoints(ImmutableSet.of(inboundTcpToLocalPort(80, 8080), inboundUdpToLocalPort(53, 53)))
+                 .build();
 
          assertEquals(api.create(params), "request-1");
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java
index 1943077..1847f1f 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java
@@ -98,7 +98,8 @@ public class DiskApiLiveTest extends AbstractAzureComputeApiLiveTest {
       }
 
       if (disk.sourceImage() != null) {
-         assertTrue(images.contains(disk.sourceImage()), "SourceImage not in " + images + " :" + disk);
+      //TODO disk can be generated from a `VM Image` that listDisk doesn't consider
+      //   assertTrue(images.contains(disk.sourceImage()), "SourceImage not in " + images + " :" + disk);
       }
 
       if (disk.affinityGroup() != null) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/NetworkSecurityGroupApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/NetworkSecurityGroupApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/NetworkSecurityGroupApiLiveTest.java
index 763e1ce..7e41eb7 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/NetworkSecurityGroupApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/NetworkSecurityGroupApiLiveTest.java
@@ -28,9 +28,6 @@ import org.jclouds.azurecompute.domain.NetworkSecurityGroup;
 import org.jclouds.azurecompute.domain.Rule;
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
 
-import static org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest.DEFAULT_SUBNET_NAME;
-import static org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest.LOCATION;
-import static org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest.VIRTUAL_NETWORK_NAME;
 import org.jclouds.azurecompute.util.ConflictManagementPredicate;
 
 import org.testng.annotations.AfterClass;
@@ -44,14 +41,6 @@ public class NetworkSecurityGroupApiLiveTest extends BaseAzureComputeApiLiveTest
 
    private static final String GROUP2 = System.getProperty("user.name") + RAND + "-2";
 
-   public static final String ADDRESS_SPACE = "10.10.0.0/20";
-
-   public static final String SUBNET_ADDRESS_SPACE = "10.10.0.0/23";
-
-   public static final String NETWORK_NAME = "secgrp-vnetsite";
-
-   public static final String SUBNET_NAME = "secgrp-subnet";
-
    @BeforeClass
    public void groupSetup() {
       // ----------------------------
@@ -108,7 +97,7 @@ public class NetworkSecurityGroupApiLiveTest extends BaseAzureComputeApiLiveTest
       assertEquals(group.name(), GROUP1);
       assertEquals(group.label(), GROUP1 + " security group");
       assertEquals(group.location(), LOCATION);
-      assertNull(group.state());
+      assertTrue(group.state() == NetworkSecurityGroup.State.CREATED);
       assertTrue(group.rules().isEmpty());
    }
 
@@ -118,7 +107,7 @@ public class NetworkSecurityGroupApiLiveTest extends BaseAzureComputeApiLiveTest
       assertEquals(group.name(), GROUP2);
       assertEquals(group.label(), GROUP2 + " security group");
       assertEquals(group.location(), LOCATION);
-      assertNull(group.state());
+      assertTrue(group.state() == NetworkSecurityGroup.State.CREATED);
       assertFalse(group.rules().isEmpty());
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiLiveTest.java
index ab1f8df..edff894 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiLiveTest.java
@@ -22,26 +22,20 @@ import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
-import org.jclouds.azurecompute.domain.AffinityGroup;
 import org.jclouds.azurecompute.domain.Location;
 import org.jclouds.azurecompute.domain.OSImage;
 import org.jclouds.azurecompute.internal.AbstractAzureComputeApiLiveTest;
-
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
-import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
 
 @Test(groups = "live", testName = "OSImageApiLiveTest")
 public class OSImageApiLiveTest extends AbstractAzureComputeApiLiveTest {
 
    private ImmutableSet<String> locations;
 
-   private ImmutableSet<String> groups;
-
    @BeforeClass(groups = {"integration", "live"})
    @Override
    public void setup() {
@@ -54,13 +48,6 @@ public class OSImageApiLiveTest extends AbstractAzureComputeApiLiveTest {
             return location.name();
          }
       }));
-      groups = ImmutableSet.copyOf(transform(api.getAffinityGroupApi().list(), new Function<AffinityGroup, String>() {
-
-         @Override
-         public String apply(final AffinityGroup group) {
-            return group.name();
-         }
-      }));
    }
 
    public void testList() {
@@ -84,10 +71,6 @@ public class OSImageApiLiveTest extends AbstractAzureComputeApiLiveTest {
                  "MediaLink should be an http(s) url" + osImage);
       }
 
-      ImmutableSet<String> osImageLocations = ImmutableSet.copyOf(Splitter.on(';').splitToList(osImage.location()));
-      assertFalse(Sets.intersection(osImageLocations, locations).isEmpty(),
-              "No shared locations between " + locations + " and " + osImageLocations);
-
       // Ex. Dirty data in RightScale eula field comes out as an empty string.
       assertFalse(osImage.eula().contains(""));
       if (osImage.affinityGroup() != null) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/VMImageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VMImageApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VMImageApiLiveTest.java
index 2b074fd..556e73f 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VMImageApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VMImageApiLiveTest.java
@@ -22,19 +22,19 @@ import static org.jclouds.util.Predicates2.retry;
 import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
+import java.net.URI;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableSet;
-
-import com.google.common.collect.Iterables;
 import org.jclouds.azurecompute.compute.AzureComputeServiceAdapter;
+import org.jclouds.azurecompute.domain.CaptureVMImageParams;
+import org.jclouds.azurecompute.domain.CloudService;
 import org.jclouds.azurecompute.domain.Deployment;
 import org.jclouds.azurecompute.domain.DeploymentParams;
-import org.jclouds.azurecompute.domain.VMImage;
-import org.jclouds.azurecompute.domain.RoleSize;
 import org.jclouds.azurecompute.domain.OSImage;
-import org.jclouds.azurecompute.domain.CloudService;
-import org.jclouds.azurecompute.domain.CaptureVMImageParams;
+import org.jclouds.azurecompute.domain.RoleSize;
+import org.jclouds.azurecompute.domain.VMImage;
 import org.jclouds.azurecompute.domain.VMImageParams;
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
 import org.jclouds.azurecompute.util.ConflictManagementPredicate;
@@ -42,10 +42,9 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import java.net.URI;
-import java.util.List;
-import java.util.Date;
-import java.text.SimpleDateFormat;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 
 @Test(groups = "live", testName = "VMImageApiLiveTest")
 public class VMImageApiLiveTest extends BaseAzureComputeApiLiveTest {
@@ -91,9 +90,7 @@ public class VMImageApiLiveTest extends BaseAzureComputeApiLiveTest {
                 .username("test")
                 .password("supersecurePassword1!")
                 .size(RoleSize.Type.BASIC_A2)
-                .subnetName(Iterables.get(virtualNetworkSite.subnets(), 0).name())
-                .virtualNetworkName(virtualNetworkSite.name())
-                .externalEndpoint(DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort(22, 22))
+                .externalEndpoints(ImmutableSet.of(DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort(22, 22)))
                 .build();
         Deployment deployment = getOrCreateDeployment(cloudService.name(), params);
         Deployment.RoleInstance roleInstance = getFirstRoleInstanceInDeployment(DEPLOYMENT);
@@ -201,6 +198,12 @@ public class VMImageApiLiveTest extends BaseAzureComputeApiLiveTest {
                 return api.getDiskApi().delete(diskName);
             }
         }.apply(diskName));
+       assertTrue(new ConflictManagementPredicate(api) {
+          @Override
+          protected String operation() {
+             return api.getCloudServiceApi().delete(cloudService.name());
+          }
+       }.apply(cloudService.name()));
         super.tearDown();
     }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiLiveTest.java
index 7b67b85..22d50e6 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiLiveTest.java
@@ -20,10 +20,6 @@ import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.jclouds.azurecompute.domain.Deployment.InstanceStatus.READY_ROLE;
 import static org.jclouds.util.Predicates2.retry;
 import static org.testng.Assert.assertTrue;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -42,6 +38,10 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
 /*
  * Note: Live test for CaptureVMImage method is in VMImageApiLiveTest class
  */
@@ -75,7 +75,7 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
             RoleInstance roleInstance = getFirstRoleInstanceInDeployment(input);
             return roleInstance != null && roleInstance.instanceStatus() == READY_ROLE;
          }
-      }, 600, 5, 5, SECONDS);
+      }, 600, 5, 15, SECONDS);
 
       roleInstanceStopped = retry(new Predicate<String>() {
 
@@ -84,7 +84,7 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
             RoleInstance roleInstance = getFirstRoleInstanceInDeployment(input);
             return roleInstance != null && roleInstance.instanceStatus() == Deployment.InstanceStatus.STOPPED_VM;
          }
-      }, 600, 5, 5, SECONDS);
+      }, 600, 5, 15, SECONDS);
 
       final DeploymentParams params = DeploymentParams.builder()
               .name(DEPLOYMENT)
@@ -93,10 +93,8 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
               .mediaLink(AzureComputeServiceAdapter.createMediaLink(storageService.serviceName(), DEPLOYMENT))
               .username("test")
               .password("supersecurePassword1!")
-              .size(RoleSize.Type.BASIC_A2)
-              .subnetName(Iterables.get(virtualNetworkSite.subnets(), 0).name())
-              .virtualNetworkName(virtualNetworkSite.name())
-              .externalEndpoint(DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort(22, 22))
+              .size(RoleSize.Type.BASIC_A0)
+              .externalEndpoints(ImmutableSet.of(DeploymentParams.ExternalEndpoint.inboundTcpToLocalPort(22, 22)))
               .build();
       getOrCreateDeployment(cloudService.name(), params);
       RoleInstance roleInstance = getFirstRoleInstanceInDeployment(DEPLOYMENT);
@@ -173,8 +171,9 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
       Logger.getAnonymousLogger().log(Level.INFO, "roleInstance restarted: {0}", roleInstance);
    }
 
-   @AfterClass(alwaysRun = true)
-   public void cleanup() {
+   @AfterClass
+   @Override
+   protected void tearDown() {
       if (cloudService != null && api.getDeploymentApiForService(cloudService.name()).get(DEPLOYMENT) != null) {
          final List<Role> roles = api.getDeploymentApiForService(cloudService.name()).get(DEPLOYMENT).roleList();
 
@@ -186,14 +185,6 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
             }
          }.apply(DEPLOYMENT));
 
-         assertTrue(new ConflictManagementPredicate(api) {
-
-            @Override
-            protected String operation() {
-               return api.getCloudServiceApi().delete(cloudService.name());
-            }
-         }.apply(cloudService.name()));
-
          for (Role r : roles) {
             final Role.OSVirtualHardDisk disk = r.osVirtualHardDisk();
             if (disk != null) {
@@ -206,6 +197,16 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
                }.apply(disk.diskName()));
             }
          }
+
+         assertTrue(new ConflictManagementPredicate(api) {
+
+            @Override
+            protected String operation() {
+               return api.getCloudServiceApi().delete(cloudService.name());
+            }
+         }.apply(cloudService.name()));
+
+         super.tearDown();
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiLiveTest.java
index 0994f66..705a377 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiLiveTest.java
@@ -19,35 +19,37 @@ package org.jclouds.azurecompute.features;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
-import static org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest.VIRTUAL_NETWORK_NAME;
-
-import com.google.common.base.Predicates;
+import java.util.List;
 
+import org.jclouds.azurecompute.AzureTestUtils;
 import org.jclouds.azurecompute.domain.NetworkConfiguration;
 import org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkSite;
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
-
+import org.jclouds.azurecompute.util.ConflictManagementPredicate;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
-import org.jclouds.azurecompute.AzureTestUtils;
-import org.jclouds.azurecompute.util.ConflictManagementPredicate;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeSuite;
-
-import java.util.List;
-
 @Test(groups = "live", testName = "VirtualNetworkApiLiveTest", singleThreaded = true)
 public class VirtualNetworkApiLiveTest extends BaseAzureComputeApiLiveTest {
 
+   private static final String DEFAULT_ADDRESS_SPACE = "10.0.0.0/20";
+   private static final String DEFAULT_SUBNET_ADDRESS_SPACE = "10.0.0.0/23";
+   private List<VirtualNetworkSite> initialVirtualNetworkSite;
+
    @BeforeSuite
    @Override
    public void setup() {
       super.setup();
 
+      initialVirtualNetworkSite = AzureTestUtils.getVirtualNetworkSite(api);
+
+      virtualNetworkSite = getOrCreateVirtualNetworkSite(VIRTUAL_NETWORK_NAME, LOCATION);
+
       final List<VirtualNetworkSite> virtualNetworkSites = Lists.newArrayList(Iterables.filter(
               AzureTestUtils.getVirtualNetworkSite(api),
               new AzureTestUtils.SameVirtualNetworkSiteNamePredicate(VIRTUAL_NETWORK_NAME)));
@@ -74,18 +76,13 @@ public class VirtualNetworkApiLiveTest extends BaseAzureComputeApiLiveTest {
    protected void tearDown() {
       super.tearDown();
 
-      final List<VirtualNetworkSite> virtualNetworkSites = Lists.newArrayList(Iterables.filter(api.
-              getVirtualNetworkApi().list(),
-              Predicates.not(new AzureTestUtils.SameVirtualNetworkSiteNamePredicate(VIRTUAL_NETWORK_NAME))));
-
+      final NetworkConfiguration networkConfiguration = NetworkConfiguration.create(NetworkConfiguration.VirtualNetworkConfiguration.create(null, initialVirtualNetworkSite));
       assertTrue(new ConflictManagementPredicate(api) {
-
          @Override
          protected String operation() {
-            return api.getVirtualNetworkApi().set(NetworkConfiguration.create(
-                    NetworkConfiguration.VirtualNetworkConfiguration.create(null, virtualNetworkSites)));
+            return api.getVirtualNetworkApi().set(networkConfiguration);
          }
-      }.apply(VIRTUAL_NETWORK_NAME));
+      }.apply("Revert VirtualNetworkConfiguration"));
    }
 
    @Test

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/internal/AbstractAzureComputeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/internal/AbstractAzureComputeApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/internal/AbstractAzureComputeApiLiveTest.java
index 155549e..47bfb5a 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/internal/AbstractAzureComputeApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/internal/AbstractAzureComputeApiLiveTest.java
@@ -16,14 +16,22 @@
  */
 package org.jclouds.azurecompute.internal;
 
-import com.google.common.base.Predicate;
-import java.util.Random;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.jclouds.azurecompute.config.AzureComputeProperties.OPERATION_POLL_INITIAL_PERIOD;
+import static org.jclouds.azurecompute.config.AzureComputeProperties.OPERATION_POLL_MAX_PERIOD;
+import static org.jclouds.azurecompute.config.AzureComputeProperties.OPERATION_TIMEOUT;
+import static org.jclouds.azurecompute.config.AzureComputeProperties.TCP_RULE_FORMAT;
+import static org.jclouds.azurecompute.config.AzureComputeProperties.TCP_RULE_REGEXP;
+import java.util.Properties;
+import java.util.Random;
+
 import org.jclouds.apis.BaseApiLiveTest;
 import org.jclouds.azurecompute.AzureComputeApi;
+import org.jclouds.azurecompute.util.ConflictManagementPredicate;
+import org.jclouds.compute.config.ComputeServiceProperties;
 import org.testng.annotations.BeforeClass;
 
-import org.jclouds.azurecompute.util.ConflictManagementPredicate;
+import com.google.common.base.Predicate;
 
 public abstract class AbstractAzureComputeApiLiveTest extends BaseApiLiveTest<AzureComputeApi> {
 
@@ -35,6 +43,18 @@ public abstract class AbstractAzureComputeApiLiveTest extends BaseApiLiveTest<Az
       provider = "azurecompute";
    }
 
+   @Override protected Properties setupProperties() {
+      Properties properties = super.setupProperties();
+      properties.put(ComputeServiceProperties.POLL_INITIAL_PERIOD, 1000);
+      properties.put(ComputeServiceProperties.POLL_MAX_PERIOD, 10000);
+      properties.setProperty(OPERATION_TIMEOUT, "60000");
+      properties.setProperty(OPERATION_POLL_INITIAL_PERIOD, "5");
+      properties.setProperty(OPERATION_POLL_MAX_PERIOD, "15");
+      properties.setProperty(TCP_RULE_FORMAT, "tcp_%s-%s");
+      properties.setProperty(TCP_RULE_REGEXP, "tcp_\\d{1,5}-\\d{1,5}");
+      return properties;
+   }
+
    @BeforeClass
    @Override
    public void setup() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/f9b393de/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
index adf716d..f32f943 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
@@ -79,7 +79,6 @@ public class BaseAzureComputeApiLiveTest extends AbstractAzureComputeApiLiveTest
       super.setup();
 
       operationSucceeded = new ConflictManagementPredicate(api, 600, 5, 5, SECONDS);
-      virtualNetworkSite = getOrCreateVirtualNetworkSite(VIRTUAL_NETWORK_NAME, LOCATION);
 
       final CreateStorageServiceParams params = CreateStorageServiceParams.builder().
               serviceName(getStorageServiceName()).
@@ -96,12 +95,14 @@ public class BaseAzureComputeApiLiveTest extends AbstractAzureComputeApiLiveTest
       super.tearDown();
 
       assertTrue(new ConflictManagementPredicate(api) {
-
          @Override
          protected String operation() {
             return api.getStorageAccountApi().delete(getStorageServiceName());
          }
       }.apply(getStorageServiceName()));
+
+
+
    }
 
    protected CloudService getOrCreateCloudService(final String cloudServiceName, final String location) {