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 2015/02/27 12:31:17 UTC

[2/4] jclouds-labs git commit: AzureCompute: initial work to support ComputeServiceAdapter

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ResourceExtensionReferenceHandler.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ResourceExtensionReferenceHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ResourceExtensionReferenceHandler.java
new file mode 100644
index 0000000..aafaf60
--- /dev/null
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ResourceExtensionReferenceHandler.java
@@ -0,0 +1,100 @@
+/*
+ * 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.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import java.util.List;
+
+import org.jclouds.azurecompute.domain.Role.ResourceExtensionReference;
+import org.jclouds.azurecompute.domain.Role.ResourceExtensionReference.ResourceExtensionParameterValue;
+import org.jclouds.http.functions.ParseSax;
+import org.xml.sax.Attributes;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+public class ResourceExtensionReferenceHandler extends ParseSax.HandlerForGeneratedRequestWithResult<ResourceExtensionReference> {
+
+   private String referenceName;
+   private String publisher;
+   private String name;
+   private String version;
+   private List<ResourceExtensionParameterValue> resourceExtensionParameterValues = Lists.newArrayList();
+   private String state;
+
+   private final ResourceExtensionParameterValueHandler resourceExtensionParameterValueHandler;
+   private boolean inResourceExtensionParameterValue = false;
+   private final StringBuilder currentText = new StringBuilder();
+
+   @Inject
+   ResourceExtensionReferenceHandler(ResourceExtensionParameterValueHandler resourceExtensionParameterValueHandler) {
+      this.resourceExtensionParameterValueHandler = resourceExtensionParameterValueHandler;
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attributes) {
+      if (qName.equals("ResourceExtensionParameterValue")) {
+         inResourceExtensionParameterValue = true;
+      }
+      if (inResourceExtensionParameterValue) {
+         resourceExtensionParameterValueHandler.startElement(uri, localName, qName, attributes);
+      }
+   }
+
+   @Override
+   public ResourceExtensionReference getResult() {
+      ResourceExtensionReference result = ResourceExtensionReference.create(referenceName, publisher, name, version,
+              resourceExtensionParameterValues, state);
+      resetState(); // handler is called in a loop.
+      return result;
+   }
+
+   private void resetState() {
+      referenceName = publisher = version = name = state = null;
+      resourceExtensionParameterValues = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String ignoredUri, String ignoredName, String qName) {
+      if (qName.equals("ResourceExtensionParameterValue")) {
+         inResourceExtensionParameterValue = false;
+         resourceExtensionParameterValues.add(resourceExtensionParameterValueHandler.getResult());
+      } else if (inResourceExtensionParameterValue) {
+         resourceExtensionParameterValueHandler.endElement(ignoredUri, ignoredName, qName);
+      } else if (qName.equals("ReferenceName")) {
+         referenceName = currentOrNull(currentText);
+      } else if (qName.equals("Publisher")) {
+         publisher = currentOrNull(currentText);
+      } else if (qName.equals("Name")) {
+         name = currentOrNull(currentText);
+      } else if (qName.equals("Version")) {
+         version = currentOrNull(currentText);
+      } else if (qName.equals("State")) {
+         state = currentOrNull(currentText);
+      }
+      currentText.setLength(0);
+   }
+
+   @Override
+   public void characters(char ch[], int start, int length) {
+      if (inResourceExtensionParameterValue) {
+         resourceExtensionParameterValueHandler.characters(ch, start, length);
+      } else {
+         currentText.append(ch, start, length);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/main/java/org/jclouds/azurecompute/xml/RoleHandler.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/RoleHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/RoleHandler.java
index f066526..e51955e 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/RoleHandler.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/RoleHandler.java
@@ -48,17 +48,20 @@ public class RoleHandler extends ParseSax.HandlerForGeneratedRequestWithResult<R
    private boolean inConfigurationSets;
    private boolean inOSVirtualHardDisk;
    private boolean inDataVirtualHardDisks;
+   private boolean inResourceExtensionReference;
 
    private final ConfigurationSetHandler configurationSetHandler;
    private final OSVirtualHardDiskHandler osVirtualDiskHandler;
    private final DataVirtualHardDiskHandler dataVirtualHardDiskHandler;
+   private final ResourceExtensionReferenceHandler resourceExtensionReferenceHandler;
 
    @Inject
    RoleHandler(ConfigurationSetHandler configurationSetHandler, OSVirtualHardDiskHandler osVirtualDiskHandler,
-                      DataVirtualHardDiskHandler dataVirtualHardDiskHandler) {
+                      DataVirtualHardDiskHandler dataVirtualHardDiskHandler, ResourceExtensionReferenceHandler resourceExtensionReferenceHandler) {
       this.configurationSetHandler = configurationSetHandler;
       this.osVirtualDiskHandler = osVirtualDiskHandler;
       this.dataVirtualHardDiskHandler = dataVirtualHardDiskHandler;
+      this.resourceExtensionReferenceHandler = resourceExtensionReferenceHandler;
    }
 
    private StringBuilder currentText = new StringBuilder();
@@ -79,6 +82,13 @@ public class RoleHandler extends ParseSax.HandlerForGeneratedRequestWithResult<R
       if (inDataVirtualHardDisks) {
          dataVirtualHardDiskHandler.startElement(uri, localName, qName, attributes);
       }
+      if (qName.equals("ResourceExtensionReference")) {
+         inResourceExtensionReference = true;
+      }
+      if (inResourceExtensionReference) {
+         resourceExtensionReferenceHandler.startElement(uri, localName, qName, attributes);
+      }
+
    }
 
    private void resetState() {
@@ -138,6 +148,11 @@ public class RoleHandler extends ParseSax.HandlerForGeneratedRequestWithResult<R
          if (provisionGuestAgentString != null) {
             provisionGuestAgent = Boolean.valueOf(provisionGuestAgentString);
          }
+      } else if (qName.equals("ResourceExtensionReferences")) {
+         inResourceExtensionReference = false;
+         resourceExtensionReferences.add(resourceExtensionReferenceHandler.getResult());
+      } else if (inResourceExtensionReference) {
+         resourceExtensionReferenceHandler.endElement(ignoredUri, ignoredName, qName);
       }
       currentText.setLength(0);
    }
@@ -147,6 +162,8 @@ public class RoleHandler extends ParseSax.HandlerForGeneratedRequestWithResult<R
          configurationSetHandler.characters(ch, start, length);
       } else if (inOSVirtualHardDisk) {
          osVirtualDiskHandler.characters(ch, start, length);
+      } else if (inResourceExtensionReference) {
+         resourceExtensionReferenceHandler.characters(ch, start, length);
       } else {
          currentText.append(ch, start, length);
       }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/main/java/org/jclouds/azurecompute/xml/StorageServiceHandler.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/StorageServiceHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/StorageServiceHandler.java
index 99b49f2..d9474a1 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/StorageServiceHandler.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/StorageServiceHandler.java
@@ -30,7 +30,7 @@ import com.google.common.base.Throwables;
 /**
  * @see <a href="http://msdn.microsoft.com/en-us/library/ee460787.aspx" >api</a>
  */
