You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/10/14 09:43:46 UTC
[2/4] jclouds-labs git commit: Refactored Azure ARM to not use
Deployments
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/SubnetApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/SubnetApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/SubnetApi.java
index 1ac38d8..8f30d6c 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/SubnetApi.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/SubnetApi.java
@@ -16,20 +16,7 @@
*/
package org.jclouds.azurecompute.arm.features;
-import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
-import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.azurecompute.arm.domain.Subnet;
-import org.jclouds.azurecompute.arm.functions.FalseOn204;
-import org.jclouds.oauth.v2.filters.OAuthFilter;
-import org.jclouds.rest.binders.BindToJsonPayload;
-
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.QueryParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.SelectJson;
-import org.jclouds.rest.annotations.ResponseParser;
-import org.jclouds.rest.annotations.PayloadParam;
-import org.jclouds.rest.annotations.MapBinder;
+import java.util.List;
import javax.inject.Named;
import javax.ws.rs.Consumes;
@@ -39,12 +26,24 @@ import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.MediaType;
-import java.util.List;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.Subnet;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
+import org.jclouds.azurecompute.arm.functions.FalseOn204;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks/{virtualnetwork}/subnets")
-@QueryParams(keys = "api-version", values = "2015-06-15")
-@RequestFilters(OAuthFilter.class)
+@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
@Consumes(MediaType.APPLICATION_JSON)
public interface SubnetApi {
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VMSizeApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VMSizeApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VMSizeApi.java
index 345e08c..b5917ce 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VMSizeApi.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VMSizeApi.java
@@ -16,24 +16,24 @@
*/
package org.jclouds.azurecompute.arm.features;
-import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
-import org.jclouds.azurecompute.arm.domain.VMSize;
-import org.jclouds.oauth.v2.filters.OAuthFilter;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.QueryParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.SelectJson;
+import java.util.List;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
-import java.util.List;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.VMSize;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SelectJson;
@Path("/providers/Microsoft.Compute/locations/{location}/vmSizes")
-@QueryParams(keys = "api-version", values = "2015-06-15")
-@RequestFilters(OAuthFilter.class)
+@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
@Consumes(MediaType.APPLICATION_JSON)
public interface VMSizeApi {
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java
index 14f3c70..2dd6d34 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualMachineApi.java
@@ -16,10 +16,25 @@
*/
package org.jclouds.azurecompute.arm.features;
+import java.net.URI;
+import java.util.List;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
import org.jclouds.Fallbacks;
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
import org.jclouds.azurecompute.arm.functions.URIParser;
import org.jclouds.oauth.v2.filters.OAuthFilter;
import org.jclouds.rest.annotations.Fallback;
@@ -32,27 +47,13 @@ import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SelectJson;
import org.jclouds.rest.binders.BindToJsonPayload;
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.net.URI;
-import java.util.List;
-
/**
* The Virtual Machine API includes operations for managing the virtual machines in your subscription.
*
* @see <a href="https://msdn.microsoft.com/en-us/library/azure/mt163630.aspx">docs</a>
*/
@Path("/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines")
-@RequestFilters(OAuthFilter.class)
-@QueryParams(keys = "api-version", values = "2015-06-15")
+@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
@Consumes(MediaType.APPLICATION_JSON)
public interface VirtualMachineApi {
@@ -66,14 +67,14 @@ public interface VirtualMachineApi {
VirtualMachine get(@PathParam("name") String name);
/**
- * The Get Virtual Machine details
+ * Get information about the model view and instance view of a virtual machine:
*/
@Named("GetVirtualMachineInstance")
@GET
@Path("/{name}/instanceView")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
VirtualMachineInstance getInstanceDetails(@PathParam("name") String name);
-
+
/**
* The Create Virtual Machine
*/
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java
index 0acbdee..1e657f3 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/features/VirtualNetworkApi.java
@@ -15,22 +15,7 @@
* limitations under the License.
*/
package org.jclouds.azurecompute.arm.features;
-import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
-import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-
-import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
-
-import org.jclouds.azurecompute.arm.functions.FalseOn204;
-import org.jclouds.oauth.v2.filters.OAuthFilter;
-
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.QueryParams;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.SelectJson;
-import org.jclouds.rest.annotations.ResponseParser;
-import org.jclouds.rest.annotations.PayloadParam;
-import org.jclouds.rest.annotations.MapBinder;
-import org.jclouds.rest.binders.BindToJsonPayload;
+import java.util.List;
import javax.inject.Named;
import javax.ws.rs.Consumes;
@@ -40,11 +25,23 @@ import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.MediaType;
-import java.util.List;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
+import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
+import org.jclouds.azurecompute.arm.functions.FalseOn204;
+import org.jclouds.oauth.v2.filters.OAuthFilter;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.binders.BindToJsonPayload;
@Path("/resourcegroups/{resourcegroup}/providers/Microsoft.Network/virtualNetworks")
-@QueryParams(keys = "api-version", values = "2015-06-15")
-@RequestFilters(OAuthFilter.class)
+@RequestFilters({ OAuthFilter.class, ApiVersionFilter.class })
@Consumes(MediaType.APPLICATION_JSON)
public interface VirtualNetworkApi {
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java
new file mode 100644
index 0000000..904c2e8
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/filters/ApiVersionFilter.java
@@ -0,0 +1,90 @@
+/*
+ * 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.arm.filters;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.API_VERSION_PREFIX;
+import static org.jclouds.util.Maps2.transformKeys;
+import static org.jclouds.util.Predicates2.startsWith;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.http.HttpException;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpRequestFilter;
+import org.jclouds.rest.config.InvocationConfig;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.reflect.Invokable;
+
+/**
+ * Allow users to customize the api versions for each method call.
+ * <p>
+ * In Azure ARM, each method may have its own api version. This filter allows to
+ * configure the versions of each method, so there is no need to change the code
+ * when Azure deprecates old versions.
+ */
+public class ApiVersionFilter implements HttpRequestFilter {
+
+ private final InvocationConfig config;
+ private final Map<String, String> versions;
+
+ @Inject
+ ApiVersionFilter(InvocationConfig config, Function<Predicate<String>, Map<String, String>> filterStringsBoundByName) {
+ this.config = config;
+ this.versions = versions(filterStringsBoundByName);
+ }
+
+ @Override
+ public HttpRequest filter(HttpRequest request) throws HttpException {
+ checkArgument(request instanceof GeneratedHttpRequest,
+ "This filter can only be applied to GeneratedHttpRequest objects");
+ GeneratedHttpRequest generatedRequest = (GeneratedHttpRequest) request;
+
+ // Look if there is a custom api version for the current method
+ String commandName = config.getCommandName(generatedRequest.getInvocation());
+ String customApiVersion = versions.get(commandName);
+
+ if (customApiVersion == null) {
+ // No custom config for the specific method. Let's look for custom
+ // config for the class
+ Invokable<?, ?> invoked = generatedRequest.getInvocation().getInvokable();
+ String className = invoked.getOwnerType().getRawType().getSimpleName();
+ customApiVersion = versions.get(className);
+ }
+
+ if (customApiVersion != null) {
+ return request.toBuilder().replaceQueryParam("api-version", customApiVersion).build();
+ }
+
+ return request;
+ }
+
+ private static Map<String, String> versions(Function<Predicate<String>, Map<String, String>> filterStringsBoundByName) {
+ Map<String, String> stringBoundWithApiVersionPrefix = filterStringsBoundByName
+ .apply(startsWith(API_VERSION_PREFIX));
+ return transformKeys(stringBoundWithApiVersionPrefix, new Function<String, String>() {
+ public String apply(String input) {
+ return input.replaceFirst(API_VERSION_PREFIX, "");
+ }
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
index 6970887..39cc32c 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/CleanupResources.java
@@ -14,127 +14,163 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.jclouds.azurecompute.arm.functions;
+package org.jclouds.azurecompute.arm.functions;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Predicates.notNull;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.transform;
import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
+import static org.jclouds.util.Closeables2.closeQuietly;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
-import com.google.common.base.Predicate;
import org.jclouds.azurecompute.arm.AzureComputeApi;
-import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule;
-import org.jclouds.azurecompute.arm.domain.Deployment;
+import org.jclouds.azurecompute.arm.domain.IdReference;
+import org.jclouds.azurecompute.arm.domain.IpConfiguration;
import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard;
-import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup;
-import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
+import org.jclouds.azurecompute.arm.domain.ResourceGroup;
+import org.jclouds.azurecompute.arm.domain.StorageServiceKeys;
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
+import org.jclouds.azurecompute.arm.util.BlobHelper;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.logging.Logger;
import com.google.common.base.Function;
-
-import java.net.URI;
+import com.google.common.base.Predicate;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
@Singleton
public class CleanupResources implements Function<String, Boolean> {
- private final AzureComputeServiceContextModule.AzureComputeConstants azureComputeConstants;
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
protected final AzureComputeApi api;
- private Predicate<URI> nodeTerminated;
- private Predicate<URI> resourceDeleted;
+ private final Predicate<URI> resourceDeleted;
+ private final StorageProfileToStorageAccountName storageProfileToStorageAccountName;
@Inject
- public CleanupResources(AzureComputeApi azureComputeApi,
- AzureComputeServiceContextModule.AzureComputeConstants azureComputeConstants,
- @Named(TIMEOUT_NODE_TERMINATED) Predicate<URI> nodeTerminated,
- @Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted) {
- this.azureComputeConstants = azureComputeConstants;
+ CleanupResources(AzureComputeApi azureComputeApi, @Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted,
+ StorageProfileToStorageAccountName storageProfileToStorageAccountName) {
this.api = azureComputeApi;
- this.nodeTerminated = nodeTerminated;
this.resourceDeleted = resourceDeleted;
+ this.storageProfileToStorageAccountName = storageProfileToStorageAccountName;
}
@Override
- public Boolean apply(String id) {
-
- logger.debug("Destroying %s ...", id);
- String storageAccountName = id.replaceAll("[^A-Za-z0-9 ]", "") + "stor";
- String group = azureComputeConstants.azureResourceGroup();
-
- VirtualMachine vm = api.getVirtualMachineApi(group).get(id);
- if (vm != null) {
- URI uri = api.getVirtualMachineApi(group).delete(id);
- if (uri != null) {
- boolean jobDone = nodeTerminated.apply(uri);
- boolean storageAcctDeleteStatus = false;
- boolean deploymentDeleteStatus = false;
-
- if (jobDone) {
- Deployment deployment = api.getDeploymentApi(group).get(id);
- if (deployment != null) {
- uri = api.getDeploymentApi(group).delete(id);
- jobDone = resourceDeleted.apply(uri);
- if (jobDone) {
- deploymentDeleteStatus = true;
- }
- } else {
- deploymentDeleteStatus = true;
+ public Boolean apply(final String id) {
+ logger.debug(">> destroying %s ...", id);
+
+ Map<String, VirtualMachine> resourceGroupNamesAndVirtualMachines = getResourceGroupNamesAndVirtualMachines(id);
+ if (resourceGroupNamesAndVirtualMachines.isEmpty())
+ return true;
+
+ String group = checkNotNull(resourceGroupNamesAndVirtualMachines.entrySet().iterator().next().getKey(),
+ "resourceGroup name must not be null");
+ VirtualMachine virtualMachine = checkNotNull(resourceGroupNamesAndVirtualMachines.get(group),
+ "virtualMachine must not be null");
+
+ boolean vmDeleted = deleteVirtualMachine(group, virtualMachine);
+
+ // We don't delete the network here, as it is global to the resource
+ // group. It will be deleted when the resource group is deleted
+
+ for (String nicName : getNetworkCardInterfaceNames(virtualMachine)) {
+ NetworkInterfaceCard nic = api.getNetworkInterfaceCardApi(group).get(nicName);
+ Iterable<String> publicIps = getPublicIps(group, nic);
+
+ logger.debug(">> destroying nic %s...", nicName);
+ URI nicDeletionURI = api.getNetworkInterfaceCardApi(group).delete(nicName);
+ resourceDeleted.apply(nicDeletionURI);
+
+ for (String publicIp : publicIps) {
+ logger.debug(">> deleting public ip nic %s...", publicIp);
+ api.getPublicIPAddressApi(group).delete(publicIp);
+ }
+ }
+
+ String storageAccountName = storageProfileToStorageAccountName.apply(virtualMachine.properties().storageProfile());
+ StorageServiceKeys keys = api.getStorageAccountApi(group).getKeys(storageAccountName);
+
+ // Remove the virtual machine files
+ logger.debug(">> deleting virtual machine disk storage...");
+ BlobHelper blobHelper = new BlobHelper(storageAccountName, keys.key1());
+ try {
+ blobHelper.deleteContainerIfExists("vhds");
+
+ if (!blobHelper.customImageExists()) {
+ logger.debug(">> deleting storage account %s...", storageAccountName);
+ api.getStorageAccountApi(group).delete(storageAccountName);
+ } else {
+ logger.debug(">> the storage account contains custom images. Will not delete it!");
+ }
+ } finally {
+ closeQuietly(blobHelper);
+ }
+
+ deleteResourceGroupIfEmpty(group);
+
+ return vmDeleted;
+ }
+
+ public void deleteResourceGroupIfEmpty(String group) {
+ if (api.getVirtualMachineApi(group).list().isEmpty()
+ && api.getStorageAccountApi(group).list().isEmpty()
+ && api.getNetworkInterfaceCardApi(group).list().isEmpty()
+ && api.getPublicIPAddressApi(group).list().isEmpty()) {
+ logger.debug(">> the resource group %s is empty. Deleting...", group);
+ resourceDeleted.apply(api.getResourceGroupApi().delete(group));
+ }
+ }
+
+ private Iterable<String> getPublicIps(String group, NetworkInterfaceCard nic) {
+ return transform(
+ filter(transform(nic.properties().ipConfigurations(), new Function<IpConfiguration, IdReference>() {
+ @Override
+ public IdReference apply(IpConfiguration input) {
+ return input.properties().publicIPAddress();
}
- NetworkInterfaceCard nic = api.getNetworkInterfaceCardApi(group).get(id + "nic");
- if (nic != null) {
- uri = api.getNetworkInterfaceCardApi(group).delete(id + "nic");
- if (uri != null) {
- jobDone = resourceDeleted.apply(uri);
- if (jobDone) {
- boolean ipDeleteStatus = false;
- PublicIPAddress ip = api.getPublicIPAddressApi(group).get(id + "publicip");
- if (ip != null) {
- ipDeleteStatus = api.getPublicIPAddressApi(group).delete(id + "publicip");
- } else {
- ipDeleteStatus = true;
- }
-
- // Get NSG
- boolean nsgDeleteStatus = false;
- NetworkSecurityGroup nsg = api.getNetworkSecurityGroupApi(group).get(id + "nsg");
- if (nsg != null) {
- uri = api.getNetworkSecurityGroupApi(group).delete(id + "nsg");
- jobDone = resourceDeleted.apply(uri);
- if (jobDone) {
- nsgDeleteStatus = true;
-
- }
- }
- else {
- nsgDeleteStatus = true;
- }
-
- return deploymentDeleteStatus && storageAcctDeleteStatus && ipDeleteStatus && nsgDeleteStatus;
- } else {
- return false;
- }
- } else {
- return false;
- }
- } else {
- return false;
+ }), notNull()), new Function<IdReference, String>() {
+ @Override
+ public String apply(IdReference input) {
+ return Iterables.getLast(Splitter.on("/").split(input.id()));
}
- } else {
- return false;
- }
- } else {
- return false;
+ });
+ }
+
+ private List<String> getNetworkCardInterfaceNames(VirtualMachine virtualMachine) {
+ List<String> nics = Lists.newArrayList();
+ for (IdReference idReference : virtualMachine.properties().networkProfile().networkInterfaces()) {
+ nics.add(Iterables.getLast(Splitter.on("/").split(idReference.id())));
+ }
+ return nics;
+ }
+
+ private boolean deleteVirtualMachine(String group, VirtualMachine virtualMachine) {
+ return resourceDeleted.apply(api.getVirtualMachineApi(group).delete(virtualMachine.name()));
+ }
+
+ private Map<String, VirtualMachine> getResourceGroupNamesAndVirtualMachines(String id) {
+ for (ResourceGroup resourceGroup : api.getResourceGroupApi().list()) {
+ String group = resourceGroup.name();
+ VirtualMachine virtualMachine = api.getVirtualMachineApi(group).get(id);
+ if (virtualMachine != null) {
+ return ImmutableMap.of(group, virtualMachine);
}
- } else {
- return false;
}
+ return Maps.newHashMap();
}
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/StorageProfileToStorageAccountName.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/StorageProfileToStorageAccountName.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/StorageProfileToStorageAccountName.java
new file mode 100644
index 0000000..f624886
--- /dev/null
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/functions/StorageProfileToStorageAccountName.java
@@ -0,0 +1,38 @@
+/*
+ * 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.arm.functions;
+
+import java.net.URI;
+
+import org.jclouds.azurecompute.arm.domain.StorageProfile;
+
+import com.google.common.base.Function;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+
+/**
+ * Returns the storage account name for a given storage profile.
+ */
+public class StorageProfileToStorageAccountName implements Function<StorageProfile, String> {
+
+ @Override
+ public String apply(StorageProfile input) {
+ String storageAccountNameURI = input.osDisk().vhd().uri();
+ return Iterables.get(Splitter.on(".").split(URI.create(storageAccountNameURI).getHost()), 0);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/BlobHelper.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/BlobHelper.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/BlobHelper.java
index f5bfc75..b42ea5e 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/BlobHelper.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/BlobHelper.java
@@ -16,76 +16,68 @@
*/
package org.jclouds.azurecompute.arm.util;
+import static org.jclouds.util.Closeables2.closeQuietly;
+
+import java.io.Closeable;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jclouds.ContextBuilder;
-import org.jclouds.azure.storage.domain.BoundedSet;
import org.jclouds.azureblob.AzureBlobClient;
import org.jclouds.azureblob.domain.BlobProperties;
import org.jclouds.azureblob.domain.ContainerProperties;
import org.jclouds.azureblob.domain.ListBlobsResponse;
import org.jclouds.azurecompute.arm.domain.VMImage;
-import org.jclouds.util.Closeables2;
-public class BlobHelper {
+public class BlobHelper implements Closeable {
- public static void deleteContainerIfExists(String storage, String key, String containerName) {
- final AzureBlobClient azureBlob = ContextBuilder.newBuilder("azureblob")
- .credentials(storage, key)
- .buildApi(AzureBlobClient.class);
+ private final String storageAccount;
+ private final AzureBlobClient azureBlob;
- try {
- azureBlob.deleteContainer(containerName);
- }
- finally {
- Closeables2.closeQuietly(azureBlob);
- }
+ public BlobHelper(String storageAccount, String key) {
+ this.storageAccount = storageAccount;
+ this.azureBlob = ContextBuilder.newBuilder("azureblob").credentials(storageAccount, key)
+ .buildApi(AzureBlobClient.class);
}
- public static boolean customImageExists(String storage, String key) {
- final AzureBlobClient azureBlob = ContextBuilder.newBuilder("azureblob")
- .credentials(storage, key)
- .buildApi(AzureBlobClient.class);
+ @Override
+ public void close() throws IOException {
+ closeQuietly(azureBlob);
+ }
- try {
- return azureBlob.containerExists("system");
- }
- finally {
- Closeables2.closeQuietly(azureBlob);
- }
+ public void deleteContainerIfExists(String containerName) {
+ azureBlob.deleteContainer(containerName);
}
- public static List<VMImage> getImages(String containerName, String group,
- String storageAccountName, String key, String offer, String location) {
- final AzureBlobClient azureBlob = ContextBuilder.newBuilder("azureblob")
- .credentials(storageAccountName, key)
- .buildApi(AzureBlobClient.class);
+ public boolean hasContainers() {
+ return !azureBlob.listContainers().isEmpty();
+ }
+ public boolean customImageExists() {
+ return azureBlob.containerExists("system");
+ }
+ public List<VMImage> getImages(String containerName, String group, String offer, String location) {
List<VMImage> list = new ArrayList<VMImage>();
- try {
- BoundedSet<ContainerProperties> containerList = azureBlob.listContainers();
- for (ContainerProperties props : containerList) {
- if (props.getName().equals("system")) {
- ListBlobsResponse blobList = azureBlob.listBlobs("system");
- String osDisk = "";
- String dataDisk = "";
-
- for (BlobProperties blob : blobList) {
- String name = blob.getName();
-
- if (dataDisk.length() == 0) dataDisk = name.substring(1 + name.lastIndexOf('/'));
- else if (osDisk.length() == 0) osDisk = name.substring(1 + name.lastIndexOf('/'));
- }
- final VMImage ref = VMImage.create(group, storageAccountName, osDisk, dataDisk, "test-create-image", "custom", location);
- list.add(ref);
+
+ ContainerProperties systemContainer = azureBlob.getContainerProperties("system");
+ if (systemContainer != null) {
+ ListBlobsResponse blobList = azureBlob.listBlobs(systemContainer.getName());
+ for (BlobProperties blob : blobList) {
+ String name = blob.getName();
+
+ if (name.contains("-osDisk")) {
+ String imageName = name.substring(name.lastIndexOf('/') + 1, name.indexOf("-osDisk"));
+ String imageUrl = blob.getUrl().toString();
+
+ list.add(VMImage.customImage().group(group).storage(storageAccount).vhd1(imageUrl).name(imageName)
+ .offer(offer).location(location).build());
}
}
}
- finally {
- Closeables2.closeQuietly(azureBlob);
- }
+
return list;
}
+
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java
deleted file mode 100644
index e5b0a43..0000000
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.azurecompute.arm.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule;
-import org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageExtension;
-import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions;
-import org.jclouds.azurecompute.arm.domain.DataDisk;
-import org.jclouds.azurecompute.arm.domain.DeploymentBody;
-import org.jclouds.azurecompute.arm.domain.DeploymentProperties;
-import org.jclouds.azurecompute.arm.domain.DeploymentTemplate;
-import org.jclouds.azurecompute.arm.domain.DiagnosticsProfile;
-import org.jclouds.azurecompute.arm.domain.DnsSettings;
-import org.jclouds.azurecompute.arm.domain.HardwareProfile;
-import org.jclouds.azurecompute.arm.domain.IdReference;
-import org.jclouds.azurecompute.arm.domain.ImageReference;
-import org.jclouds.azurecompute.arm.domain.IpConfiguration;
-import org.jclouds.azurecompute.arm.domain.IpConfigurationProperties;
-import org.jclouds.azurecompute.arm.domain.KeyVaultReference;
-import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties;
-import org.jclouds.azurecompute.arm.domain.NetworkProfile;
-import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroupProperties;
-import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule;
-import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties;
-import org.jclouds.azurecompute.arm.domain.OSDisk;
-import org.jclouds.azurecompute.arm.domain.OSProfile;
-import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties;
-import org.jclouds.azurecompute.arm.domain.ResourceDefinition;
-import org.jclouds.azurecompute.arm.domain.StorageProfile;
-import org.jclouds.azurecompute.arm.domain.StorageService;
-import org.jclouds.azurecompute.arm.domain.StorageService.StorageServiceProperties;
-import org.jclouds.azurecompute.arm.domain.TemplateParameterType;
-import org.jclouds.azurecompute.arm.domain.VHD;
-import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.json.Json;
-import org.jclouds.predicates.Validator;
-import org.jclouds.predicates.validators.DnsNameValidator;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-import static com.google.common.io.BaseEncoding.base64;
-import static org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageExtension.CUSTOM_IMAGE_PREFIX;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.STORAGE_API_VERSION;
-
-public class DeploymentTemplateBuilder {
- public interface Factory {
- DeploymentTemplateBuilder create(@Assisted("group") String group, @Assisted("name") String name, Template template);
- }
-
- private final String name;
- private final String azureGroup;
- private final String group;
- private final Template template;
- private final Json json;
-
- private AzureTemplateOptions options;
- private Iterable<String> tags;
- private Map<String, String> userMetaData;
- private List<ResourceDefinition> resources;
- private Map<String, String> variables;
- private static String loginUser;
- private static String loginPassword;
- private String location;
- private AzureComputeServiceContextModule.AzureComputeConstants azureComputeConstants;
-
- private static final String DEPLOYMENT_MODE = "Incremental";
-
- @Inject
- DeploymentTemplateBuilder(Json json, @Assisted("group") String group, @Assisted("name") String name, @Assisted Template template,
- final AzureComputeServiceContextModule.AzureComputeConstants azureComputeConstants) {
- this.name = name;
- this.group = group;
- this.template = template;
- this.options = template.getOptions().as(AzureTemplateOptions.class);
- this.tags = template.getOptions().getTags();
- this.userMetaData = template.getOptions().getUserMetadata();
- this.variables = new HashMap<String, String>();
- this.resources = new ArrayList<ResourceDefinition>();
- this.location = template.getLocation().getId();
- this.json = json;
-
- this.azureComputeConstants = azureComputeConstants;
- this.azureGroup = this.azureComputeConstants.azureResourceGroup();
-
- String[] defaultLogin = this.azureComputeConstants.azureDefaultImageLogin().split(":");
- String defaultUser = null;
- String defaultPassword = null;
-
- if (defaultLogin.length == 2) {
- defaultUser = defaultLogin[0].trim();
- defaultPassword = defaultLogin[1].trim();
- }
-
- loginUser = options.getLoginUser() == null ? defaultUser : options.getLoginUser();
- loginPassword = options.getLoginPassword() == null ? defaultPassword : options.getLoginPassword();
- }
-
- public static String getLoginUserUsername() {
- return loginUser;
- }
-
- public static String getLoginPassword() {
- return loginPassword;
- }
-
- public Template getTemplate() {
- return template;
- }
-
- public DeploymentBody getDeploymentTemplate() {
-
- addStorageResource();
- addPublicIpAddress();
- addNetworkSecurityGroup();
- addNetworkInterfaceCard();
- addVirtualMachine();
-
-
- DeploymentTemplate.TemplateParameters templateParameters = null;
- DeploymentTemplate.Parameters parameters = null;
-
- if (keyVaultInUse()){
- String[] keyVaultInfo = options.getKeyVaultIdAndSecret().split(":");
- Preconditions.checkArgument(keyVaultInfo.length == 2);
- String vaultId = keyVaultInfo[0].trim();
- String secretName = keyVaultInfo[1].trim();
-
- templateParameters = DeploymentTemplate.TemplateParameters.create(TemplateParameterType.create("securestring"));
- parameters = DeploymentTemplate.Parameters.create(KeyVaultReference.create(KeyVaultReference.Reference.create(IdReference.create(vaultId), secretName)));
- } else {
- templateParameters = DeploymentTemplate.TemplateParameters.create(null);
- parameters = DeploymentTemplate.Parameters.create(null);
- }
-
-
- DeploymentTemplate template = DeploymentTemplate.builder()
- .schema("https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#")
- .contentVersion("1.0.0.0")
- .resources(resources)
- .variables(variables)
- .parameters(templateParameters)
- .build();
-
- DeploymentBody body = DeploymentBody.create(template, DEPLOYMENT_MODE, parameters);
-
- return body;
- }
-
- public String getDeploymentTemplateJson(DeploymentProperties properties) {
- return json.toJson(properties);
- }
-
- private void addStorageResource() {
- String storageAccountName = null;
-
- String imageName = template.getImage().getName();
- if (imageName.startsWith(CUSTOM_IMAGE_PREFIX)) {
- storageAccountName = template.getImage().getVersion();
- }
-
- if (Strings.isNullOrEmpty(storageAccountName)) {
- storageAccountName = generateStorageAccountName(name);
- }
-
- Validator<String> validator = new DnsNameValidator(3, 24);
- validator.validate(storageAccountName);
-
- variables.put("storageAccountName", storageAccountName);
-
- ResourceDefinition storageAccount = ResourceDefinition.builder()
- .name("[variables('storageAccountName')]")
- .type("Microsoft.Storage/storageAccounts")
- .location(location)
- .apiVersion(STORAGE_API_VERSION)
- .properties(
- StorageServiceProperties.builder()
- .accountType(StorageService.AccountType.Standard_LRS)
- .build()
- )
- .build();
-
- resources.add(storageAccount);
- }
-
- private void addPublicIpAddress() {
- String publicIPAddressName = name + "publicip";
- String dnsLabelPrefix = options.getDNSLabelPrefix();
-
- PublicIPAddressProperties.Builder properties = PublicIPAddressProperties.builder();
-
- if (!Strings.isNullOrEmpty(dnsLabelPrefix)) {
- properties.dnsSettings(DnsSettings.builder().domainNameLabel(dnsLabelPrefix).build());
- variables.put("dnsLabelPrefix", dnsLabelPrefix);
- }
-
- properties.publicIPAllocationMethod("Dynamic");
- variables.put("publicIPAddressName", publicIPAddressName);
- variables.put("publicIPAddressReference", "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]");
-
- ResourceDefinition publicIpAddress = ResourceDefinition.builder()
- .name("[variables('publicIPAddressName')]")
- .type("Microsoft.Network/publicIPAddresses")
- .location(location)
- .apiVersion(STORAGE_API_VERSION)
- .properties(properties.build())
- .build();
-
- resources.add(publicIpAddress);
- }
-
- private void addNetworkInterfaceCard() {
-
- List<IpConfiguration> ipConfigurations = new ArrayList<IpConfiguration>();
-
- String ipConfigurationName = name + "ipconfig";
- String subnetId = options.getSubnetId();
- String vnetName = options.getVirtualNetworkName();
-
- variables.put("ipConfigurationName", ipConfigurationName);
- variables.put("subnetReference", subnetId);
-
- IpConfiguration ipConfig = IpConfiguration.create(ipConfigurationName, null, null, null,
- IpConfigurationProperties.builder()
- .privateIPAllocationMethod("Dynamic")
- .publicIPAddress(IdReference.create("[variables('publicIPAddressReference')]"))
- .subnet(IdReference.create("[variables('subnetReference')]"))
- .build());
-
- ipConfigurations.add(ipConfig);
-
- // Check to see if we have defined a network security group
- IdReference networkSecurityGroup = null;
- int ports[] = options.getInboundPorts();
- if ((ports != null) && (ports.length > 0)) {
- networkSecurityGroup = IdReference.create("[variables('networkSecurityGroupNameReference')]");
- }
-
- ArrayList<String> depends = new ArrayList<String>(Arrays.asList("[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"));
-
- NetworkInterfaceCardProperties.Builder networkInterfaceCardPropertiesBuilder = NetworkInterfaceCardProperties.builder();
- networkInterfaceCardPropertiesBuilder.ipConfigurations(ipConfigurations);
- if (networkSecurityGroup != null) {
- networkInterfaceCardPropertiesBuilder.networkSecurityGroup(networkSecurityGroup);
- depends.add("[concat('Microsoft.Network/networkSecurityGroups/', variables('networkSecurityGroupName'))]");
- }
- NetworkInterfaceCardProperties networkInterfaceCardProperties = networkInterfaceCardPropertiesBuilder.build();
-
- String networkInterfaceCardName = name + "nic";
- variables.put("networkInterfaceCardName", networkInterfaceCardName);
- variables.put("networkInterfaceCardReference", "[resourceId('Microsoft.Network/networkInterfaces',variables('networkInterfaceCardName'))]");
-
- ResourceDefinition networkInterfaceCard = ResourceDefinition.builder()
- .name("[variables('networkInterfaceCardName')]")
- .type("Microsoft.Network/networkInterfaces")
- .location(location)
- .apiVersion(STORAGE_API_VERSION)
- .dependsOn(depends)
- .properties(networkInterfaceCardProperties)
- .build();
-
- resources.add(networkInterfaceCard);
- }
-
- private void addNetworkSecurityGroup() {
- int inboundPorts[] = options.getInboundPorts();
- if ((inboundPorts != null) && (inboundPorts.length > 0)) {
- variables.put("networkSecurityGroupName", name + "nsg");
- variables.put("networkSecurityGroupNameReference", "[resourceId('Microsoft.Network/networkSecurityGroups',variables('networkSecurityGroupName'))]");
-
- List<String> portRanges = simplifyPorts(inboundPorts);
-
- List<NetworkSecurityRule> rules = new ArrayList<NetworkSecurityRule>();
- int priority = 1234;
- for (String portRange : portRanges) {
- NetworkSecurityRuleProperties ruleProperties = NetworkSecurityRuleProperties.builder()
- .description("default-allow-port-" + portRange)
- .protocol(NetworkSecurityRuleProperties.Protocol.All)
- .access(NetworkSecurityRuleProperties.Access.Allow)
- .sourcePortRange("*")
- .destinationPortRange(portRange)
- .sourceAddressPrefix("*")
- .destinationAddressPrefix("*")
- .priority(priority)
- .direction(NetworkSecurityRuleProperties.Direction.Inbound)
- .build();
-
- NetworkSecurityRule networkSecurityRule = NetworkSecurityRule.create(
- "default-allow-port-" + portRange,
- null,
- null,
- ruleProperties);
-
- rules.add(networkSecurityRule);
- priority++;
- }
-
- NetworkSecurityGroupProperties networkSecurityGroupProperties = NetworkSecurityGroupProperties.builder()
- .securityRules(rules)
- .build();
-
- ResourceDefinition networkSecurityGroup = ResourceDefinition.builder()
- .name("[variables('networkSecurityGroupName')]")
- .type("Microsoft.Network/networkSecurityGroups").location(location)
- .apiVersion(STORAGE_API_VERSION)
- .properties(networkSecurityGroupProperties)
- .build();
- resources.add(networkSecurityGroup);
- }
-
- }
-
- /**
- * Helper function for simplifying an array of ports to a list of ranges as list of strings
- * @param ports array of int
- * @return list of strings representing ranges
- */
- public static List<String> simplifyPorts(int[] ports) {
- Preconditions.checkArgument(ports != null && ports.length != 0);
- ArrayList<String> output = new ArrayList<String>();
- Arrays.sort(ports);
-
- int range_start = ports[0];
- int range_end = ports[0];
- for (int i = 1; i < ports.length; i++) {
- if ((ports[i - 1] == ports[i] - 1) || (ports[i - 1] == ports[i])){
- // Range continues.
- range_end = ports[i];
- }
- else {
- // Range ends.
- output.add(formatRange(range_start, range_end));
- range_start = ports[i];
- range_end = ports[i];
- }
- }
- // Make sure we get the last range.
- output.add(formatRange(range_start, range_end));
- return output;
- }
-
- private static String formatRange(int start, int finish) {
- if (start == finish){
- return Integer.toString(start);
- }
- else {
- return String.format("%s-%s", Integer.toString(start), Integer.toString(finish));
- }
- }
-
- private void addVirtualMachine() {
- //Build OS Profile
- final String computerName = name + "pc";
-
- variables.put("loginUser", loginUser);
- OSProfile.Builder profileBuilder = OSProfile.builder()
- .adminUsername(loginUser)
- .computerName(computerName);
-
- profileBuilder.adminPassword(loginPassword);
- //boolean usePublicKey = options.getPublicKey() != null;
-
- if (keyVaultInUse()) {
- OSProfile.LinuxConfiguration configuration = OSProfile.LinuxConfiguration.create("false",
- OSProfile.LinuxConfiguration.SSH.create(Arrays.asList(
- OSProfile.LinuxConfiguration.SSH.SSHPublicKey.create(
- "[concat('/home/',variables('loginUser'),'/.ssh/authorized_keys')]",
- "[parameters('publicKeyFromAzureKeyVault')]"
- ))
- ));
- profileBuilder.linuxConfiguration(configuration);
- }
-
- if (!Strings.isNullOrEmpty(options.getCustomData())){
- String encodedCustomData = base64().encode(options.getCustomData().getBytes());
- profileBuilder.customData(encodedCustomData);
- }
-
- OSProfile osProfile = profileBuilder.build();
-
- //Build OsDisk
- final String storageAccountContainerName = name + "vhds";
- variables.put("storageAccountContainerName", storageAccountContainerName);
-
- final String osDiskName = name + "osdisk";
- variables.put("osDiskName", osDiskName);
-
- boolean usingMarketplaceImage = true;
- String cusotomImageUri = "";
-
- // Handle custom image case if description starts with CUSTOM_IMAGE_PREFIX
- String vhd1 = template.getImage().getProviderId();
- String description = template.getImage().getDescription();
- if (description.substring(0, CUSTOM_IMAGE_PREFIX.length()).equals(CUSTOM_IMAGE_PREFIX)) {
- String storageName = template.getImage().getVersion();
- cusotomImageUri = vhd1;
- cusotomImageUri = "https://" + storageName + ".blob.core.windows.net/system/Microsoft.Compute/Images/" + AzureComputeImageExtension.CONTAINER_NAME + "/" + cusotomImageUri;
- }
-
- if (!cusotomImageUri.isEmpty()) {
- usingMarketplaceImage = false;
- }
-
- OSDisk osDisk = getOsDisk("[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('storageAccountContainerName'),'/',variables('osDiskName'),'.vhd')]", cusotomImageUri);
-
- //Create Data Disk(s) and add to list
- final String dataDiskName = name + "datadisk";
- variables.put("dataDiskName", dataDiskName);
-
- List<DataDisk> dataDisks = new ArrayList<DataDisk>();
- DataDisk dataDisk = DataDisk.builder()
- .name("[variables('dataDiskName')]")
- .diskSizeGB(azureComputeConstants.azureDefaultDataDiskSizeProperty())
- .lun(0)
- .vhd(
- VHD.create("[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('storageAccountContainerName'),'/',variables('dataDiskName'),'.vhd')]")
- )
- .createOption("Empty")
- .build();
-
- dataDisks.add(dataDisk);
-
- //Create Storage Profile
- StorageProfile.Builder storageProfileBuilder = StorageProfile.builder()
- .osDisk(osDisk)
- .dataDisks(dataDisks);
-
- if (usingMarketplaceImage) {
- //Build Image Reference if marketplace image is used
- ImageReference imageReference = getImageReference(template.getImage().getProviderId(),
- template.getImage().getName(),
- template.getImage().getVersion());
-
- storageProfileBuilder.imageReference(imageReference);
- }
- StorageProfile storageProfile = storageProfileBuilder.build();
-
-
- //Create Network Profile for this VM (links to network interface cards)
- NetworkProfile networkProfile = NetworkProfile.create(
- Arrays.asList(
- IdReference.create("[variables('networkInterfaceCardReference')]")
- ));
-
- //Boot Diagnostics
- DiagnosticsProfile diagnosticsProfile = DiagnosticsProfile.create(
- DiagnosticsProfile.BootDiagnostics.builder()
- .enabled(true)
- .storageUri("[concat('http://',variables('storageAccountName'),'.blob.core.windows.net')]")
- .build());
-
- //Build VirtualMachine properties based on above properties.
- final String vmSize = template.getHardware().getId();
- HardwareProfile hw = HardwareProfile.create(vmSize);
-
- VirtualMachineProperties properties = VirtualMachineProperties.builder()
- .hardwareProfile(hw)
- .osProfile(osProfile)
- .storageProfile(storageProfile)
- .networkProfile(networkProfile)
- .diagnosticsProfile(diagnosticsProfile)
- .build();
-
-
- String tagString = Joiner.on(",").join(Lists.newArrayList(tags));
- if (tagString.isEmpty())
- tagString = "jclouds";
- userMetaData.put("tags", tagString);
-
- variables.put("virtualMachineName", name);
- ResourceDefinition virtualMachine = ResourceDefinition.builder()
- .name("[variables('virtualMachineName')]")
- .type("Microsoft.Compute/virtualMachines")
- .location(location)
- .apiVersion("2015-06-15")
- .dependsOn(Arrays.asList("[concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
- "[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceCardName'))]"))
- .tags(userMetaData)
- .properties(properties)
- .build();
-
- resources.add(virtualMachine);
- }
-
-
- private ImageReference getImageReference(String publisher, String offer, String sku) {
- return ImageReference.builder()
- .publisher(publisher)
- .offer(offer)
- .sku(sku)
- .version("latest")
- .build();
-
- }
-
- private OSDisk getOsDisk(String vhdUri, String imageUri) {
- OSDisk.Builder builder = OSDisk.builder();
- builder.name("[variables('osDiskName')]");
- builder.caching("ReadWrite");
- builder.createOption("FromImage");
- builder.vhd(VHD.create(vhdUri));
-
- if (!imageUri.isEmpty()) {
- builder.osType("Linux");
- builder.image(VHD.create(imageUri));
- }
- return builder.build();
- }
-
- private boolean keyVaultInUse(){
- return !Strings.isNullOrEmpty(options.getKeyVaultIdAndSecret());
- }
-
- /**
- * Generates a valid storage account
- *
- * Storage account names must be between 3 and 24 characters in length and may contain numbers and lowercase letters only.
- *
- * @param name the node name
- * @return the storage account name starting from a sanitized name (with only numbers and lowercase letters only ).
- * If sanitized name is between 3 and 24 characters, storage account name is equals to sanitized name.
- * If sanitized name is less than 3 characters, storage account is sanitized name plus 4 random chars.
- * If sanitized name is more than 24 characters, storage account is first 10 chars of sanitized name plus 4 random chars plus last 10 chars of sanitized name.
- */
- private static String generateStorageAccountName(String name) {
- String storageAccountName = name.replaceAll("[^a-z0-9]", "");
- int nameLength = storageAccountName.length();
- if (nameLength >= 3 && nameLength <= 24) {
- return storageAccountName;
- }
-
- String random = UUID.randomUUID().toString().replaceAll("[^a-z0-9]", "").substring(0, 4);
- if (nameLength < 3) {
- storageAccountName = new StringBuilder().append(storageAccountName).append(random).toString();
- }
- if (nameLength > 24) {
- storageAccountName = shorten(storageAccountName, random);
- }
- return storageAccountName;
- }
-
- private static String shorten(String storageAccountName, String random) {
- String prefix = storageAccountName.substring(0, 10);
- String suffix = storageAccountName.substring(storageAccountName.length() - 10, storageAccountName.length());
- return String.format("%s%s%s", prefix, random, suffix);
- }
-}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
index 4a61613..f42bad3 100644
--- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
+++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/GetEnumValue.java
@@ -20,7 +20,6 @@ import java.util.EnumSet;
public class GetEnumValue {
- @SuppressWarnings("unchecked")
public static <T extends Enum<T>> Enum<T> fromValueOrDefault(String text, Enum<T> defaultValue) {
if (text != null) {
EnumSet<T> elements = EnumSet.allOf(defaultValue.getDeclaringClass());
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
index d6fdd3c..c338954 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureComputeServiceLiveTest.java
@@ -16,21 +16,26 @@
*/
package org.jclouds.azurecompute.arm.compute;
-import java.util.Map;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.IMAGE_PUBLISHERS;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.RESOURCE_GROUP_NAME;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_PORT_OPEN;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
+import static org.jclouds.compute.options.TemplateOptions.Builder.authorizePublicKey;
+import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS;
+
import java.util.Properties;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
-import org.jclouds.compute.RunScriptOnNodesException;
-import org.jclouds.compute.domain.ExecResponse;
import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
-import org.jclouds.compute.predicates.NodePredicates;
-import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.config.LoggingModule;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.providers.ProviderMetadata;
@@ -41,29 +46,18 @@ import org.jclouds.scriptbuilder.statements.login.AdminAccess;
import org.jclouds.sshj.config.SshjSshClientModule;
import org.testng.annotations.Test;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.IMAGE_PUBLISHERS;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.RESOURCE_GROUP_NAME;
-import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_PORT_OPEN;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
-
/**
* Live tests for the {@link org.jclouds.compute.ComputeService} integration.
*/
@Test(groups = "live", singleThreaded = true, testName = "AzureComputeServiceLiveTest")
public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
- protected int nonBlockDurationSeconds = 30;
-
+
public AzureComputeServiceLiveTest() {
provider = "azurecompute-arm";
- nonBlockDurationSeconds = 300;
- group = "az-u";
}
@Override
@@ -78,21 +72,20 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
@Override
protected ProviderMetadata createProviderMetadata() {
- AzureComputeProviderMetadata pm = AzureComputeProviderMetadata.builder().build();
- return pm;
+ return AzureComputeProviderMetadata.builder().build();
}
@Override
protected Properties setupProperties() {
Properties properties = super.setupProperties();
- long scriptTimeout = TimeUnit.MILLISECONDS.convert(60, TimeUnit.MINUTES);
- properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, scriptTimeout + "");
- properties.setProperty(TIMEOUT_NODE_RUNNING, scriptTimeout + "");
- properties.setProperty(TIMEOUT_PORT_OPEN, scriptTimeout + "");
- properties.setProperty(TIMEOUT_NODE_TERMINATED, scriptTimeout + "");
- properties.setProperty(TIMEOUT_NODE_SUSPENDED, scriptTimeout + "");
- properties.put(RESOURCE_GROUP_NAME, "a4");
- properties.put(TEMPLATE, "locationId=westeurope");
+ String defaultTimeout = String.valueOf(TimeUnit.MILLISECONDS.convert(60, TimeUnit.MINUTES));
+ properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, defaultTimeout);
+ properties.setProperty(TIMEOUT_NODE_RUNNING, defaultTimeout);
+ properties.setProperty(TIMEOUT_PORT_OPEN, defaultTimeout);
+ properties.setProperty(TIMEOUT_NODE_TERMINATED, defaultTimeout);
+ properties.setProperty(TIMEOUT_NODE_SUSPENDED, defaultTimeout);
+ properties.put(RESOURCE_GROUP_NAME, "jc");
+ properties.put(PROPERTY_REGIONS, "eastus");
properties.put(IMAGE_PUBLISHERS, "Canonical");
AzureLiveTestUtils.defaultProperties(properties);
@@ -102,24 +95,27 @@ public class AzureComputeServiceLiveTest extends BaseComputeServiceLiveTest {
}
@Override
- protected Template refreshTemplate() {
- return this.template = addRunScriptToTemplate(this.buildTemplate(this.client.templateBuilder()));
+ protected TemplateBuilder templateBuilder() {
+ return super.templateBuilder().options(
+ authorizePublicKey(keyPair.get("public")).overrideLoginPrivateKey(keyPair.get("private")));
}
@Override
protected Template addRunScriptToTemplate(Template template) {
- template.getOptions().runScript(Statements.newStatementList(new Statement[]{AdminAccess.standard(), Statements.exec("sleep 50"), InstallJDK.fromOpenJDK()}));
+ template.getOptions().runScript(
+ Statements.newStatementList(new Statement[] { AdminAccess.standard(), Statements.exec("sleep 50"),
+ InstallJDK.fromOpenJDK() }));
return template;
}
-
+
@Override
- @Test( enabled = false)
- protected void weCanCancelTasks(NodeMetadata node) throws InterruptedException, ExecutionException {
- return;
+ protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
+ // User metadata not yet supported
}
@Override
- protected Map<? extends NodeMetadata, ExecResponse> runScriptWithCreds(String group, OperatingSystem os, LoginCredentials creds) throws RunScriptOnNodesException {
- return this.client.runScriptOnNodesMatching(NodePredicates.runningInGroup(group), Statements.newStatementList(Statements.exec("sleep 50"), InstallJDK.fromOpenJDK()), org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials(creds).nameTask("runScriptWithCreds"));
+ protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
+ // Tags not yet supported
}
+
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureTemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureTemplateBuilderLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureTemplateBuilderLiveTest.java
index 8756240..c20655b 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureTemplateBuilderLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/AzureTemplateBuilderLiveTest.java
@@ -16,33 +16,30 @@
*/
package org.jclouds.azurecompute.arm.compute;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.RESOURCE_GROUP_NAME;
+import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
import java.util.Properties;
import java.util.Set;
-import java.util.concurrent.TimeUnit;
import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
+import org.jclouds.azurecompute.arm.domain.Region;
import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.compute.domain.Template;
import org.jclouds.compute.internal.BaseTemplateBuilderLiveTest;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.sshj.config.SshjSshClientModule;
import org.testng.annotations.Test;
-import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.RESOURCE_GROUP_NAME;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
-import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
-
@Test(groups = "live", testName = "AzureTemplateBuilderLiveTest")
public class AzureTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest {
- public String azureGroup;
-
- @Override
- protected Set<String> getIso3166Codes() {
- return ImmutableSet.of("US-IA", "US-VA", "US-IL", "US-TX", "US-CA", "IE", "NL", "HK", "SG", "JP-11", "JP-27", "BR", "AU-NSW", "AU-VIC", "IN-GA", "IN-TN", "IN-MH", "CN-SH", "CN-BJ", "CA-ON", "CA-QC");
- }
public AzureTemplateBuilderLiveTest() {
provider = "azurecompute-arm";
@@ -55,23 +52,33 @@ public class AzureTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest {
@Override
protected ProviderMetadata createProviderMetadata() {
- AzureComputeProviderMetadata pm = AzureComputeProviderMetadata.builder().build();
- return pm;
+ return AzureComputeProviderMetadata.builder().build();
}
@Override
protected Properties setupProperties() {
- azureGroup = "jc" + System.getProperty("user.name").substring(0, 3);
Properties properties = super.setupProperties();
- long scriptTimeout = TimeUnit.MILLISECONDS.convert(20, TimeUnit.MINUTES);
- properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, scriptTimeout + "");
- properties.setProperty(TIMEOUT_NODE_RUNNING, scriptTimeout + "");
- properties.put(RESOURCE_GROUP_NAME, azureGroup);
+ properties.put(RESOURCE_GROUP_NAME, "jc");
AzureLiveTestUtils.defaultProperties(properties);
checkNotNull(setIfTestSystemPropertyPresent(properties, "oauth.endpoint"), "test.oauth.endpoint");
return properties;
-
+ }
+
+ @Override
+ @Test
+ public void testDefaultTemplateBuilder() throws IOException {
+ Template defaultTemplate = view.getComputeService().templateBuilder().build();
+ assertTrue(defaultTemplate.getImage().getOperatingSystem().getVersion().matches("1[45]\\.[01][04]\\.[0-9]-LTS"),
+ "Version mismatch, expected dd.dd.d-LTS, found: " + defaultTemplate.getImage().getOperatingSystem().getVersion());
+ assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
+ assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
+ assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
+ }
+
+ @Override
+ protected Set<String> getIso3166Codes() {
+ return Region.iso3166Codes();
}
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
index 06f9ab7..de44668 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtensionLiveTest.java
@@ -16,29 +16,35 @@
*/
package org.jclouds.azurecompute.arm.compute.extensions;
-import com.google.inject.Module;
-import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
-import org.jclouds.azurecompute.arm.config.AzureComputeProperties;
-import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
-import org.jclouds.compute.config.ComputeServiceProperties;
-import org.jclouds.compute.extensions.internal.BaseImageExtensionLiveTest;
-import org.jclouds.providers.ProviderMetadata;
-import org.jclouds.sshj.config.SshjSshClientModule;
-import org.testng.annotations.Test;
-
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
-
import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.IMAGE_PUBLISHERS;
import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.RESOURCE_GROUP_NAME;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_PORT_OPEN;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
+import static org.jclouds.compute.options.TemplateOptions.Builder.authorizePublicKey;
+import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS;
+
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.azurecompute.arm.AzureComputeProviderMetadata;
+import org.jclouds.azurecompute.arm.internal.AzureLiveTestUtils;
+import org.jclouds.compute.ComputeTestUtils;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.extensions.internal.BaseImageExtensionLiveTest;
+import org.jclouds.providers.ProviderMetadata;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.Test;
+
+import com.google.inject.Module;
/**
- * Live tests for the {@link org.jclouds.compute.extensions.ImageExtension} integration.
+ * Live tests for the {@link org.jclouds.compute.extensions.ImageExtension}
+ * integration.
*/
@Test(groups = "live", singleThreaded = true, testName = "AzureComputeImageExtensionLiveTest")
public class AzureComputeImageExtensionLiveTest extends BaseImageExtensionLiveTest {
@@ -57,34 +63,33 @@ public class AzureComputeImageExtensionLiveTest extends BaseImageExtensionLiveTe
@Override
protected Properties setupProperties() {
Properties properties = super.setupProperties();
- long scriptTimeout = TimeUnit.MILLISECONDS.convert(60, TimeUnit.MINUTES);
- properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, scriptTimeout + "");
- properties.setProperty(TIMEOUT_NODE_RUNNING, scriptTimeout + "");
- properties.setProperty(TIMEOUT_PORT_OPEN, scriptTimeout + "");
- properties.setProperty(TIMEOUT_NODE_TERMINATED, scriptTimeout + "");
- properties.setProperty(TIMEOUT_NODE_SUSPENDED, scriptTimeout + "");
- properties.put(RESOURCE_GROUP_NAME, "jcloudsgroup");
-
- properties.put(ComputeServiceProperties.POLL_INITIAL_PERIOD, 1000);
- properties.put(ComputeServiceProperties.POLL_MAX_PERIOD, 10000);
- properties.setProperty(AzureComputeProperties.OPERATION_TIMEOUT, "46000000");
- properties.setProperty(AzureComputeProperties.OPERATION_POLL_INITIAL_PERIOD, "5");
- properties.setProperty(AzureComputeProperties.OPERATION_POLL_MAX_PERIOD, "15");
- properties.setProperty(AzureComputeProperties.TCP_RULE_FORMAT, "tcp_%s-%s");
- properties.setProperty(AzureComputeProperties.TCP_RULE_REGEXP, "tcp_\\d{1,5}-\\d{1,5}");
+ String defaultTimeout = String.valueOf(TimeUnit.MILLISECONDS.convert(60, TimeUnit.MINUTES));
+ properties.setProperty(TIMEOUT_SCRIPT_COMPLETE, defaultTimeout);
+ properties.setProperty(TIMEOUT_NODE_RUNNING, defaultTimeout);
+ properties.setProperty(TIMEOUT_PORT_OPEN, defaultTimeout);
+ properties.setProperty(TIMEOUT_NODE_TERMINATED, defaultTimeout);
+ properties.setProperty(TIMEOUT_NODE_SUSPENDED, defaultTimeout);
+ properties.put(RESOURCE_GROUP_NAME, "jc");
+ properties.put(PROPERTY_REGIONS, "eastus");
+ properties.put(IMAGE_PUBLISHERS, "Canonical");
AzureLiveTestUtils.defaultProperties(properties);
checkNotNull(setIfTestSystemPropertyPresent(properties, "oauth.endpoint"), "test.oauth.endpoint");
return properties;
-
}
@Override
protected ProviderMetadata createProviderMetadata() {
- AzureComputeProviderMetadata pm = AzureComputeProviderMetadata.builder().build();
- return pm;
+ return AzureComputeProviderMetadata.builder().build();
}
+ @Override
+ public TemplateBuilder getNodeTemplate() {
+ Map<String, String> keyPair = ComputeTestUtils.setupKeyPair();
+ return super.getNodeTemplate().options(
+ authorizePublicKey(keyPair.get("public"))
+ .overrideLoginPrivateKey(keyPair.get("private")));
+ }
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/2f110387/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
index 7476828..42116c2 100644
--- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
+++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentApiLiveTest.java
@@ -16,30 +16,19 @@
*/
package org.jclouds.azurecompute.arm.features;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
import java.net.URI;
import java.util.List;
import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions;
import org.jclouds.azurecompute.arm.domain.Deployment;
import org.jclouds.azurecompute.arm.domain.Deployment.ProvisioningState;
-import org.jclouds.azurecompute.arm.domain.DeploymentBody;
-import org.jclouds.azurecompute.arm.domain.DeploymentProperties;
import org.jclouds.azurecompute.arm.domain.Subnet;
import org.jclouds.azurecompute.arm.domain.VirtualNetwork;
import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
-import org.jclouds.azurecompute.arm.util.DeploymentTemplateBuilder;
-import org.jclouds.compute.domain.Hardware;
-import org.jclouds.compute.domain.HardwareBuilder;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.ImageBuilder;
-import org.jclouds.compute.domain.OperatingSystem;
-import org.jclouds.compute.domain.OsFamily;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.compute.domain.internal.TemplateImpl;
-import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
import org.jclouds.util.Predicates2;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
@@ -49,10 +38,6 @@ import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.net.UrlEscapers;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-
@Test(testName = "DeploymentApiLiveTest", singleThreaded = true)
public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
@@ -112,37 +97,6 @@ public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
return body;
}
- private Template getTemplate(TemplateOptions options) {
- Location provider = (new LocationBuilder()).scope(LocationScope.PROVIDER).id("azurecompute-arm").description("azurecompute-arm").build();
- Location region = (new LocationBuilder()).scope(LocationScope.REGION).id(LOCATION).description("West Europe").parent(provider).build();
-
- OperatingSystem os = OperatingSystem.builder()
- .family(OsFamily.UBUNTU)
- .description("14.04.3-LTS")
- .is64Bit(true)
- .build();
-
- Image image = (new ImageBuilder())
- .id("UbuntuServer14.04.3-LTS")
- .providerId("Canonical")
- .name("UbuntuServer")
- .description("14.04.3-LTS")
- .version("14.04.3-LTS")
- .operatingSystem(os)
- .status(Image.Status.AVAILABLE)
- .location(region)
- .build();
-
- Hardware hardware = (new HardwareBuilder()).id("Standard_A0").build();
- return new TemplateImpl(image, hardware, region, options);
- }
-
- private DeploymentTemplateBuilder getDeploymentTemplateBuilderWithOptions(TemplateOptions options) {
- Template template = getTemplate(options);
- DeploymentTemplateBuilder templateBuilder = api.deploymentTemplateFactory().create(resourceGroupName, deploymentName, template);
- return templateBuilder;
- }
-
@Test
public void testValidate(){
Deployment deploymentInvalid = null;
@@ -168,12 +122,40 @@ public class DeploymentApiLiveTest extends BaseAzureComputeApiLiveTest {
AzureTemplateOptions options = new AzureTemplateOptions();
options.authorizePublicKey(rsakey);
options.subnetId(subnetId);
- DeploymentTemplateBuilder templateBuilder = getDeploymentTemplateBuilderWithOptions(options);
- DeploymentBody deploymentTemplateBody = templateBuilder.getDeploymentTemplate();
-
- DeploymentProperties properties = DeploymentProperties.create(deploymentTemplateBody);
- String deploymentTemplate = templateBuilder.getDeploymentTemplateJson(properties);
+ String deploymentTemplate = "{\n" +
+ " \"id\": \"/subscriptions/04f7ec88-8e28-41ed-8537-5e17766001f5/resourceGroups/jims216group/providers/Microsoft.Resources/deployments/jcdep1458344383064\",\n" +
+ " \"name\": \"jcdep1458344383064\",\n" +
+ " \"properties\": {\n" +
+ " \"parameters\": {\n" +
+ " \"newStorageAccountName\": {\n" +
+ " \"type\": \"String\",\n" +
+ " \"value\": \"jcres1458344383064\"\n" +
+ " },\n" +
+ " \"storageAccountType\": {\n" +
+ " \"type\": \"String\",\n" +
+ " \"value\": \"Standard_LRS\"\n" +
+ " },\n" +
+ " \"location\": {\n" +
+ " \"type\": \"String\",\n" +
+ " \"value\": \"West US\"\n" +
+ " }\n" +
+ " },\n" +
+ " \"mode\": \"Incremental\",\n" +
+ " \"provisioningState\": \"Accepted\",\n" +
+ " \"timestamp\": \"2016-03-18T23:39:47.3048037Z\",\n" +
+ " \"duration\": \"PT2.4433028S\",\n" +
+ " \"correlationId\": \"8dee9711-8632-4948-9fe6-368bb75e6438\",\n" +
+ " \"providers\": [{\n" +
+ " \"namespace\": \"Microsoft.Storage\",\n" +
+ " \"resourceTypes\": [{\n" +
+ " \"resourceType\": \"storageAccounts\",\n" +
+ " \"locations\": [\"westus\"]\n" +
+ " }]\n" +
+ " }],\n" +
+ " \"dependencies\": []\n" +
+ " }\n" +
+ "}";
deploymentTemplate = UrlEscapers.urlFormParameterEscaper().escape(deploymentTemplate);
Deployment deploymentValid = api().validate(deploymentName, deploymentTemplate);