You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/07/17 21:46:15 UTC

[1/4] jclouds-labs git commit: [JCLOUDS-664] make getImage(id) only do a single API request

Repository: jclouds-labs
Updated Branches:
  refs/heads/master b975be5e8 -> 787af1dc8


[JCLOUDS-664] make getImage(id) only do a single API request

* Fill in the private IP addresses in NodeMetadata
* Unify how getNode and listNodes build the VMDeployment
* Change VMDeployment to use AutoValue


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

Branch: refs/heads/master
Commit: 913e4be9d55ac3defbc430f0dc7f995ba690b2e9
Parents: b975be5
Author: Ladislav Thon <lt...@redhat.com>
Authored: Mon Jul 11 10:32:11 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Sun Jul 17 23:26:26 2016 +0200

----------------------------------------------------------------------
 .../arm/compute/AzureComputeServiceAdapter.java | 94 +++++++++++---------
 .../functions/DeploymentToNodeMetadata.java     | 49 ++++++----
 .../azurecompute/arm/domain/VMDeployment.java   | 36 ++++++--
 3 files changed, 113 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/913e4be9/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
index 48c7672..53e49ee 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceAdapter.java
@@ -26,6 +26,7 @@ import java.util.Arrays;
 import java.util.Collection;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Resource;
@@ -42,6 +43,7 @@ import org.jclouds.azurecompute.arm.compute.functions.VMImageToImage;
 import org.jclouds.azurecompute.arm.domain.Deployment;
 import org.jclouds.azurecompute.arm.domain.DeploymentBody;
 import org.jclouds.azurecompute.arm.domain.DeploymentProperties;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
 import org.jclouds.azurecompute.arm.domain.ResourceProviderMetaData;
 import org.jclouds.azurecompute.arm.domain.VMImage;
 import org.jclouds.azurecompute.arm.domain.VMHardware;
@@ -51,9 +53,9 @@ import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
 import org.jclouds.azurecompute.arm.domain.SKU;
 import org.jclouds.azurecompute.arm.domain.VMDeployment;
 import org.jclouds.azurecompute.arm.domain.VirtualMachine;
+import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
 import org.jclouds.azurecompute.arm.features.DeploymentApi;
 import org.jclouds.azurecompute.arm.features.OSImageApi;
-import org.jclouds.azurecompute.arm.features.VirtualMachineApi;
 import org.jclouds.azurecompute.arm.util.DeploymentTemplateBuilder;
 import org.jclouds.compute.ComputeServiceAdapter;
 import org.jclouds.compute.domain.Template;
@@ -131,8 +133,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<VMDeplo
             Deployment deployment = deploymentApi.create(name, deploymentTemplate);
 
             if (deployment != null) {
-               VMDeployment vmDeployment = new VMDeployment();
-               vmDeployment.deployment = deployment;
+               VMDeployment vmDeployment = VMDeployment.create(deployment);
                deployments.add(vmDeployment);
             } else {
                logger.debug("Failed to create deployment!");
@@ -272,13 +273,15 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<VMDeplo
          return ref;
       }
 
-      Iterable<VMImage> images = listImages();
+      String location = fields[0];
+      String publisher = fields[1];
+      String offer = fields[2];
+      String sku = fields[3];
 
-      for (VMImage image : images) {
-         String imageId = VMImageToImage.encodeFieldsToUniqueId(image);
-         if (id.equals(imageId)){
-            return image;
-         }
+      OSImageApi osImageApi = api.getOSImageApi(location);
+      List<Version> versions = osImageApi.listVersions(publisher, offer, sku);
+      if (!versions.isEmpty()) {
+         return VMImage.create(publisher, offer, sku, versions.get(0).name(), location, false);
       }
       return null;
    }
@@ -324,21 +327,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<VMDeplo
       Deployment deployment = api.getDeploymentApi(azureGroup).get(id);
       if (deployment == null)
          return null;
-      String resourceGroup = getResourceGroupFromId(deployment.id());
-      VMDeployment vmDeployment = new VMDeployment();
-      vmDeployment.deployment = deployment;
-      List<PublicIPAddress> list = getIPAddresses(deployment);
-      vmDeployment.ipAddressList = list;
-      VirtualMachine vm = api.getVirtualMachineApi(azureGroup).get(id);
-      vmDeployment.virtualMachine = vm;
-      vmDeployment.vm = api.getVirtualMachineApi(azureGroup).getInstanceDetails(id);
-      if (vm != null && vm.tags() != null) {
-         vmDeployment.userMetaData = vm.tags();
-         String tagString = vmDeployment.userMetaData.get("tags");
-         List<String> tags = Arrays.asList(tagString.split(","));
-         vmDeployment.tags = tags;
-      }
-      return vmDeployment;
+      return convertDeploymentToVMDeployment(deployment);
    }
 
    @Override
@@ -384,30 +373,49 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<VMDeplo
       return list;
    }
 