-final class StorageServiceHandler extends ParseSax.HandlerForGeneratedRequestWithResult<StorageService> {
+public class StorageServiceHandler extends ParseSax.HandlerForGeneratedRequestWithResult<StorageService> {
    private URL url;
    private String serviceName;
    private StorageService.StorageServiceProperties storageServiceProperties;

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/main/java/org/jclouds/azurecompute/xml/SubnetHandler.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/SubnetHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/SubnetHandler.java
index 5e2993d..d2e33df 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/SubnetHandler.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/SubnetHandler.java
@@ -31,6 +31,9 @@ public class SubnetHandler extends ParseSax.HandlerForGeneratedRequestWithResult
    private StringBuilder currentText = new StringBuilder();
 
    @Override public void startElement(String uri, String localName, String qName, Attributes attributes) {
+      if (qName.equalsIgnoreCase("Subnet")){
+         name = attributes.getValue("name");
+      }
    }
 
    @Override public Subnet getResult() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkConfigurationHandler.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkConfigurationHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkConfigurationHandler.java
new file mode 100644
index 0000000..6dd7443
--- /dev/null
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkConfigurationHandler.java
@@ -0,0 +1,73 @@
+/*
+ * 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.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import java.util.List;
+
+import org.jclouds.azurecompute.domain.NetworkConfiguration;
+import org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkConfiguration;
+import org.jclouds.http.functions.ParseSax;
+import org.xml.sax.Attributes;
+
+import com.google.common.collect.Lists;
+
+public class VirtualNetworkConfigurationHandler extends ParseSax.HandlerForGeneratedRequestWithResult<VirtualNetworkConfiguration> {
+
+   private String dns;
+   private List<NetworkConfiguration.VirtualNetworkSite> virtualNetworkSites = Lists.newArrayList();
+
+   private boolean inVirtualNetworkSite;
+   private final VirtualNetworkSiteHandler virtualNetworkSiteHandler = new VirtualNetworkSiteHandler();
+
+   private final StringBuilder currentText = new StringBuilder();
+
+   @Override public void startElement(String url, String name, String qName, Attributes attributes) {
+      if (qName.equals("VirtualNetworkSite")) {
+         inVirtualNetworkSite = true;
+      }
+      if (inVirtualNetworkSite) {
+         virtualNetworkSiteHandler.startElement(url, name, qName, attributes);
+      }
+   }
+
+   @Override
+   public VirtualNetworkConfiguration getResult() {
+      return VirtualNetworkConfiguration.create(dns, virtualNetworkSites);
+   }
+
+   @Override
+   public void endElement(String ignoredUri, String ignoredName, String qName) {
+      if (qName.equals("Dns")) {
+         dns = currentOrNull(currentText);
+      } else if (qName.equals("VirtualNetworkSites")) {
+         inVirtualNetworkSite = false;
+      } else if (qName.equals("VirtualNetworkSite")) {
+         virtualNetworkSites.add(virtualNetworkSiteHandler.getResult());
+      } else if (inVirtualNetworkSite) {
+         virtualNetworkSiteHandler.endElement(ignoredUri, ignoredName, qName);
+      }
+      currentText.setLength(0);
+   }
+
+   @Override public void characters(char ch[], int start, int length) {
+      if (inVirtualNetworkSite) {
+         virtualNetworkSiteHandler.characters(ch, start, length);
+      } else
+         currentText.append(ch, start, length);
+      }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkSiteHandler.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkSiteHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkSiteHandler.java
index d196253..99e48fe 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkSiteHandler.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/VirtualNetworkSiteHandler.java
@@ -44,6 +44,11 @@ public class VirtualNetworkSiteHandler extends ParseSax.HandlerForGeneratedReque
 
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) {
+      if (qName.equalsIgnoreCase("VirtualNetworkSite")){
+         name = attributes.getValue("name");
+         location = attributes.getValue("Location");
+      }
+
       if (qName.equals("AddressSpace")) {
          inAddressSpace = true;
       } else if (qName.equals("Subnet")) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/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
new file mode 100644
index 0000000..71eb6a6
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapterLiveTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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 java.util.Properties;
+import java.util.Random;
+
+import org.jclouds.azurecompute.AzureComputeApi;
+import org.jclouds.azurecompute.domain.Deployment;
+import org.jclouds.azurecompute.domain.Location;
+import org.jclouds.azurecompute.domain.RoleSize;
+import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
+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.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials;
+import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate;
+import org.jclouds.domain.LoginCredentials;
+import org.jclouds.ssh.SshClient;
+import org.jclouds.ssh.SshClient.Factory;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.Test;
+
+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;
+
+@Test(groups = "live", singleThreaded = true, testName = "AzureComputeServiceAdapterLiveTest")
+public class AzureComputeServiceAdapterLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private AzureComputeServiceAdapter adapter;
+   private TemplateBuilder templateBuilder;
+   private Factory sshFactory;
+   private NodeAndInitialCredentials<Deployment> deployment;
+
+   @Override
+   protected AzureComputeApi create(Properties props, Iterable<Module> modules) {
+      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() {
+      Iterable<Location> locations = adapter.listLocations();
+      assertFalse(Iterables.isEmpty(locations), "locations must not be empty");
+   }
+
+   @Test
+   public void testListImages() {
+      assertFalse(Iterables.isEmpty(adapter.listImages()), "images must not be empty");
+   }
+
+   private static final PrioritizeCredentialsFromTemplate prioritizeCredentialsFromTemplate = new PrioritizeCredentialsFromTemplate(
+         new DefaultCredentialsFromImageOrOverridingCredentials());
+
+   @Test
+   public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() {
+      String group = "foo";
+      String name = "node" + new Random().nextInt();
+
+      Template template = templateBuilder.build();
+
+      deployment = adapter.createNodeWithGroupEncodedIntoName(group, name, template);
+      assertEquals(deployment.getNode().name(), name);
+      assertEquals(deployment.getNodeId(), deployment.getNode().name());
+      assert InetAddresses.isInetAddress(deployment.getNode().virtualIPs().get(0).address()) : deployment;
+      doConnectViaSsh(deployment.getNode(), prioritizeCredentialsFromTemplate.apply(template, deployment.getCredentials()));
+   }
+
+   protected void doConnectViaSsh(Deployment deployment, LoginCredentials creds) {
+      SshClient ssh = sshFactory.create(HostAndPort.fromParts(deployment.virtualIPs().get(0).address(), 22), creds);
+      try {
+         ssh.connect();
+         ExecResponse hello = ssh.exec("echo hello");
+         assertEquals(hello.getOutput().trim(), "hello");
+      } finally {
+         if (ssh != null)
+            ssh.disconnect();
+      }
+   }
+
+   @Test
+   public void testListHardwareProfiles() {
+      Iterable<RoleSize> roleSizes = adapter.listHardwareProfiles();
+      assertFalse(Iterables.isEmpty(roleSizes));
+
+      for (RoleSize roleSize : roleSizes) {
+         assertNotNull(roleSize);
+      }
+   }
+
+   @AfterGroups(groups = "live", alwaysRun = true)
+   protected void tearDown() {
+      if (deployment != null) {
+         adapter.destroyNode(deployment.getNodeId());
+      }
+      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/e97ddaee/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
new file mode 100644
index 0000000..9136cbb
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/AzureComputeServiceContextLiveTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.assertj.core.api.Assertions.assertThat;
+import java.util.Random;
+import java.util.Set;
+
+import org.jclouds.azurecompute.options.AzureComputeTemplateOptions;
+import org.jclouds.compute.RunNodesException;
+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.scriptbuilder.statements.login.AdminAccess;
+import org.jclouds.ssh.SshClient;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.Iterables;
+import com.google.inject.Module;
+
+@Test(groups = "live", testName = "AzureComputeServiceContextLiveTest")
+public class AzureComputeServiceContextLiveTest extends BaseComputeServiceContextLiveTest {
+
+   @Override
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+
+   public AzureComputeServiceContextLiveTest() {
+      provider = "azurecompute";
+   }
+
+   @Test
+   public void testLaunchNode() throws RunNodesException {
+      final String group = "node" + new Random().nextLong();
+
+      TemplateBuilder templateBuilder = view.getComputeService().templateBuilder();
+      templateBuilder.imageId("b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20150123-en-us-30GB");
+      templateBuilder.hardwareId("BASIC_A2");
+      templateBuilder.locationId("West Europe");
+      Template template = templateBuilder.build();
+
+      // test passing custom options
+      AzureComputeTemplateOptions options = template.getOptions().as(AzureComputeTemplateOptions.class);
+      options.inboundPorts(22);
+      options.runScript(AdminAccess.standard());
+
+      NodeMetadata node = null;
+      try {
+         Set<? extends NodeMetadata> nodes = view.getComputeService().createNodesInGroup(group, 1, template);
+         node = Iterables.getOnlyElement(nodes);
+
+         SshClient client = view.utils().sshForNode().apply(node);
+         client.connect();
+         ExecResponse hello = client.exec("echo hello");
+         assertThat(hello.getOutput().trim()).isEqualTo("hello");
+      } finally {
+         if (node != null) {
+            view.getComputeService().destroyNode(node.getId());
+         }
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java
new file mode 100644
index 0000000..f026a11
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/compute/extensions/AzureComputeSecurityGroupExtensionLiveTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.extensions;
+
+import org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+
+/**
+ * Live test for AzureCompute {@link org.jclouds.compute.extensions.SecurityGroupExtension} implementation.
+ */
+@Test(groups = "live", singleThreaded = true, testName = "AzureComputeSecurityGroupExtensionLiveTest")
+public class AzureComputeSecurityGroupExtensionLiveTest extends BaseSecurityGroupExtensionLiveTest {
+
+   public AzureComputeSecurityGroupExtensionLiveTest() {
+      provider = "azurecompute";
+   }
+
+   @Override
+   protected Iterable<Module> setupModules() {
+      return ImmutableSet.of(getLoggingModule(), credentialStoreModule, getSshModule());
+   }
+
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiLiveTest.java
index fb0e915..fcb83b2 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiLiveTest.java
@@ -17,48 +17,36 @@
 package org.jclouds.azurecompute.features;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.jclouds.azurecompute.domain.CloudService.Status.UNRECOGNIZED;
 import static org.jclouds.util.Predicates2.retry;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
-
 import java.util.List;
 import java.util.logging.Logger;
 
 import org.jclouds.azurecompute.domain.CloudService;
 import org.jclouds.azurecompute.domain.CloudService.Status;
-import org.jclouds.azurecompute.domain.Operation;
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
 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;
 
-@Test(groups = "live", testName = "CloudServiceApiLiveTest")
+@Test(groups = "live", testName = "CloudServiceApiLiveTest", singleThreaded = true)
 public class CloudServiceApiLiveTest extends BaseAzureComputeApiLiveTest {
 
-   public static final String CLOUD_SERVICE = (System.getProperty("user.name") + "-jclouds-cloudService").toLowerCase();
+   private static final String CLOUD_SERVICE = (System.getProperty("user.name") + "cloudservice").toLowerCase();
 
-   private Predicate<String> operationSucceeded;
    private Predicate<CloudService> cloudServiceCreated;
    private Predicate<CloudService> cloudServiceGone;
 
-   private String location;
-
    @BeforeClass(groups = { "integration", "live" })
    public void setup() {
       super.setup();
-      // TODO: filter locations on those who have compute
-      location = Iterables.get(api.getLocationApi().list(), 0).name();
-      operationSucceeded = retry(new Predicate<String>() {
-         public boolean apply(String input) {
-            return api.getOperationApi().get(input).status() == Operation.Status.SUCCEEDED;
-         }
-      }, 600, 5, 5, SECONDS);
       cloudServiceCreated = retry(new Predicate<CloudService>() {
          public boolean apply(CloudService input) {
             return api().get(input.name()).status() == Status.CREATED;
@@ -93,6 +81,12 @@ public class CloudServiceApiLiveTest extends BaseAzureComputeApiLiveTest {
    }
 
    @Test(dependsOnMethods = "testCreate")
+   public void testGet() {
+      CloudService foundCloudService = api().get(cloudService.name());
+      assertThat(foundCloudService).isEqualToComparingFieldByField(cloudService);
+   }
+
+   @Test(dependsOnMethods = "testGet")
    public void testDelete() {
       String requestId = api().delete(cloudService.name());
       assertTrue(operationSucceeded.apply(requestId), requestId);
@@ -102,7 +96,7 @@ public class CloudServiceApiLiveTest extends BaseAzureComputeApiLiveTest {
       Logger.getAnonymousLogger().info("cloudService deleted: " + cloudService);
    }
 
-   @Override @AfterClass(groups = "live")
+   @Override @AfterClass(groups = "live", alwaysRun = true)
    protected void tearDown() {
       String requestId = api().delete(CLOUD_SERVICE);
       if (requestId != null) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiMockTest.java
index a929fff..5e3028d 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/CloudServiceApiMockTest.java
@@ -17,21 +17,18 @@
 package org.jclouds.azurecompute.features;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
 
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest;
 import org.jclouds.azurecompute.xml.CloudServiceHandlerTest;
 import org.jclouds.azurecompute.xml.ListCloudServicesHandlerTest;
 import org.testng.annotations.Test;
 
-import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 
 @Test(groups = "unit", testName = "CloudServiceApiMockTest")
 public class CloudServiceApiMockTest extends BaseAzureComputeApiMockTest {
 
-   public void listWhenFound() throws Exception {
+   public void testList() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(xmlResponse("/hostedservices.xml"));
 
@@ -46,22 +43,7 @@ public class CloudServiceApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void listWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         CloudServiceApi api = api(server.getUrl("/")).getCloudServiceApi();
-
-         assertTrue(api.list().isEmpty());
-
-         assertSent(server, "GET", "/services/hostedservices?embed-detail=true");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void getWhenFound() throws Exception {
+   public void testGet() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(xmlResponse("/hostedservice.xml"));
 
@@ -76,22 +58,7 @@ public class CloudServiceApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void getWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         CloudServiceApi api = api(server.getUrl("/")).getCloudServiceApi();
-
-         assertNull(api.get("myservice"));
-
-         assertSent(server, "GET", "/services/hostedservices/myservice?embed-detail=true");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void createWithLabelInLocation() throws Exception {
+   public void testCreateWithLabelInLocation() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -106,7 +73,7 @@ public class CloudServiceApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void deleteWhenFound() throws Exception {
+   public void testDelete() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -121,18 +88,4 @@ public class CloudServiceApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void deleteWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         CloudServiceApi api = api(server.getUrl("/")).getCloudServiceApi();
-
-         assertNull(api.delete("myservice"));
-
-         assertSent(server, "DELETE", "/services/hostedservices/myservice");
-      } finally {
-         server.shutdown();
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/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
new file mode 100644
index 0000000..9b47cd7
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiLiveTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.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.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import java.util.logging.Logger;
+
+import org.jclouds.azurecompute.compute.AzureComputeServiceAdapter;
+import org.jclouds.azurecompute.domain.CloudService;
+import org.jclouds.azurecompute.domain.Deployment;
+import org.jclouds.azurecompute.domain.DeploymentParams;
+import org.jclouds.azurecompute.domain.OSImage;
+import org.jclouds.azurecompute.domain.RoleSize;
+import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
+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;
+
+@Test(groups = "live", testName = "DeploymentApiLiveTest", singleThreaded = true)
+public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private static final String CLOUD_SERVICE = (System.getProperty("user.name") + "cloudservice").toLowerCase();
+   private static final String DEPLOYMENT = DeploymentApiLiveTest.class.getSimpleName().toLowerCase();
+
+   private Predicate<Deployment> deploymentCreated;
+   private Predicate<Deployment> deploymentGone;
+
+   private Deployment deployment;
+   private CloudService cloudService;
+
+   @BeforeClass(groups = { "integration", "live" })
+   public void setup() {
+      super.setup();
+      cloudService = getOrCreateCloudService(CLOUD_SERVICE, location);
+
+      deploymentCreated = retry(new Predicate<Deployment>() {
+         public boolean apply(Deployment input) {
+            return api().get(input.name()).status() == Deployment.Status.RUNNING;
+         }
+      }, 600, 5, 5, SECONDS);
+      deploymentGone = retry(new Predicate<Deployment>() {
+         public boolean apply(Deployment input) {
+            return api().get(input.name()) == null;
+         }
+      }, 600, 5, 5, SECONDS);
+   }
+
+   public void testCreate() {
+      final DeploymentParams params = DeploymentParams.builder()
+              .name(DEPLOYMENT)
+              .os(OSImage.Type.LINUX)
+              .sourceImageName("b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20150123-en-us-30GB")
+              .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))
+              .build();
+      String requestId = api().create(params);
+      assertTrue(operationSucceeded.apply(requestId), requestId);
+
+      deployment = api().get(DEPLOYMENT);
+      assertNotNull(deployment);
+      assertTrue(deploymentCreated.apply(deployment), deployment.toString());
+      assertThat(deployment.name()).isEqualTo(DEPLOYMENT);
+      assertThat(deployment.status()).isEqualTo(Deployment.Status.RUNNING);
+      assertThat(deployment.label()).isEqualTo(DEPLOYMENT);
+      assertThat(deployment.slot()).isEqualTo(Deployment.Slot.PRODUCTION);
+      assertThat(deployment.roles().size()).isEqualTo(1);
+      assertThat(deployment.roleInstanceList().size()).isEqualTo(1);
+      assertThat(deployment.virtualNetworkName()).isEqualTo(virtualNetworkSite.name());
+
+   }
+
+   @Test(dependsOnMethods = "testCreate")
+   public void testGet() {
+      Deployment foundDeployment = api().get(deployment.name());
+      assertThat(foundDeployment).isEqualToComparingFieldByField(deployment);
+   }
+
+   @Test(dependsOnMethods = "testGet")
+   public void testDelete() {
+      String requestId = api().delete(deployment.name());
+      assertTrue(operationSucceeded.apply(requestId), requestId);
+      Logger.getAnonymousLogger().info("operation succeeded: " + requestId);
+
+      assertTrue(deploymentGone.apply(deployment), deployment.toString());
+      Logger.getAnonymousLogger().info("deployment deleted: " + deployment);
+   }
+
+   @Override @AfterClass(groups = "live", alwaysRun = true)
+   protected void tearDown() {
+      super.tearDown();
+      if (api().get(DEPLOYMENT) != null) {
+         String requestId = api().delete(deployment.name());
+         operationSucceeded.apply(requestId);
+         Logger.getAnonymousLogger().info("deployment deleted: " + deployment);
+      }
+      if (api.getCloudServiceApi().get(CLOUD_SERVICE) != null) {
+         String requestId = api.getCloudServiceApi().delete(CLOUD_SERVICE);
+         assertTrue(operationSucceeded.apply(requestId), requestId);
+         Logger.getAnonymousLogger().info("cloudservice deleted: " + CLOUD_SERVICE);
+      }
+   }
+
+   private DeploymentApi api() {
+      return api.getDeploymentApiForService(cloudService.name());
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/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 f027932..86750cb 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,8 @@ 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 static org.testng.Assert.assertNull;
+
+import java.net.URI;
 
 import org.jclouds.azurecompute.domain.DeploymentParams;
 import org.jclouds.azurecompute.domain.OSImage;
@@ -29,28 +30,28 @@ import org.jclouds.azurecompute.xml.DeploymentHandlerTest;
 import org.jclouds.azurecompute.xml.ListOSImagesHandlerTest;
 import org.testng.annotations.Test;
 
-import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 
 @Test(groups = "unit", testName = "DeploymentApiMockTest")
 public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
 
-   public void createLinux() throws Exception {
+   public void testCreateLinux() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
       try {
          DeploymentApi api = api(server.getUrl("/")).getDeploymentApiForService("myservice");
 
-         OSImage OSImage = ListOSImagesHandlerTest.expected().get(5); // CentOS
+         OSImage OSImage = ListOSImagesHandlerTest.expected().get(5); // Centos
 
          DeploymentParams params = DeploymentParams.builder()
-               .name("mydeployment")
-               .size(RoleSize.Type.MEDIUM)
-               .sourceImageName(OSImage.name()).mediaLink(OSImage.mediaLink()).os(OSImage.os())
-               .username("username").password("testpwd")
-               .externalEndpoint(inboundTcpToLocalPort(80, 8080))
-               .externalEndpoint(inboundUdpToLocalPort(53, 53)).build();
+                 .name("mydeployment")
+                 .size(RoleSize.Type.MEDIUM)
+                 .sourceImageName(OSImage.name()).mediaLink(URI.create("https://mydeployment.blob.core.windows.net/vhds/disk-mydeployment.vhd")).os(OSImage.os())
+                 .username("username").password("testpwd")
+                 .virtualNetworkName("my-virtualNetworkName")
+                 .externalEndpoint(inboundTcpToLocalPort(80, 8080))
+                 .externalEndpoint(inboundUdpToLocalPort(53, 53)).build();
 
          assertEquals(api.create(params), "request-1");
 
@@ -60,7 +61,7 @@ public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void createWindows() throws Exception {
+   public void testCreateWindows() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -70,12 +71,13 @@ public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
          OSImage OSImage = ListOSImagesHandlerTest.expected().get(1); // Windows
 
          DeploymentParams params = DeploymentParams.builder()
-               .name("mydeployment")
-               .size(RoleSize.Type.MEDIUM)
-               .sourceImageName(OSImage.name()).mediaLink(OSImage.mediaLink()).os(OSImage.os())
-               .username("username").password("testpwd")
-               .externalEndpoint(inboundTcpToLocalPort(80, 8080))
-               .externalEndpoint(inboundUdpToLocalPort(53, 53)).build();
+                 .name("mydeployment")
+                 .size(RoleSize.Type.MEDIUM)
+                 .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();
 
          assertEquals(api.create(params), "request-1");
 
@@ -85,7 +87,7 @@ public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void getWhenFound() throws Exception {
+   public void testGet() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(xmlResponse("/deployment.xml"));
 
@@ -100,22 +102,7 @@ public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void getWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         DeploymentApi api = api(server.getUrl("/")).getDeploymentApiForService("myservice");
-
-         assertNull(api.get("mydeployment"));
-
-         assertSent(server, "GET", "/services/hostedservices/myservice/deployments/mydeployment");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void deleteWhenFound() throws Exception {
+   public void testDelete() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -130,18 +117,4 @@ public class DeploymentApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void deleteWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         DeploymentApi api = api(server.getUrl("/")).getDeploymentApiForService("myservice");
-
-         assertNull(api.delete("mydeployment"));
-
-         assertSent(server, "DELETE", "/services/hostedservices/myservice/deployments/mydeployment");
-      } finally {
-         server.shutdown();
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/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 f4090bf..e943878 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java
@@ -59,6 +59,8 @@ public class DiskApiLiveTest extends BaseAzureComputeApiLiveTest {
       }
    }
 
+   // TODO testDeleteDisk, if we will need testCreateDisk
+
    private void checkDisk(Disk disk) {
       assertNotNull(disk.name(), "Name cannot be null for: " + disk);
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiMockTest.java
index 656428c..5a901aa 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiMockTest.java
@@ -17,20 +17,17 @@
 package org.jclouds.azurecompute.features;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
 
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest;
 import org.jclouds.azurecompute.xml.ListDisksHandlerTest;
 import org.testng.annotations.Test;
 
-import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 
 @Test(groups = "unit", testName = "DiskApiMockTest")
 public class DiskApiMockTest extends BaseAzureComputeApiMockTest {
 
-   public void listWhenFound() throws Exception {
+   public void testList() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(xmlResponse("/disks.xml"));
 
@@ -45,22 +42,7 @@ public class DiskApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void listWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         DiskApi api = api(server.getUrl("/")).getDiskApi();
-
-         assertTrue(api.list().isEmpty());
-
-         assertSent(server, "GET", "/services/disks");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void deleteWhenFound() throws Exception {
+   public void testDelete() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -75,18 +57,4 @@ public class DiskApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void deleteWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         DiskApi api = api(server.getUrl("/")).getDiskApi();
-
-         assertNull(api.delete("my-disk"));
-
-         assertSent(server, "DELETE", "/services/disks/my-disk");
-      } finally {
-         server.shutdown();
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/LocationApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/LocationApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/LocationApiMockTest.java
index 9360cb0..c6f1924 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/LocationApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/LocationApiMockTest.java
@@ -22,13 +22,12 @@ import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest;
 import org.jclouds.azurecompute.xml.ListLocationsHandlerTest;
 import org.testng.annotations.Test;
 
-import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 
 @Test(groups = "unit", testName = "LocationApiMockTest")
 public class LocationApiMockTest extends BaseAzureComputeApiMockTest {
 
-   public void listWhenLocationsFound() throws Exception {
+   public void testList() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(xmlResponse("/locations.xml"));
 
@@ -43,18 +42,4 @@ public class LocationApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void listWhenLocationsNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         LocationApi api = api(server.getUrl("/")).getLocationApi();
-
-         assertThat(api.list()).isEmpty();
-
-         assertSent(server, "GET", "/locations");
-      } finally {
-         server.shutdown();
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiMockTest.java
index 70c5ec6..3f2b196 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/OSImageApiMockTest.java
@@ -17,9 +17,6 @@
 package org.jclouds.azurecompute.features;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-
 import java.net.URI;
 
 import org.jclouds.azurecompute.domain.OSImage;
@@ -28,13 +25,12 @@ import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest;
 import org.jclouds.azurecompute.xml.ListOSImagesHandlerTest;
 import org.testng.annotations.Test;
 
-import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 
 @Test(groups = "unit", testName = "OSImageApiMockTest")
 public class OSImageApiMockTest extends BaseAzureComputeApiMockTest {
 
-   public void listWhenFound() throws Exception {
+   public void testList() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(xmlResponse("/images.xml"));
 
@@ -49,22 +45,7 @@ public class OSImageApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void listWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         OSImageApi api = api(server.getUrl("/")).getOSImageApi();
-
-         assertTrue(api.list().isEmpty());
-
-         assertSent(server, "GET", "/services/images");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void add() throws Exception {
+   public void testAdd() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -82,7 +63,7 @@ public class OSImageApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void update() throws Exception {
+   public void testUpdate() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -100,7 +81,7 @@ public class OSImageApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void deleteWhenFound() throws Exception {
+   public void testDelete() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -115,18 +96,4 @@ public class OSImageApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void deleteWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         OSImageApi api = api(server.getUrl("/")).getOSImageApi();
-
-         assertNull(api.delete("myimage"));
-
-         assertSent(server, "DELETE", "/services/images/myimage");
-      } finally {
-         server.shutdown();
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/OperationApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/OperationApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/OperationApiMockTest.java
index dae2053..e3f2814 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/OperationApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/OperationApiMockTest.java
@@ -17,19 +17,17 @@
 package org.jclouds.azurecompute.features;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
 
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest;
 import org.jclouds.azurecompute.xml.OperationHandlerTest;
 import org.testng.annotations.Test;
 
-import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 
 @Test(groups = "unit", testName = "OperationApiMockTest")
 public class OperationApiMockTest extends BaseAzureComputeApiMockTest {
 
-   public void getWhenFound() throws Exception {
+   public void testGet() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(xmlResponse("/operation.xml"));
 
@@ -44,18 +42,4 @@ public class OperationApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void getWhenNotFound() throws Exception {
-      MockWebServer server = mockAzureManagementServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      try {
-         OperationApi api = api(server.getUrl("/")).getOperationApi();
-
-         assertNull(api.get("request-id"));
-
-         assertSent(server, "GET", "/operations/request-id");
-      } finally {
-         server.shutdown();
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/SubscriptionApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/SubscriptionApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/SubscriptionApiLiveTest.java
new file mode 100644
index 0000000..0bbbdb2
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/SubscriptionApiLiveTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.features;
+
+import static org.testng.Assert.assertNotNull;
+import org.jclouds.azurecompute.domain.RoleSize;
+import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "SubscriptionApiLiveTest")
+public class SubscriptionApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   @Test public void testList() {
+      for (RoleSize roleSize : api().listRoleSizes()) {
+         checkLocation(roleSize);
+      }
+   }
+
+   private void checkLocation(RoleSize roleSize) {
+      assertNotNull(roleSize.name(), "Name cannot be null for a Location.");
+      assertNotNull(roleSize.label(), "Label cannot be null for: " + roleSize);
+      assertNotNull(roleSize.cores(), "Cores cannot be null for: " + roleSize.name());
+   }
+
+   private SubscriptionApi api() {
+      return api.getSubscriptionApi();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/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
new file mode 100644
index 0000000..d61f085
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiLiveTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.features;
+
+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 java.util.logging.Logger;
+
+import org.jclouds.azurecompute.compute.AzureComputeServiceAdapter;
+import org.jclouds.azurecompute.domain.CloudService;
+import org.jclouds.azurecompute.domain.Deployment;
+import org.jclouds.azurecompute.domain.Deployment.RoleInstance;
+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.internal.BaseAzureComputeApiLiveTest;
+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;
+
+@Test(groups = "live", testName = "VirtualMachineApiLiveTest", singleThreaded = true)
+public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private static final String CLOUD_SERVICE = (System.getProperty("user.name") + "-jclouds-cloudService").toLowerCase();
+   private static final String DEPLOYMENT = DeploymentApiLiveTest.class.getSimpleName().toLowerCase();
+
+   private String roleName;
+   private Predicate<String> roleInstanceReady;
+   private Predicate<String> roleInstanceStopped;
+   private CloudService cloudService;
+
+   @BeforeClass(groups = { "integration", "live" })
+   public void setup() {
+      super.setup();
+      cloudService = getOrCreateCloudService(CLOUD_SERVICE, location);
+
+      roleInstanceReady = retry(new Predicate<String>() {
+         @Override
+         public boolean apply(String input) {
+            RoleInstance roleInstance = getFirstRoleInstanceInDeployment(input);
+            return roleInstance != null && roleInstance.instanceStatus() == READY_ROLE;
+         }
+      }, 600, 5, 5, SECONDS);
+
+      roleInstanceStopped = retry(new Predicate<String>() {
+         @Override
+         public boolean apply(String input) {
+            RoleInstance roleInstance = getFirstRoleInstanceInDeployment(input);
+            return roleInstance != null && roleInstance.instanceStatus() == Deployment.InstanceStatus.STOPPED_VM;
+         }
+      }, 600, 5, 5, SECONDS);
+
+      final DeploymentParams params = DeploymentParams.builder()
+              .name(DEPLOYMENT)
+              .os(OSImage.Type.LINUX)
+              .sourceImageName("b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20150123-en-us-30GB")
+              .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))
+              .build();
+      getOrCreateDeployment(cloudService.name(), params);
+      RoleInstance roleInstance = getFirstRoleInstanceInDeployment(DEPLOYMENT);
+      assertTrue(roleInstanceReady.apply(DEPLOYMENT), roleInstance.toString());
+      roleName = roleInstance.roleName();
+   }
+
+   public void testUpdate() {
+      Role role = api().getRole(roleName);
+      String requestId = api().updateRole(roleName,
+              Role.create(
+                      role.roleName(),
+                      role.roleType(),
+                      role.vmImage(),
+                      role.mediaLocation(),
+                      role.configurationSets(),
+                      role.resourceExtensionReferences(),
+                      role.availabilitySetName(),
+                      role.dataVirtualHardDisks(),
+                      role.osVirtualHardDisk(),
+                      role.roleSize(),
+                      role.provisionGuestAgent(),
+                      role.defaultWinRmCertificateThumbprint()));
+      assertTrue(operationSucceeded.apply(requestId), requestId);
+      Logger.getAnonymousLogger().info("operation succeeded: " + requestId);
+   }
+
+   @Test(dependsOnMethods = "testUpdate")
+   public void testShutdown() {
+      String requestId = api().shutdown(roleName);
+      assertTrue(operationSucceeded.apply(requestId), requestId);
+      Logger.getAnonymousLogger().info("operation succeeded: " + requestId);
+
+      RoleInstance roleInstance = getFirstRoleInstanceInDeployment(DEPLOYMENT);
+      assertTrue(roleInstanceStopped.apply(DEPLOYMENT), roleInstance.toString());
+      Logger.getAnonymousLogger().info("roleInstance stopped: " + roleInstance);
+   }
+
+   @Test(dependsOnMethods = "testShutdown")
+   public void testStart() {
+      String requestId = api().start(roleName);
+      assertTrue(operationSucceeded.apply(requestId), requestId);
+      Logger.getAnonymousLogger().info("operation succeeded: " + requestId);
+
+      RoleInstance roleInstance = getFirstRoleInstanceInDeployment(DEPLOYMENT);
+      assertTrue(roleInstanceReady.apply(DEPLOYMENT), roleInstance.toString());
+      Logger.getAnonymousLogger().info("roleInstance started: " + roleInstance);
+   }
+
+   @Test(dependsOnMethods = "testStart")
+   public void testRestart() {
+      String requestId = api().restart(roleName);
+      assertTrue(operationSucceeded.apply(requestId), requestId);
+      Logger.getAnonymousLogger().info("operation succeeded: " + requestId);
+
+      RoleInstance roleInstance = getFirstRoleInstanceInDeployment(DEPLOYMENT);
+      assertTrue(roleInstanceReady.apply(DEPLOYMENT), roleInstance.toString());
+      Logger.getAnonymousLogger().info("roleInstance restarted: " + roleInstance);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void cleanup() {
+      if (api.getDeploymentApiForService(cloudService.name()).get(DEPLOYMENT) != null) {
+         String requestId = api.getDeploymentApiForService(cloudService.name()).delete(DEPLOYMENT);
+         operationSucceeded.apply(requestId);
+         Logger.getAnonymousLogger().info("deployment deleted: " + DEPLOYMENT);
+      }
+   }
+
+   private VirtualMachineApi api() {
+      return api.getVirtualMachineApiForDeploymentInService(DEPLOYMENT, cloudService.name());
+   }
+
+   private RoleInstance getFirstRoleInstanceInDeployment(String deployment) {
+      return Iterables.getOnlyElement(api.getDeploymentApiForService(cloudService.name()).get(deployment).roleInstanceList());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiMockTest.java
index 41cce90..6c1cc65 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiMockTest.java
@@ -18,7 +18,9 @@ package org.jclouds.azurecompute.features;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.jclouds.azurecompute.domain.Role;
 import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest;
+import org.jclouds.azurecompute.xml.RoleHandlerTest;
 import org.testng.annotations.Test;
 
 import com.squareup.okhttp.mockwebserver.MockWebServer;
@@ -26,7 +28,7 @@ import com.squareup.okhttp.mockwebserver.MockWebServer;
 @Test(groups = "unit", testName = "VirtualMachineApiMockTest")
 public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
 
-   public void start() throws Exception {
+   public void testStart() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -43,7 +45,7 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void restart() throws Exception {
+   public void testRestart() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -60,7 +62,7 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void shutdown() throws Exception {
+   public void testShutdown() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -77,7 +79,7 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
-   public void capture() throws Exception {
+   public void testCapture() throws Exception {
       MockWebServer server = mockAzureManagementServer();
       server.enqueue(requestIdResponse("request-1"));
 
@@ -94,6 +96,22 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
       }
    }
 
+   public void testUpdate() throws Exception {
+      MockWebServer server = mockAzureManagementServer();
+      server.enqueue(requestIdResponse("request-1"));
+
+      try {
+         VirtualMachineApi api = vmApi(server);
+
+         Role role = RoleHandlerTest.expected();
+         assertThat(api.updateRole("testvnetsg02", role)).isEqualTo("request-1");
+
+         assertSent(server, "PUT", "/services/hostedservices/my-service/deployments/mydeployment/roles/testvnetsg02");
+      } finally {
+         server.shutdown();
+      }
+   }
+
    private VirtualMachineApi vmApi(MockWebServer server) {
       return api(server.getUrl("/")).getVirtualMachineApiForDeploymentInService("mydeployment", "my-service");
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/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
new file mode 100644
index 0000000..601ea8b
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiLiveTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.features;
+
+import static com.google.common.base.CaseFormat.LOWER_UNDERSCORE;
+import static com.google.common.base.CaseFormat.UPPER_CAMEL;
+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.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.logging.Logger;
+
+import org.jclouds.azurecompute.domain.NetworkConfiguration;
+import org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkConfiguration;
+import org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkSite;
+import org.jclouds.azurecompute.domain.Operation;
+import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "live", testName = "VirtualNetworkApiLiveTest", singleThreaded = true)
+public class VirtualNetworkApiLiveTest extends BaseAzureComputeApiLiveTest {
+
+   private NetworkConfiguration originalNetworkConfiguration;
+   private Predicate<String> operationSucceeded;
+
+   @BeforeClass
+   public void init() {
+      operationSucceeded = retry(new Predicate<String>() {
+         public boolean apply(String input) {
+            return api.getOperationApi().get(input).status() == Operation.Status.SUCCEEDED;
+         }
+      }, 600, 5, 5, SECONDS);
+
+      originalNetworkConfiguration = api().getNetworkConfiguration();
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void cleanup() {
+      if (originalNetworkConfiguration != null) {
+         api().set(originalNetworkConfiguration);
+      } else {
+         api().set(NetworkConfiguration.create(VirtualNetworkConfiguration.create(null, ImmutableList.<VirtualNetworkSite>of())));
+      }
+   }
+
+   @Test public void testList() {
+      for (VirtualNetworkSite virtualNetworkSite : api().list()) {
+         checkVirtualNetworkSite(virtualNetworkSite);
+      }
+   }
+
+   private void checkVirtualNetworkSite(VirtualNetworkSite virtualNetworkSite) {
+      assertNotNull(virtualNetworkSite.name(), "Name cannot be null for a VirtualNetworkSite.");
+      assertNotNull(virtualNetworkSite.addressSpace(), "AddressSpace cannot be null for: " + virtualNetworkSite);
+      assertNotNull(virtualNetworkSite.subnets(), "Subnets cannot be null for: " + virtualNetworkSite);
+   }
+
+   @Test public void testSet() {
+      String id = "39d0d14b-fc1d-496f-8928-b5a13a6f4123";
+      final String name = UPPER_CAMEL.to(LOWER_UNDERSCORE, getClass().getSimpleName());
+      final String location = "West Europe";
+      final NetworkConfiguration.AddressSpace addressSpace = NetworkConfiguration.AddressSpace.create("10.0.0.1/20");
+      final ImmutableList<NetworkConfiguration.Subnet> subnets = ImmutableList.of(NetworkConfiguration.Subnet.create("Subnet-jclouds", "10.0.0.1/23", null));
+      final VirtualNetworkSite virtualNetworkSite = VirtualNetworkSite.create(id, name, location, addressSpace, subnets);
+      String requestId = api().set(NetworkConfiguration.create(VirtualNetworkConfiguration.create(null, ImmutableList.of(virtualNetworkSite))));
+      assertTrue(operationSucceeded.apply(requestId), requestId);
+      Logger.getAnonymousLogger().info("operation succeeded: " + requestId);
+
+      final NetworkConfiguration networkConfiguration = api().getNetworkConfiguration();
+      assertThat(networkConfiguration.virtualNetworkConfiguration().dns()).isEqualTo(networkConfiguration.virtualNetworkConfiguration().dns());
+      assertThat(networkConfiguration.virtualNetworkConfiguration().virtualNetworkSites().size()).isEqualTo(1);
+      assertThat(networkConfiguration.virtualNetworkConfiguration().virtualNetworkSites().get(0).name()).isEqualTo(name);
+      assertThat(networkConfiguration.virtualNetworkConfiguration().virtualNetworkSites().get(0).location()).isEqualTo(location);
+      assertThat(networkConfiguration.virtualNetworkConfiguration().virtualNetworkSites().get(0).addressSpace()).isEqualTo(addressSpace);
+      assertThat(networkConfiguration.virtualNetworkConfiguration().virtualNetworkSites().get(0).subnets()).isEqualTo(subnets);
+   }
+
+   @Test(dependsOnMethods = "testSet")
+   public void testGetNetworkConfiguration() {
+      final NetworkConfiguration networkConfiguration = api().getNetworkConfiguration();
+      assertThat(networkConfiguration).isNotNull();
+      for (VirtualNetworkSite virtualNetworkSite : networkConfiguration.virtualNetworkConfiguration().virtualNetworkSites()) {
+         assertThat(virtualNetworkSite.name()).isNotEqualTo("not-existing");
+      }
+   }
+
+   private VirtualNetworkApi api() {
+      return api.getVirtualNetworkApi();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e97ddaee/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiMockTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiMockTest.java
new file mode 100644
index 0000000..c55884d
--- /dev/null
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualNetworkApiMockTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.features;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.testng.Assert.assertEquals;
+import java.util.UUID;
+
+import org.jclouds.azurecompute.domain.NetworkConfiguration;
+import org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkConfiguration;
+import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest;
+import org.jclouds.azurecompute.xml.ListVirtualNetworkSitesHandlerTest;
+import org.jclouds.azurecompute.xml.NetworkConfigurationHandlerTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+@Test(groups = "unit", testName = "VirtualNetworkApiMockTest")
+public class VirtualNetworkApiMockTest extends BaseAzureComputeApiMockTest {
+
+   public void testGetNetworkConfiguration() throws Exception {
+      MockWebServer server = mockAzureManagementServer();
+      server.enqueue(xmlResponse("/networkconfiguration.xml"));
+
+      try {
+         VirtualNetworkApi api = virtualNetworkApi(server);
+
+         assertEquals(api.getNetworkConfiguration(), NetworkConfigurationHandlerTest.expected());
+
+         assertSent(server, "GET", "/services/networking/media");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testSet() throws Exception {
+      MockWebServer server = mockAzureManagementServer();
+      server.enqueue(requestIdResponse("request-1"));
+
+      try {
+         VirtualNetworkApi api = virtualNetworkApi(server);
+
+         assertThat(api.set(NetworkConfiguration.create(
+                 VirtualNetworkConfiguration.create(null,
+                         ImmutableList.of(NetworkConfiguration.VirtualNetworkSite.create(
+                                 UUID.randomUUID().toString(),
+                                 "jclouds-virtual-network",
+                                 "West Europe",
+                                 NetworkConfiguration.AddressSpace.create("10.0.0.0/20"),
+                                 ImmutableList.of(NetworkConfiguration.Subnet.create("jclouds-1", "10.0.0.0/23",
+                                         null)))))))
+                 ).isEqualTo("request-1");
+
+         assertSent(server, "PUT", "/services/networking/media");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testList() throws Exception {
+      MockWebServer server = mockAzureManagementServer();
+      server.enqueue(xmlResponse("/virtualnetworksites.xml"));
+
+      try {
+         VirtualNetworkApi api = virtualNetworkApi(server);
+
+         assertThat(api.list()).containsExactlyElementsOf(ListVirtualNetworkSitesHandlerTest.expected());
+
+         assertSent(server, "GET",
+                 "/services/networking/virtualnetwork");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+
+   private VirtualNetworkApi virtualNetworkApi(MockWebServer server) {
+      return api(server.getUrl("/")).getVirtualNetworkApi();
+   }
+}