Repository: jclouds-labs Updated Branches: refs/heads/fix/AzureTemplateBuilderLiveTest eb68333d1 -> 820300612
image extension and tempalte builder fixes Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/82030061 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/82030061 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/82030061 Branch: refs/heads/fix/AzureTemplateBuilderLiveTest Commit: 8203006125104d0fd06720e2b8cb2f53a31057d8 Parents: eb68333 Author: Ignasi Barrera <[email protected]> Authored: Thu Oct 13 12:48:53 2016 +0200 Committer: Ignasi Barrera <[email protected]> Committed: Thu Oct 13 12:48:53 2016 +0200 ---------------------------------------------------------------------- .../arm/compute/AzureComputeServiceAdapter.java | 10 +++- .../ResourceDefinitionToCustomImage.java | 4 +- .../functions/VirtualMachineToNodeMetadata.java | 11 +++-- .../arm/functions/CleanupResources.java | 8 ++-- .../StorageProfileToStorageAccountName.java | 38 +++++++++++++++ .../compute/AzureTemplateBuilderLiveTest.java | 49 +++++++++++--------- .../AzureComputeImageExtensionLiveTest.java | 15 +++++- 7 files changed, 102 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/82030061/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 6735afc..0e2ed64 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 @@ -56,6 +56,7 @@ import org.jclouds.azurecompute.arm.domain.SKU; import org.jclouds.azurecompute.arm.domain.StorageProfile; import org.jclouds.azurecompute.arm.domain.StorageService; import org.jclouds.azurecompute.arm.domain.StorageService.Status; +import org.jclouds.azurecompute.arm.domain.StorageServiceKeys; import org.jclouds.azurecompute.arm.domain.VHD; import org.jclouds.azurecompute.arm.domain.VMHardware; import org.jclouds.azurecompute.arm.domain.VMImage; @@ -228,8 +229,13 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual VMImage image = decodeFieldsFromUniqueId(id); if (image.custom()) { VMImage customImage = null; - String key = api.getStorageAccountApi(azureGroup).getKeys(image.storage()).key1(); - BlobHelper blobHelper = new BlobHelper(image.storage(), key); + StorageServiceKeys keys = api.getStorageAccountApi(azureGroup).getKeys(image.storage()); + if (keys == null) { + // If the storage account for the image does not exist, it means the image was deleted + return null; + } + + BlobHelper blobHelper = new BlobHelper(image.storage(), keys.key1()); try { if (blobHelper.customImageExists()) { List<VMImage> customImagesInStorage = blobHelper.getImages(CONTAINER_NAME, azureGroup, http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/82030061/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/ResourceDefinitionToCustomImage.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/ResourceDefinitionToCustomImage.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/ResourceDefinitionToCustomImage.java index bf744eb..cce6b50 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/ResourceDefinitionToCustomImage.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/ResourceDefinitionToCustomImage.java @@ -27,6 +27,7 @@ import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextMod import org.jclouds.azurecompute.arm.domain.ResourceDefinition; import org.jclouds.azurecompute.arm.domain.VMImage; import org.jclouds.azurecompute.arm.domain.VirtualMachine; +import org.jclouds.azurecompute.arm.functions.StorageProfileToStorageAccountName; import org.jclouds.compute.domain.Image; import com.google.common.base.Function; @@ -46,13 +47,14 @@ public class ResourceDefinitionToCustomImage implements Function<ResourceDefinit @Inject ResourceDefinitionToCustomImage(AzureComputeApi api, AzureComputeConstants azureComputeConstants, + StorageProfileToStorageAccountName storageProfileToStorageAccountName, Function<VMImage, Image> vmImageToImage, @Assisted("nodeId") String nodeId, @Assisted("imageName") String imageName) { this.vmImageToImage = vmImageToImage; this.resourceGroup = azureComputeConstants.azureResourceGroup(); this.imageName = imageName; - this.storageAccountName = nodeId.replaceAll("[^A-Za-z0-9 ]", "") + "stor"; this.vm = api.getVirtualMachineApi(resourceGroup).get(nodeId); + this.storageAccountName = storageProfileToStorageAccountName.apply(vm.properties().storageProfile()); } @SuppressWarnings("unchecked") http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/82030061/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java index 0929bd4..e151a4a 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/functions/VirtualMachineToNodeMetadata.java @@ -25,7 +25,6 @@ import static org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageE import static org.jclouds.azurecompute.arm.compute.functions.VMImageToImage.encodeFieldsToUniqueId; import static org.jclouds.util.Closeables2.closeQuietly; -import java.net.URI; import java.util.List; import java.util.Map; import java.util.Set; @@ -48,6 +47,7 @@ import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachine import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.VirtualMachineStatus.PowerState; import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties; import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties.ProvisioningState; +import org.jclouds.azurecompute.arm.functions.StorageProfileToStorageAccountName; import org.jclouds.azurecompute.arm.util.BlobHelper; import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; @@ -118,12 +118,14 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No private final Supplier<Map<String, ? extends Hardware>> hardwares; private final Map<String, Credentials> credentialStore; private final Function<VMImage, Image> vmImageToImge; + private final StorageProfileToStorageAccountName storageProfileToStorageAccountName; @Inject VirtualMachineToNodeMetadata(AzureComputeApi api, GroupNamingConvention.Factory namingConvention, Supplier<Map<String, ? extends Image>> images, Supplier<Map<String, ? extends Hardware>> hardwares, @Memoized Supplier<Set<? extends Location>> locations, Map<String, Credentials> credentialStore, - final AzureComputeConstants azureComputeConstants, Function<VMImage, Image> vmImageToImge) { + final AzureComputeConstants azureComputeConstants, Function<VMImage, Image> vmImageToImge, + StorageProfileToStorageAccountName storageProfileToStorageAccountName) { this.api = api; this.nodeNamingConvention = namingConvention.createWithoutPrefix(); this.images = checkNotNull(images, "images cannot be null"); @@ -132,6 +134,7 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No this.credentialStore = credentialStore; this.azureGroup = azureComputeConstants.azureResourceGroup(); this.vmImageToImge = vmImageToImge; + this.storageProfileToStorageAccountName = storageProfileToStorageAccountName; } @Override @@ -241,9 +244,7 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No return Optional.fromNullable(images.get().get( encodeFieldsToUniqueId(false, locatioName, storageProfile.imageReference()))); } else { - String storageAccountNameURI = storageProfile.osDisk().vhd().uri(); - String storageAccountName = Iterables.get(Splitter.on(".").split(URI.create(storageAccountNameURI).getHost()), - 0); + String storageAccountName = storageProfileToStorageAccountName.apply(storageProfile); StorageServiceKeys keys = api.getStorageAccountApi(azureGroup).getKeys(storageAccountName); BlobHelper blobHelper = new BlobHelper(storageAccountName, keys.key1()); http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/82030061/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 e0f0b54..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 @@ -60,11 +60,14 @@ public class CleanupResources implements Function<String, Boolean> { protected final AzureComputeApi api; private final Predicate<URI> resourceDeleted; + private final StorageProfileToStorageAccountName storageProfileToStorageAccountName; @Inject - CleanupResources(AzureComputeApi azureComputeApi, @Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted) { + CleanupResources(AzureComputeApi azureComputeApi, @Named(TIMEOUT_RESOURCE_DELETED) Predicate<URI> resourceDeleted, + StorageProfileToStorageAccountName storageProfileToStorageAccountName) { this.api = azureComputeApi; this.resourceDeleted = resourceDeleted; + this.storageProfileToStorageAccountName = storageProfileToStorageAccountName; } @Override @@ -99,8 +102,7 @@ public class CleanupResources implements Function<String, Boolean> { } } - String storageAccountNameURI = virtualMachine.properties().storageProfile().osDisk().vhd().uri(); - String storageAccountName = Iterables.get(Splitter.on(".").split(URI.create(storageAccountNameURI).getHost()), 0); + String storageAccountName = storageProfileToStorageAccountName.apply(virtualMachine.properties().storageProfile()); StorageServiceKeys keys = api.getStorageAccountApi(group).getKeys(storageAccountName); // Remove the virtual machine files http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/82030061/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/82030061/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/82030061/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 2c48876..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 @@ -24,13 +24,17 @@ import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_S 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; @@ -39,7 +43,8 @@ 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 { @@ -79,4 +84,12 @@ public class AzureComputeImageExtensionLiveTest extends BaseImageExtensionLiveTe 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"))); + } + }