+   private List<NetworkInterfaceCard> getNetworkInterfaceCards(Deployment deployment) {
+      List<NetworkInterfaceCard> result = new ArrayList<NetworkInterfaceCard>();
+
+      String resourceGroup = getResourceGroupFromId(deployment.id());
+
+      if (deployment.properties() != null && deployment.properties().dependencies() != null) {
+         for (Deployment.Dependency dependency : deployment.properties().dependencies()) {
+            if (dependency.resourceType().equals("Microsoft.Network/networkInterfaces")) {
+               String resourceName = dependency.resourceName();
+               NetworkInterfaceCard nic = api.getNetworkInterfaceCardApi(resourceGroup).get(resourceName);
+               result.add(nic);
+            }
+         }
+      }
+
+      return result;
+   }
+
+   private VMDeployment convertDeploymentToVMDeployment(Deployment deployment) {
+      String id = deployment.id();
+      String resourceGroup = getResourceGroupFromId(id);
+
+      List<PublicIPAddress> ipAddressList = getIPAddresses(deployment);
+      List<NetworkInterfaceCard> networkInterfaceCards = getNetworkInterfaceCards(deployment);
+      VirtualMachine vm = api.getVirtualMachineApi(azureGroup).get(id);
+      VirtualMachineInstance vmInstanceDetails = api.getVirtualMachineApi(azureGroup).getInstanceDetails(id);
+      Map<String, String> userMetaData = null;
+      Iterable<String> tags = null;
+      if (vm != null && vm.tags() != null) {
+         userMetaData = vm.tags();
+         String tagString = userMetaData.get("tags");
+         tags = Arrays.asList(tagString.split(","));
+      }
+      return VMDeployment.create(deployment, ipAddressList, vmInstanceDetails, vm, networkInterfaceCards, userMetaData, tags);
+   }
+
    @Override
    public Iterable<VMDeployment> listNodes() {
       List<Deployment> deployments = api.getDeploymentApi(azureGroup).list();
 
       List<VMDeployment> vmDeployments = new ArrayList<VMDeployment>();
-
       for (Deployment d : deployments){
-         VMDeployment vmDeployment = new VMDeployment();
-         vmDeployment.deployment = d;
-         VirtualMachineApi vmApi = api.getVirtualMachineApi(azureGroup);
-         vmDeployment.vm = vmApi.getInstanceDetails(d.name());
-         List<PublicIPAddress> list = getIPAddresses(d);
-         vmDeployment.ipAddressList = list;
-
-         VirtualMachine vm = vmApi.get(d.name());
-         vmDeployment.virtualMachine = vm;
-
-         if (vm != null && vm.tags() != null) {
-            vmDeployment.userMetaData = vm.tags();
-            String tagString = vmDeployment.userMetaData.get("tags");
-            List<String> tags = Arrays.asList(tagString.split(","));
-            vmDeployment.tags = tags;
-         }
-         vmDeployments.add(vmDeployment);
+         vmDeployments.add(convertDeploymentToVMDeployment(d));
       }
       return vmDeployments;
    }
@@ -417,7 +425,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<VMDeplo
       return Iterables.filter(listNodes(), new Predicate<VMDeployment>() {
          @Override
          public boolean apply(final VMDeployment input) {
-            return Iterables.contains(ids, input.deployment.name());
+            return Iterables.contains(ids, input.deployment().name());
          }
       });
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/913e4be9/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/DeploymentToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/DeploymentToNodeMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/DeploymentToNodeMetadata.java
index 40e09b7..8ea8235 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/DeploymentToNodeMetadata.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/DeploymentToNodeMetadata.java
@@ -27,6 +27,8 @@ import org.jclouds.azurecompute.arm.AzureComputeApi;
 import org.jclouds.azurecompute.arm.domain.ComputeNode;
 import org.jclouds.azurecompute.arm.domain.Deployment;
 import org.jclouds.azurecompute.arm.domain.ImageReference;
+import org.jclouds.azurecompute.arm.domain.IpConfiguration;
+import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
 import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
 import org.jclouds.azurecompute.arm.domain.VMDeployment;
 import org.jclouds.azurecompute.arm.domain.VMHardware;
@@ -111,20 +113,20 @@ public class DeploymentToNodeMetadata implements Function<VMDeployment, NodeMeta
    @Override
    public NodeMetadata apply(final VMDeployment from) {
       final NodeMetadataBuilder builder = new NodeMetadataBuilder();
-      final Deployment deployment = from.deployment;
+      final Deployment deployment = from.deployment();
       builder.id(deployment.name());
       builder.providerId(deployment.name());
       builder.name(deployment.name());
       String group =  this.nodeNamingConvention.extractGroup(deployment.name());
       builder.group(group);
-      if (from.tags != null)
-         builder.tags(from.tags);
-      if (from.userMetaData != null)
-         builder.userMetadata(from.userMetaData);
+      if (from.tags() != null)
+         builder.tags(from.tags());
+      if (from.userMetaData() != null)
+         builder.userMetadata(from.userMetaData());
 
       NodeMetadata.Status status = STATUS_TO_NODESTATUS.get(provisioningStateFromString(deployment.properties().provisioningState()));
-      if (status == NodeMetadata.Status.RUNNING && from.vm != null && from.vm.statuses() != null) {
-         List<VirtualMachineInstance.VirtualMachineStatus> statuses = from.vm.statuses();
+      if (status == NodeMetadata.Status.RUNNING && from.vm() != null && from.vm().statuses() != null) {
+         List<VirtualMachineInstance.VirtualMachineStatus> statuses = from.vm().statuses();
          for (int c = 0; c < statuses.size(); c++) {
             if (statuses.get(c).code().substring(0, 10).equals("PowerState")) {
                if (statuses.get(c).displayStatus().equals("VM running")) {
@@ -139,11 +141,11 @@ public class DeploymentToNodeMetadata implements Function<VMDeployment, NodeMeta
 
       builder.status(status);
 
-      if (from.vm != null) {
+      if (from.vm() != null) {
          builder.hostname(deployment.name() + "pc");
       }
 
-      Credentials credentials = credentialStore.get("node#" + from.deployment.name());
+      Credentials credentials = credentialStore.get("node#" + from.deployment().name());
       if (credentials != null && credentials.identity.equals(JCLOUDS_DEFAULT_USERNAME)) {
          credentials = new Credentials(AZURE_LOGIN_USERNAME, credentials.credential);
       }
@@ -162,9 +164,9 @@ public class DeploymentToNodeMetadata implements Function<VMDeployment, NodeMeta
       builder.credentials(LoginCredentials.fromCredentials(credentials));
 
       final Set<String> publicIpAddresses = Sets.newLinkedHashSet();
-      if (from.ipAddressList != null) {
-         for (int c = 0; c < from.ipAddressList.size(); c++) {
-            PublicIPAddress ip = from.ipAddressList.get(c);
+      if (from.ipAddressList() != null) {
+         for (int c = 0; c < from.ipAddressList().size(); c++) {
+            PublicIPAddress ip = from.ipAddressList().get(c);
             if (ip != null && ip.properties() != null && ip.properties().ipAddress() != null)
             {
                publicIpAddresses.add(ip.properties().ipAddress());
@@ -174,10 +176,25 @@ public class DeploymentToNodeMetadata implements Function<VMDeployment, NodeMeta
          if (publicIpAddresses.size() > 0)
             builder.publicAddresses(publicIpAddresses);
       }
+      final Set<String> privateIpAddresses = Sets.newLinkedHashSet();
+      if (from.networkInterfaceCards() != null) {
+         for (NetworkInterfaceCard nic : from.networkInterfaceCards()) {
+            if (nic != null && nic.properties() != null && nic.properties().ipConfigurations() != null) {
+               for (IpConfiguration ip : nic.properties().ipConfigurations()) {
+                  if (ip != null && ip.properties() != null && ip.properties().privateIPAddress() != null) {
+                     privateIpAddresses.add(ip.properties().privateIPAddress());
+                  }
+               }
+            }
+         }
+         if (!privateIpAddresses.isEmpty()) {
+            builder.privateAddresses(privateIpAddresses);
+         }
+      }
 
       org.jclouds.azurecompute.arm.domain.Location myLocation = null;
-      if (from.virtualMachine != null) {
-         String locationName = from.virtualMachine.location();
+      if (from.virtualMachine() != null) {
+         String locationName = from.virtualMachine().location();
          List<org.jclouds.azurecompute.arm.domain.Location> locations = api.getLocationApi().list();
 
          for (org.jclouds.azurecompute.arm.domain.Location location : locations) {
@@ -189,7 +206,7 @@ public class DeploymentToNodeMetadata implements Function<VMDeployment, NodeMeta
          Location jLocation = this.locationToLocation.apply(myLocation);
          builder.location(jLocation);
 
-         ImageReference imageReference = from.virtualMachine.properties().storageProfile().imageReference();
+         ImageReference imageReference = from.virtualMachine().properties().storageProfile().imageReference();
 
          if (imageReference != null) {
             VMImage vmImage = VMImage.create(imageReference.publisher(), imageReference.offer(), imageReference.sku(),
@@ -199,7 +216,7 @@ public class DeploymentToNodeMetadata implements Function<VMDeployment, NodeMeta
          }
 
          VMSize myVMSize = null;
-         String vmSizeName = from.virtualMachine.properties().hardwareProfile().vmSize();
+         String vmSizeName = from.virtualMachine().properties().hardwareProfile().vmSize();
          List<VMSize> vmSizes = api.getVMSizeApi(locationName).list();
          for (VMSize vmSize : vmSizes) {
             if (vmSize.name().equals(vmSizeName)) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/913e4be9/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMDeployment.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMDeployment.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMDeployment.java
index c663944..948e69b 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMDeployment.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/domain/VMDeployment.java
@@ -16,21 +16,43 @@
  */
 package org.jclouds.azurecompute.arm.domain;
 
+import com.google.auto.value.AutoValue;
+import org.jclouds.javax.annotation.Nullable;
 
 import java.util.List;
 import java.util.Map;
 
-public class VMDeployment {
+@AutoValue
+public abstract class VMDeployment {
 
-   public Deployment deployment;
+   public abstract Deployment deployment();
 
-   public List<PublicIPAddress> ipAddressList;
+   @Nullable
+   public abstract List<PublicIPAddress> ipAddressList();
 
-   public VirtualMachineInstance vm;
+   @Nullable
+   public abstract VirtualMachineInstance vm();
 
-   public VirtualMachine virtualMachine;
+   @Nullable
+   public abstract VirtualMachine virtualMachine();
 
-   public Map<String, String> userMetaData;
+   @Nullable
+   public abstract List<NetworkInterfaceCard> networkInterfaceCards();
 
-   public Iterable<String> tags;
+   @Nullable
+   public abstract Map<String, String> userMetaData();
+
+   @Nullable
+   public abstract Iterable<String> tags();
+
+   public static VMDeployment create(Deployment deployment) {
+      return create(deployment, null, null, null, null, null, null);
+   }
+
+   public static VMDeployment create(Deployment deployment, List<PublicIPAddress> ipAddressList,
+                                     VirtualMachineInstance vm, VirtualMachine virtualMachine,
+                                     List<NetworkInterfaceCard> networkInterfaceCards, Map<String, String> userMetaData,
+                                     Iterable<String> tags) {
+      return new AutoValue_VMDeployment(deployment, ipAddressList, vm, virtualMachine, networkInterfaceCards, userMetaData, tags);
+   }
 }


[4/4] jclouds-labs git commit: [JCLOUDS-1139] add an option to not deallocate a VM when suspending

Posted by na...@apache.org.
[JCLOUDS-1139] add an option to not deallocate a VM when suspending


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

Branch: refs/heads/master
Commit: 787af1dc812800075b8efefa86379525159ada90
Parents: e1c55b4
Author: Ladislav Thon <lt...@redhat.com>
Authored: Thu Jul 14 15:48:37 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Sun Jul 17 23:35:31 2016 +0200

----------------------------------------------------------------------
 .../jclouds/azurecompute/AzureComputeProviderMetadata.java  | 2 ++
 .../azurecompute/compute/AzureComputeServiceAdapter.java    | 5 ++++-
 .../compute/config/AzureComputeServiceContextModule.java    | 9 +++++++++
 .../jclouds/azurecompute/config/AzureComputeProperties.java | 2 ++
 4 files changed, 17 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/787af1dc/azurecompute/src/main/java/org/jclouds/azurecompute/AzureComputeProviderMetadata.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/AzureComputeProviderMetadata.java b/azurecompute/src/main/java/org/jclouds/azurecompute/AzureComputeProviderMetadata.java
index 731b52f..4a82f67 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/AzureComputeProviderMetadata.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/AzureComputeProviderMetadata.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.azurecompute;
 
+import static org.jclouds.azurecompute.config.AzureComputeProperties.DEALLOCATE_WHEN_SUSPENDING;
 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;
@@ -53,6 +54,7 @@ public class AzureComputeProviderMetadata extends BaseProviderMetadata {
       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}");
+      properties.setProperty(DEALLOCATE_WHEN_SUSPENDING, "true");
       return properties;
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/787af1dc/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
index 394dc65..ea579de 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
@@ -72,6 +72,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Deploym
 
    private static final String DEFAULT_LOGIN_PASSWORD = "Azur3Compute!";
    public static final String POST_SHUTDOWN_ACTION = "StoppedDeallocated";
+   private static final String POST_SHUTDOWN_ACTION_NO_DEALLOCATE = "Stopped";
 
    @Resource
    @Named(ComputeServiceConstants.COMPUTE_LOGGER)
@@ -419,7 +420,9 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Deploym
       final CloudService cloudService = api.getCloudServiceApi().get(id);
       if (cloudService != null) {
          logger.debug("Suspending %s ...", id);
-         trackRequest(api.getVirtualMachineApiForDeploymentInService(id, cloudService.name()).shutdown(id, POST_SHUTDOWN_ACTION));
+         String postShutdownAction = azureComputeConstants.deallocateWhenSuspending()
+                 ? POST_SHUTDOWN_ACTION : POST_SHUTDOWN_ACTION_NO_DEALLOCATE;
+         trackRequest(api.getVirtualMachineApiForDeploymentInService(id, cloudService.name()).shutdown(id, postShutdownAction));
          logger.debug("Suspended %s", id);
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/787af1dc/azurecompute/src/main/java/org/jclouds/azurecompute/compute/config/AzureComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/config/AzureComputeServiceContextModule.java b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/config/AzureComputeServiceContextModule.java
index 8d902d1..e6d8812 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/config/AzureComputeServiceContextModule.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/config/AzureComputeServiceContextModule.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.azurecompute.compute.config;
 
+import static org.jclouds.azurecompute.config.AzureComputeProperties.DEALLOCATE_WHEN_SUSPENDING;
 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;
@@ -122,6 +123,10 @@ public class AzureComputeServiceContextModule
       @Inject
       private String tcpRuleRegexpProperty;
 
+      @Named(DEALLOCATE_WHEN_SUSPENDING)
+      @Inject
+      private String deallocateWhenSuspending;
+
       public Long operationTimeout() {
          return Long.parseLong(operationTimeoutProperty);
       }
@@ -141,6 +146,10 @@ public class AzureComputeServiceContextModule
       public String tcpRuleRegexp() {
          return tcpRuleRegexpProperty;
       }
+
+      public boolean deallocateWhenSuspending() {
+         return Boolean.parseBoolean(deallocateWhenSuspending);
+      }
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/787af1dc/azurecompute/src/main/java/org/jclouds/azurecompute/config/AzureComputeProperties.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/config/AzureComputeProperties.java b/azurecompute/src/main/java/org/jclouds/azurecompute/config/AzureComputeProperties.java
index 9592f4c..381e1b8 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/config/AzureComputeProperties.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/config/AzureComputeProperties.java
@@ -31,4 +31,6 @@ public class AzureComputeProperties {
 
    public static final String TCP_RULE_REGEXP = "jclouds.azurecompute.tcp.rule.regexp";
 
+   public static final String DEALLOCATE_WHEN_SUSPENDING = "jclouds.azurecompute.deallocate.when.suspending";
+
 }


[2/4] jclouds-labs git commit: [JCLOUDS-1141] azurecompute - fix XML generated by updateRole REST call

Posted by na...@apache.org.
[JCLOUDS-1141] azurecompute - fix XML generated by updateRole REST call


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

Branch: refs/heads/master
Commit: 4e37f701f6864439ff7c5a5480012903a0c97f73
Parents: 913e4be
Author: Josef Cacek <jc...@redhat.com>
Authored: Sat Jul 16 12:50:42 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Sun Jul 17 23:30:03 2016 +0200

----------------------------------------------------------------------
 .../jclouds/azurecompute/binders/RoleToXML.java | 17 +++++----
 .../features/VirtualMachineApiMockTest.java     | 14 +++++++-
 .../src/test/resources/role-update-body.xml     | 36 ++++++++++++++++++++
 3 files changed, 59 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4e37f701/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
index e5f1b26..7c8d529 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
@@ -24,6 +24,9 @@ import org.jclouds.rest.Binder;
 
 import com.jamesmurty.utils.XMLBuilder;
 
+/**
+ * Generates XML request body for the <a href="https://msdn.microsoft.com/en-us/library/azure/jj157187.aspx">UpdateRole REST request</a>.
+ */
 public class RoleToXML implements Binder {
 
    @Override
@@ -32,14 +35,13 @@ public class RoleToXML implements Binder {
       Role role = Role.class.cast(input);
 
       try {
-         XMLBuilder builder = XMLBuilder.create("PersistentVMRole", "http://schemas.microsoft.com/windowsazure")
-                 .e("RoleName").t(role.roleName()).up()
-                 .e("RoleType").t(role.roleType()).up()
-                 .e("ConfigurationSets");
-
+         XMLBuilder builder = XMLBuilder.create("PersistentVMRole", "http://schemas.microsoft.com/windowsazure");
+         builder.e("RoleName").t(role.roleName()).up()
+                 .e("RoleType").t(role.roleType()).up();
+         XMLBuilder configSetsBuilder = builder.e("ConfigurationSets");
          if (!role.configurationSets().isEmpty()) {
             for (Role.ConfigurationSet configurationSet : role.configurationSets()) {
-               XMLBuilder configBuilder = builder.e("ConfigurationSet"); // Network
+               XMLBuilder configBuilder = configSetsBuilder.e("ConfigurationSet"); // Network
                configBuilder.e("ConfigurationSetType").t(configurationSet.configurationSetType()).up();
 
                XMLBuilder inputEndpoints = configBuilder.e("InputEndpoints");
@@ -63,6 +65,7 @@ public class RoleToXML implements Binder {
                }
             }
          }
+         
          builder.e("DataVirtualHardDisks").up()
                  .e("OSVirtualHardDisk")
                  .e("HostCaching").t(role.osVirtualHardDisk().hostCaching()).up()
@@ -70,7 +73,7 @@ public class RoleToXML implements Binder {
                  .e("MediaLink").t(role.osVirtualHardDisk().mediaLink().toString()).up()
                  .e("SourceImageName").t(role.osVirtualHardDisk().sourceImageName()).up()
                  .e("OS").t(role.osVirtualHardDisk().os().toString()).up()
-                 .up() // DataVirtualHardDisks
+                 .up() // OSVirtualHardDisk
                  .e("RoleSize").t(role.roleSize().getText());
          return (R) request.toBuilder().payload(builder.asString()).build();
       } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4e37f701/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 5bdd3a8..2272c70 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiMockTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/VirtualMachineApiMockTest.java
@@ -18,12 +18,17 @@ package org.jclouds.azurecompute.features;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.io.InputStream;
+import java.nio.charset.Charset;
+
 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.google.common.io.ByteStreams;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
+import com.squareup.okhttp.mockwebserver.RecordedRequest;
 
 /*
  * Note: Mock test for CaptureVMImage method is in VMImageApiMockTest class
@@ -109,7 +114,14 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
          Role role = RoleHandlerTest.expected();
          assertThat(api.updateRole("testvnetsg02", role)).isEqualTo("request-1");
 
-         assertSent(server, "PUT", "/services/hostedservices/my-service/deployments/mydeployment/roles/testvnetsg02");
+         RecordedRequest request = assertSent(server, "PUT", "/services/hostedservices/my-service/deployments/mydeployment/roles/testvnetsg02");
+         
+         final InputStream is = getClass().getResourceAsStream("/role-update-body.xml");
+         try {
+            assertThat(request.getUtf8Body()).isXmlEqualTo(new String(ByteStreams.toByteArray(is), Charset.forName("UTF-8")));
+         } finally {
+            is.close();
+         }
       } finally {
          server.shutdown();
       }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/4e37f701/azurecompute/src/test/resources/role-update-body.xml
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/resources/role-update-body.xml b/azurecompute/src/test/resources/role-update-body.xml
new file mode 100644
index 0000000..c095352
--- /dev/null
+++ b/azurecompute/src/test/resources/role-update-body.xml
@@ -0,0 +1,36 @@
+<PersistentVMRole xmlns="http://schemas.microsoft.com/windowsazure">
+  <RoleName>testvnetsg02</RoleName>
+  <RoleType>PersistentVMRole</RoleType>
+  <ConfigurationSets>
+    <ConfigurationSet>
+      <ConfigurationSetType>NetworkConfiguration</ConfigurationSetType>
+      <InputEndpoints>
+        <InputEndpoint>
+          <LocalPort>5986</LocalPort>
+          <Name>PowerShell</Name>
+          <Port>5986</Port>
+          <Protocol>tcp</Protocol>
+        </InputEndpoint>
+        <InputEndpoint>
+          <LocalPort>3389</LocalPort>
+          <Name>Remote Desktop</Name>
+          <Port>59440</Port>
+          <Protocol>tcp</Protocol>
+        </InputEndpoint>
+      </InputEndpoints>
+      <SubnetNames>
+        <SubnetName>Subnet-1</SubnetName>
+      </SubnetNames>
+      <NetworkSecurityGroup>vnetnsgsg01</NetworkSecurityGroup>
+    </ConfigurationSet>
+  </ConfigurationSets>
+  <DataVirtualHardDisks />
+  <OSVirtualHardDisk>
+    <HostCaching>ReadWrite</HostCaching>
+    <DiskName>testvnetsg02-testvnetsg02-0-201502180825130518</DiskName>
+    <MediaLink>https://portalvhdsxz8nc6chc32j1.blob.core.windows.net/vhds/testvnetsg02-testvnetsg02-2015-02-18.vhd</MediaLink>
+    <SourceImageName>a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201412.01-en.us-127GB.vhd</SourceImageName>
+    <OS>WINDOWS</OS>
+  </OSVirtualHardDisk>
+  <RoleSize>Small</RoleSize>
+</PersistentVMRole>


[3/4] jclouds-labs git commit: [JCLOUDS-1142] add suport for ProvisionGuestAgent configuration

Posted by na...@apache.org.
[JCLOUDS-1142] add suport for ProvisionGuestAgent configuration


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

Branch: refs/heads/master
Commit: e1c55b481b1ffcc291b1c26cfe742f3c3db1696a
Parents: 4e37f70
Author: Josef Cacek <jc...@redhat.com>
Authored: Sun Jul 17 22:22:42 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Sun Jul 17 23:30:08 2016 +0200

----------------------------------------------------------------------
 .../binders/DeploymentParamsToXML.java          | 33 +++++++++++---------
 .../jclouds/azurecompute/binders/RoleToXML.java |  3 ++
 .../compute/AzureComputeServiceAdapter.java     |  1 +
 .../options/AzureComputeTemplateOptions.java    | 14 +++++++++
 .../azurecompute/domain/DeploymentParams.java   | 14 ++++++++-
 .../src/test/resources/role-update-body.xml     |  1 +
 6 files changed, 51 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e1c55b48/azurecompute/src/main/java/org/jclouds/azurecompute/binders/DeploymentParamsToXML.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/DeploymentParamsToXML.java b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/DeploymentParamsToXML.java
index c220551..fbbdcd0 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/DeploymentParamsToXML.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/DeploymentParamsToXML.java
@@ -26,6 +26,9 @@ import org.jclouds.rest.Binder;
 
 import com.jamesmurty.utils.XMLBuilder;
 
+/**
+ * Generates XML for <a href="https://msdn.microsoft.com/en-us/library/azure/jj157194.aspx">Create Virtual Machine Deployment</a> REST call.
+ */
 public final class DeploymentParamsToXML implements Binder {
 
    @Override
@@ -33,18 +36,19 @@ public final class DeploymentParamsToXML implements Binder {
       DeploymentParams params = DeploymentParams.class.cast(input);
 
       try {
-         XMLBuilder builder = XMLBuilder.create("Deployment", "http://schemas.microsoft.com/windowsazure")
+         XMLBuilder deploymentBuilder = XMLBuilder.create("Deployment", "http://schemas.microsoft.com/windowsazure")
                  .e("Name").t(params.name()).up()
                  .e("DeploymentSlot").t("Production").up()
-                 .e("Label").t(params.name()).up()
+                 .e("Label").t(params.name()).up();
+         XMLBuilder roleBuilder = deploymentBuilder
                  .e("RoleList")
                  .e("Role")
                  .e("RoleName").t(params.name()).up()
-                 .e("RoleType").t("PersistentVMRole").up()
-                 .e("ConfigurationSets");
+                 .e("RoleType").t("PersistentVMRole").up();
+         XMLBuilder configSetsBuilder = roleBuilder.e("ConfigurationSets");
 
          if (params.os() == OSImage.Type.WINDOWS) {
-            XMLBuilder configBuilder = builder.e("ConfigurationSet"); // Windows
+            XMLBuilder configBuilder = configSetsBuilder.e("ConfigurationSet"); // Windows
             configBuilder.e("ConfigurationSetType").t("WindowsProvisioningConfiguration").up()
                     .e("ComputerName").t(params.name()).up()
                     .e("AdminPassword").t(params.password()).up()
@@ -67,7 +71,7 @@ public final class DeploymentParamsToXML implements Binder {
                     .e("AdminPassword").t(params.username()).up()
                     .up(); // Windows ConfigurationSet
          } else if (params.os() == OSImage.Type.LINUX) {
-            XMLBuilder configBuilder = builder.e("ConfigurationSet"); // Linux
+            XMLBuilder configBuilder = configSetsBuilder.e("ConfigurationSet"); // Linux
             configBuilder.e("ConfigurationSetType").t("LinuxProvisioningConfiguration").up()
                     .e("HostName").t(params.name()).up()
                     .e("UserName").t(params.username()).up()
@@ -81,7 +85,7 @@ public final class DeploymentParamsToXML implements Binder {
             throw new IllegalArgumentException("Unrecognized os type " + params);
          }
 
-         XMLBuilder configBuilder = builder.e("ConfigurationSet"); // Network
+         XMLBuilder configBuilder = configSetsBuilder.e("ConfigurationSet"); // Network
          configBuilder.e("ConfigurationSetType").t("NetworkConfiguration").up();
 
          XMLBuilder inputEndpoints = configBuilder.e("InputEndpoints");
@@ -104,7 +108,7 @@ public final class DeploymentParamsToXML implements Binder {
             }
          }
 
-         builder.up() //ConfigurationSets
+         roleBuilder
                  // TODO No Disk should be specified for a Role if using a VMImage
                  .e("DataVirtualHardDisks").up()
                  .e("OSVirtualHardDisk")
@@ -116,17 +120,18 @@ public final class DeploymentParamsToXML implements Binder {
                  .e("SourceImageName").t(params.sourceImageName()).up()
                  .e("OS").t(params.os() == LINUX ? "Linux" : "Windows").up()
                  .up() //OSVirtualHardDisk
-                 .e("RoleSize").t(params.size().getText()).up()
-                 .up() //Role
-                 .up(); //RoleList
+                 .e("RoleSize").t(params.size().getText()).up();
+         if (params.provisionGuestAgent() != null) {
+            roleBuilder.e("ProvisionGuestAgent").t(params.provisionGuestAgent().toString()).up();
+         }
          if (params.virtualNetworkName() != null) {
-            builder.up().up().up().e("VirtualNetworkName").t(params.virtualNetworkName()).up();
+            configSetsBuilder.up().up().up().e("VirtualNetworkName").t(params.virtualNetworkName()).up();
          }
          if (params.reservedIPName() != null) {
-            builder.up().up().up().e("ReservedIPName").t(params.reservedIPName()).up();
+            configSetsBuilder.up().up().up().e("ReservedIPName").t(params.reservedIPName()).up();
          }
 
-         return (R) request.toBuilder().payload(builder.asString()).build();
+         return (R) request.toBuilder().payload(configSetsBuilder.asString()).build();
       } catch (Exception e) {
          throw propagate(e);
       }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e1c55b48/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
index 7c8d529..9f77d76 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/RoleToXML.java
@@ -75,6 +75,9 @@ public class RoleToXML implements Binder {
                  .e("OS").t(role.osVirtualHardDisk().os().toString()).up()
                  .up() // OSVirtualHardDisk
                  .e("RoleSize").t(role.roleSize().getText());
+         if (role.provisionGuestAgent() != null) {
+            builder.e("ProvisionGuestAgent").t(role.provisionGuestAgent().toString()).up();
+         }
          return (R) request.toBuilder().payload(builder.asString()).build();
       } catch (Exception e) {
          throw propagate(e);

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e1c55b48/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
index 7a65e6d..394dc65 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/AzureComputeServiceAdapter.java
@@ -134,6 +134,7 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Deploym
               .externalEndpoints(externalEndpoints)
               .virtualNetworkName(templateOptions.getVirtualNetworkName())
               .subnetNames(templateOptions.getSubnetNames())
+              .provisionGuestAgent(templateOptions.getProvisionGuestAgent())
               .build();
 
       message = String.format("Creating a deployment with params '%s' ...", params);

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e1c55b48/azurecompute/src/main/java/org/jclouds/azurecompute/compute/options/AzureComputeTemplateOptions.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/options/AzureComputeTemplateOptions.java b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/options/AzureComputeTemplateOptions.java
index ed31e71..3b80afd 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/compute/options/AzureComputeTemplateOptions.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/compute/options/AzureComputeTemplateOptions.java
@@ -53,6 +53,7 @@ public class AzureComputeTemplateOptions extends TemplateOptions implements Clon
    protected String storageAccountType;
    protected String networkSecurityGroupName;
    protected String reservedIPName;
+   protected Boolean provisionGuestAgent;
 
    @Override
    public AzureComputeTemplateOptions clone() {
@@ -73,6 +74,7 @@ public class AzureComputeTemplateOptions extends TemplateOptions implements Clon
          eTo.storageAccountName(storageAccountName);
          eTo.storageAccountType(storageAccountType);
          eTo.reservedIPName(reservedIPName);
+         eTo.provisionGuestAgent(provisionGuestAgent);
       }
    }
 
@@ -91,6 +93,7 @@ public class AzureComputeTemplateOptions extends TemplateOptions implements Clon
       if (storageAccountType != null ? !storageAccountType.equals(that.storageAccountType) : that.storageAccountType != null) return false;
       if (subnetNames != null ? !subnetNames.equals(that.subnetNames) : that.subnetNames != null) return false;
       if (virtualNetworkName != null ? !virtualNetworkName.equals(that.virtualNetworkName) : that.virtualNetworkName != null) return false;
+      if (provisionGuestAgent != null ? !provisionGuestAgent.equals(that.provisionGuestAgent) : that.provisionGuestAgent != null) return false;
 
       return true;
    }
@@ -104,6 +107,7 @@ public class AzureComputeTemplateOptions extends TemplateOptions implements Clon
       result = 31 * result + (storageAccountType != null ? storageAccountType.hashCode() : 0);
       result = 31 * result + (networkSecurityGroupName != null ? networkSecurityGroupName.hashCode() : 0);
       result = 31 * result + (reservedIPName != null ? reservedIPName.hashCode() : 0);
+      result = 31 * result + (provisionGuestAgent != null ? provisionGuestAgent.hashCode() : 0);
       return result;
    }
 
@@ -116,6 +120,7 @@ public class AzureComputeTemplateOptions extends TemplateOptions implements Clon
               .add("storageAccountType", storageAccountType)
               .add("networkSecurityGroupName", networkSecurityGroupName)
               .add("reservedIPName", reservedIPName)
+              .add("provisionGuestAgent", provisionGuestAgent)
               .toString();
    }
 
@@ -154,6 +159,11 @@ public class AzureComputeTemplateOptions extends TemplateOptions implements Clon
       return this;
    }
 
+   public AzureComputeTemplateOptions provisionGuestAgent(@Nullable Boolean provisionGuestAgent) {
+      this.provisionGuestAgent = provisionGuestAgent;
+      return this;
+   }
+
    public String getVirtualNetworkName() {
       return virtualNetworkName;
    }
@@ -178,6 +188,10 @@ public class AzureComputeTemplateOptions extends TemplateOptions implements Clon
       return reservedIPName;
    }
 
+   public Boolean getProvisionGuestAgent() {
+      return provisionGuestAgent;
+   }
+
    public static class Builder {
 
       /**

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e1c55b48/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 2cf93ad..5208d2d 100644
--- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java
+++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java
@@ -126,6 +126,16 @@ public abstract class DeploymentParams {
 
    public abstract List<String> subnetNames();
 
+   /**
+    * Optional. Indicates whether the VM Agent is installed on the Virtual
+    * Machine. To run a resource extension in a Virtual Machine, this agent must
+    * be installed.
+    *
+    * @return provisionGuestAgent true/false flag (or null)
+    */
+   @Nullable
+   public abstract Boolean provisionGuestAgent();
+
    public static Builder builder() {
       return new AutoValue_DeploymentParams.Builder()
               .externalEndpoints(ImmutableSet.<ExternalEndpoint> of())
@@ -147,6 +157,7 @@ public abstract class DeploymentParams {
       public abstract Builder virtualNetworkName(String virtualNetworkName);
       public abstract Builder reservedIPName(String reservedIPName);
       public abstract Builder subnetNames(List<String> subnetNames);
+      public abstract Builder provisionGuestAgent(Boolean provisionGuestAgent);
 
       abstract Set<ExternalEndpoint> externalEndpoints();
       abstract List<String> subnetNames();
@@ -164,11 +175,12 @@ public abstract class DeploymentParams {
                                          String password, String sourceImageName, URI mediaLink,
                                          OSImage.Type os, Set<ExternalEndpoint> externalEndpoints,
                                          String virtualNetworkName, String reservedIPName,
-                                         List<String> subnetNames) {
+                                         List<String> subnetNames, Boolean provisionGuestAgent) {
       return builder().name(name).size(size).username(username).password(password)
               .sourceImageName(sourceImageName).mediaLink(mediaLink).os(os)
               .externalEndpoints(externalEndpoints).virtualNetworkName(virtualNetworkName)
               .reservedIPName(reservedIPName).subnetNames(subnetNames)
+              .provisionGuestAgent(provisionGuestAgent)
               .build();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e1c55b48/azurecompute/src/test/resources/role-update-body.xml
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/resources/role-update-body.xml b/azurecompute/src/test/resources/role-update-body.xml
index c095352..841ffb5 100644
--- a/azurecompute/src/test/resources/role-update-body.xml
+++ b/azurecompute/src/test/resources/role-update-body.xml
@@ -33,4 +33,5 @@
     <OS>WINDOWS</OS>
   </OSVirtualHardDisk>
   <RoleSize>Small</RoleSize>
+  <ProvisionGuestAgent>true</ProvisionGuestAgent>
 </PersistentVMRole>