Add Azure KeyVault support
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/fa63f6b1 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/fa63f6b1 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/fa63f6b1 Branch: refs/heads/master Commit: fa63f6b1ff7b48417389a88d6ebae798e6fb6e90 Parents: 5a3b599 Author: Jim Spring <[email protected]> Authored: Fri Dec 22 18:37:08 2017 -0800 Committer: Ignasi Barrera <[email protected]> Committed: Thu Jan 4 01:44:48 2018 +0100 ---------------------------------------------------------------------- .../azurecompute/arm/AzureComputeApi.java | 12 +- .../arm/AzureComputeProviderMetadata.java | 2 + .../arm/AzureManagementApiMetadata.java | 2 + .../arm/compute/AzureComputeServiceAdapter.java | 2 +- .../AzureComputeServiceContextModule.java | 269 --- .../compute/config/AzurePredicatesModule.java | 602 +++++++ .../ResourceGroupAndNameAndIngressRules.java | 5 +- .../extensions/AzureComputeImageExtension.java | 4 +- .../AzureComputeSecurityGroupExtension.java | 2 +- .../loaders/CreateSecurityGroupIfNeeded.java | 2 +- .../arm/config/AzureComputeProperties.java | 9 + .../azurecompute/arm/domain/Certificate.java | 638 +++++++ .../jclouds/azurecompute/arm/domain/Key.java | 229 +++ .../jclouds/azurecompute/arm/domain/SKU.java | 27 +- .../jclouds/azurecompute/arm/domain/Secret.java | 186 ++ .../jclouds/azurecompute/arm/domain/Vault.java | 112 ++ .../arm/domain/VaultProperties.java | 131 ++ .../azurecompute/arm/features/VaultApi.java | 635 +++++++ .../arm/features/LoadBalancerApiLiveTest.java | 2 +- .../arm/features/VaultApiLiveTest.java | 1057 ++++++++++++ .../arm/features/VaultApiMockTest.java | 1619 ++++++++++++++++++ .../internal/BaseAzureComputeApiLiveTest.java | 60 +- .../internal/BaseAzureComputeApiMockTest.java | 16 +- .../src/test/resources/getvault.json | 60 + .../src/test/resources/vaultbackupkey.json | 3 + .../src/test/resources/vaultbackupsecret.json | 3 + .../src/test/resources/vaultcreate.json | 26 + .../test/resources/vaultcreatecertificate.json | 11 + .../vaultcreatecertificaterequestbody.json | 21 + .../src/test/resources/vaultcreatekey.json | 15 + .../resources/vaultcreatekeyrequestbody.json | 7 + .../test/resources/vaultcreaterequestbody.json | 21 + .../test/resources/vaultdeletecertificate.json | 58 + .../vaultdeletecertificatecontacts.json | 8 + .../resources/vaultdeletecertificateissuer.json | 21 + .../vaultdeletecertificateoperation.json | 11 + .../src/test/resources/vaultdeletekey.json | 15 + .../src/test/resources/vaultdeletesecret.json | 10 + .../src/test/resources/vaultget.json | 26 + .../src/test/resources/vaultgetcertificate.json | 55 + .../resources/vaultgetcertificatecontacts.json | 8 + .../resources/vaultgetcertificateissuer.json | 21 + .../resources/vaultgetcertificateoperation.json | 11 + .../resources/vaultgetcertificatepolicy.json | 37 + .../src/test/resources/vaultgetdeleted.json | 12 + .../resources/vaultgetdeletedcertificate.json | 55 + .../src/test/resources/vaultgetdeletedkey.json | 18 + .../test/resources/vaultgetdeletedsecret.json | 13 + .../src/test/resources/vaultgetkey.json | 15 + .../src/test/resources/vaultgetkeyversions.json | 23 + .../src/test/resources/vaultgetsecret.json | 11 + .../test/resources/vaultgetsecretversions.json | 25 + .../src/test/resources/vaultimportablecert.txt | 58 + .../test/resources/vaultimportcertificate.json | 52 + .../vaultimportcertificaterequestbody.json | 9 + .../resources/vaultimportkeyrequestbody.json | 18 + .../src/test/resources/vaultkeybackup.txt | 1 + .../src/test/resources/vaultkeydecrypt.json | 4 + .../resources/vaultkeydecryptrequestbody.json | 4 + .../src/test/resources/vaultkeyencrypt.json | 4 + .../resources/vaultkeyencryptrequestbody.json | 4 + .../src/test/resources/vaultkeysign.json | 4 + .../test/resources/vaultkeysignrequestbody.json | 4 + .../src/test/resources/vaultkeyunwrap.json | 4 + .../resources/vaultkeyunwraprequestbody.json | 4 + .../src/test/resources/vaultkeyverify.json | 3 + .../resources/vaultkeyverifyrequestbody.json | 5 + .../src/test/resources/vaultkeywrap.json | 4 + .../test/resources/vaultkeywraprequestbody.json | 4 + .../src/test/resources/vaultlist.json | 29 + .../resources/vaultlistcertificateissuers.json | 7 + .../test/resources/vaultlistcertificates.json | 27 + .../resources/vaultlistcertificateversions.json | 17 + .../src/test/resources/vaultlistdeleted.json | 15 + .../resources/vaultlistdeletedcertificates.json | 18 + .../test/resources/vaultlistdeletedkeys.json | 15 + .../test/resources/vaultlistdeletedsecrets.json | 16 + .../src/test/resources/vaultlistkeys.json | 42 + .../src/test/resources/vaultlistsecrets.json | 40 + .../test/resources/vaultmergecertificate.json | 62 + .../vaultmergecertificaterequestbody.json | 10 + .../src/test/resources/vaultmergex5c-1.txt | 1 + .../src/test/resources/vaultmergex5c-2.txt | 1 + .../src/test/resources/vaultmergex5c-3.txt | 1 + .../vaultrecoverdeletedcertificate.json | 52 + .../test/resources/vaultrecoverdeletedkey.json | 15 + .../resources/vaultrecoverdeletedsecret.json | 10 + .../src/test/resources/vaultrestorekey.json | 15 + .../resources/vaultrestorekeyrequestbody.json | 3 + .../src/test/resources/vaultrestoresecret.json | 10 + .../vaultrestoresecretrequestbody.json | 3 + .../src/test/resources/vaultsamplesecret.txt | 27 + .../src/test/resources/vaultsecretbackup.txt | 1 + .../resources/vaultsetcertificatecontacts.json | 8 + .../vaultsetcertificatecontactsrequestbody.json | 7 + .../resources/vaultsetcertificateissuer.json | 21 + .../vaultsetcertificateissuerrequestbody.json | 15 + .../src/test/resources/vaultsetsecret.json | 11 + .../resources/vaultsetsecretrequestbody.json | 7 + .../test/resources/vaultupdatecertificate.json | 58 + .../resources/vaultupdatecertificateissuer.json | 21 + ...vaultupdatecertificateissuerrequestbody.json | 15 + .../vaultupdatecertificateoperation.json | 11 + ...ltupdatecertificateoperationrequestbody.json | 3 + .../resources/vaultupdatecertificatepolicy.json | 37 + ...vaultupdatecertificatepolicyrequestbody.json | 8 + .../vaultupdatecertificaterequestbody.json | 1 + .../src/test/resources/vaultupdatekey.json | 18 + .../resources/vaultupdatekeyrequestbody.json | 5 + .../resources/vaultupdatekeywithversion.json | 18 + .../src/test/resources/vaultupdatesecret.json | 13 + .../resources/vaultupdatesecretrequestbody.json | 5 + .../resources/vaultupdatesecretwithversion.json | 13 + ...vaultupdatesecretwithversionrequestbody.json | 5 + 114 files changed, 6861 insertions(+), 305 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java index 1f6b726..d62a5b7 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeApi.java @@ -41,6 +41,7 @@ import org.jclouds.azurecompute.arm.features.ResourceProviderApi; import org.jclouds.azurecompute.arm.features.StorageAccountApi; import org.jclouds.azurecompute.arm.features.SubnetApi; import org.jclouds.azurecompute.arm.features.VMSizeApi; +import org.jclouds.azurecompute.arm.features.VaultApi; import org.jclouds.azurecompute.arm.features.VirtualMachineApi; import org.jclouds.azurecompute.arm.features.VirtualMachineScaleSetApi; import org.jclouds.azurecompute.arm.features.VirtualNetworkApi; @@ -242,7 +243,7 @@ public interface AzureComputeApi extends Closeable { */ @Delegate MetricDefinitionsApi getMetricsDefinitionsApi(@PathParam("resourceid") String resourceid); - + /** * The Azure Active Directory Graph API provides programmatic access to Azure * AD through REST API endpoints. @@ -253,6 +254,15 @@ public interface AzureComputeApi extends Closeable { GraphRBACApi getGraphRBACApi(); /** + * Managing your key vaults as well as the keys, secrets, and certificates within your key vaults can be + * accomplished through a REST interface. + * + * @see <a href="https://docs.microsoft.com/en-us/rest/api/keyvault/">docs</a> + */ + @Delegate + VaultApi getVaultApi(@PathParam("resourcegroup") String resourcegroup); + + /** * Returns the information about the current service principal. */ @Provides http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java index 335de98..c85beb9 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureComputeProviderMetadata.java @@ -57,6 +57,7 @@ import org.jclouds.azurecompute.arm.features.ResourceProviderApi; import org.jclouds.azurecompute.arm.features.StorageAccountApi; import org.jclouds.azurecompute.arm.features.SubnetApi; import org.jclouds.azurecompute.arm.features.VMSizeApi; +import org.jclouds.azurecompute.arm.features.VaultApi; import org.jclouds.azurecompute.arm.features.VirtualMachineApi; import org.jclouds.azurecompute.arm.features.VirtualMachineScaleSetApi; import org.jclouds.azurecompute.arm.features.VirtualNetworkApi; @@ -126,6 +127,7 @@ public class AzureComputeProviderMetadata extends BaseProviderMetadata { properties.put(API_VERSION_PREFIX + MetricsApi.class.getSimpleName(), "2016-09-01"); properties.put(API_VERSION_PREFIX + VirtualMachineScaleSetApi.class.getSimpleName(), "2017-03-30"); properties.put(API_VERSION_PREFIX + GraphRBACApi.class.getSimpleName(), "1.6"); + properties.put(API_VERSION_PREFIX + VaultApi.class.getSimpleName(), "2016-10-01"); return properties; } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureManagementApiMetadata.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureManagementApiMetadata.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureManagementApiMetadata.java index 9c73e99..56cb788 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureManagementApiMetadata.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/AzureManagementApiMetadata.java @@ -23,6 +23,7 @@ import java.util.Properties; import org.jclouds.apis.ApiMetadata; import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule; +import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule; import org.jclouds.azurecompute.arm.config.AzureComputeHttpApiModule; import org.jclouds.azurecompute.arm.config.AzureComputeParserModule; import org.jclouds.azurecompute.arm.config.AzureComputeRateLimitModule; @@ -80,6 +81,7 @@ public class AzureManagementApiMetadata extends BaseHttpApiMetadata<AzureCompute .add(AzureComputeParserModule.class) .add(AzureComputeHttpApiModule.class) .add(AzureComputeServiceContextModule.class) + .add(AzurePredicatesModule.class) .add(AzureComputeRateLimitModule.class) .build()); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/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 37585e2..cd5e0e9 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 @@ -45,7 +45,7 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule.PublicIpAvailablePredicateFactory; +import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.PublicIpAvailablePredicateFactory; import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName; import org.jclouds.azurecompute.arm.compute.functions.CustomImageToVMImage; import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java index 11d3ab1..de33fdf 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzureComputeServiceContextModule.java @@ -16,22 +16,8 @@ */ package org.jclouds.azurecompute.arm.compute.config; -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.OPERATION_TIMEOUT; -import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE; -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.util.Predicates2.retry; - -import java.net.URI; -import java.util.List; - -import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.azurecompute.arm.AzureComputeApi; import org.jclouds.azurecompute.arm.compute.AzureComputeService; import org.jclouds.azurecompute.arm.compute.AzureComputeServiceAdapter; import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndNameAndIngressRules; @@ -47,20 +33,13 @@ import org.jclouds.azurecompute.arm.compute.loaders.CreateSecurityGroupIfNeeded; import org.jclouds.azurecompute.arm.compute.loaders.DefaultResourceGroup; import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions; import org.jclouds.azurecompute.arm.compute.strategy.CreateResourcesThenCreateNodes; -import org.jclouds.azurecompute.arm.domain.Image; import org.jclouds.azurecompute.arm.domain.Location; import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule; -import org.jclouds.azurecompute.arm.domain.Provisionable; -import org.jclouds.azurecompute.arm.domain.PublicIPAddress; -import org.jclouds.azurecompute.arm.domain.ResourceDefinition; import org.jclouds.azurecompute.arm.domain.ResourceGroup; import org.jclouds.azurecompute.arm.domain.VMHardware; import org.jclouds.azurecompute.arm.domain.VMImage; import org.jclouds.azurecompute.arm.domain.VirtualMachine; -import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance; -import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance.PowerState; -import org.jclouds.azurecompute.arm.functions.ParseJobStatus; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.config.ComputeServiceAdapterContextModule; @@ -72,15 +51,10 @@ import org.jclouds.compute.extensions.SecurityGroupExtension; import org.jclouds.compute.functions.NodeAndTemplateOptionsToStatement; import org.jclouds.compute.functions.NodeAndTemplateOptionsToStatementWithoutPublicKey; import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.compute.reference.ComputeServiceConstants.PollPeriod; -import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; import org.jclouds.net.domain.IpPermission; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -141,247 +115,4 @@ public class AzureComputeServiceContextModule extends protected final LoadingCache<String, ResourceGroup> defaultResourceGroup(CacheLoader<String, ResourceGroup> in) { return CacheBuilder.newBuilder().build(in); } - - @Provides - @Named(TIMEOUT_NODE_RUNNING) - protected VirtualMachineInStatePredicateFactory provideVirtualMachineRunningPredicate(final AzureComputeApi api, - final Timeouts timeouts, final PollPeriod pollPeriod) { - return new VirtualMachineInStatePredicateFactory(api, PowerState.RUNNING, timeouts.nodeRunning, - pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); - } - - @Provides - @Named(TIMEOUT_NODE_TERMINATED) - protected Predicate<URI> provideNodeTerminatedPredicate(final AzureComputeApi api, final Timeouts timeouts, - final PollPeriod pollPeriod) { - return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, pollPeriod.pollInitialPeriod, - pollPeriod.pollMaxPeriod); - } - - @Provides - @Named(TIMEOUT_IMAGE_AVAILABLE) - protected Predicate<URI> provideImageCapturedPredicate(final AzureComputeApi api, final Timeouts timeouts, - final PollPeriod pollPeriod) { - return retry(new ImageCapturedPredicate(api), timeouts.imageAvailable, pollPeriod.pollInitialPeriod, - pollPeriod.pollMaxPeriod); - } - - @Provides - @Named(TIMEOUT_RESOURCE_DELETED) - protected Predicate<URI> provideResourceDeletedPredicate(final AzureComputeApi api, final Timeouts timeouts, - final PollPeriod pollPeriod) { - return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, pollPeriod.pollInitialPeriod, - pollPeriod.pollMaxPeriod); - } - - @Provides - @Named(TIMEOUT_NODE_SUSPENDED) - protected VirtualMachineInStatePredicateFactory provideNodeSuspendedPredicate(final AzureComputeApi api, - final Timeouts timeouts, final PollPeriod pollPeriod) { - return new VirtualMachineInStatePredicateFactory(api, PowerState.STOPPED, timeouts.nodeTerminated, - pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); - } - - @Provides - protected PublicIpAvailablePredicateFactory providePublicIpAvailablePredicate(final AzureComputeApi api, - Predicate<Supplier<Provisionable>> resourceAvailable) { - return new PublicIpAvailablePredicateFactory(api, resourceAvailable); - } - - @Provides - protected SecurityGroupAvailablePredicateFactory provideSecurityGroupAvailablePredicate(final AzureComputeApi api, - Predicate<Supplier<Provisionable>> resourceAvailable) { - return new SecurityGroupAvailablePredicateFactory(api, resourceAvailable); - } - - @Provides - protected ImageAvailablePredicateFactory provideImageAvailablePredicate(final AzureComputeApi api, - Predicate<Supplier<Provisionable>> resourceAvailable, final Timeouts timeouts, final PollPeriod pollPeriod) { - return new ImageAvailablePredicateFactory(api, retry(new ResourceInStatusPredicate("Succeeded"), - timeouts.imageAvailable, pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod)); - } - - @Provides - protected Predicate<Supplier<Provisionable>> provideResourceAvailablePredicate(final AzureComputeApi api, - @Named(OPERATION_TIMEOUT) Integer operationTimeout, PollPeriod pollPeriod) { - return retry(new ResourceInStatusPredicate("Succeeded"), operationTimeout, pollPeriod.pollInitialPeriod, - pollPeriod.pollMaxPeriod); - } - - @Provides - @Named("STORAGE") - protected Predicate<URI> provideStorageAccountAvailablePredicate(final AzureComputeApi api, - @Named(OPERATION_TIMEOUT) Integer operationTimeout, PollPeriod pollPeriod) { - return retry(new ActionDonePredicate(api), operationTimeout, pollPeriod.pollInitialPeriod, - pollPeriod.pollMaxPeriod); - } - - @VisibleForTesting - static class ActionDonePredicate implements Predicate<URI> { - - private final AzureComputeApi api; - - public ActionDonePredicate(final AzureComputeApi api) { - this.api = checkNotNull(api, "api must not be null"); - } - - @Override - public boolean apply(final URI uri) { - checkNotNull(uri, "uri cannot be null"); - return ParseJobStatus.JobStatus.DONE == api.getJobApi().jobStatus(uri) - || ParseJobStatus.JobStatus.NO_CONTENT == api.getJobApi().jobStatus(uri); - } - - } - - @VisibleForTesting - static class ImageCapturedPredicate implements Predicate<URI> { - - private final AzureComputeApi api; - - public ImageCapturedPredicate(final AzureComputeApi api) { - this.api = checkNotNull(api, "api must not be null"); - } - - @Override - public boolean apply(final URI uri) { - checkNotNull(uri, "uri cannot be null"); - if (api.getJobApi().jobStatus(uri) != ParseJobStatus.JobStatus.DONE) { - return false; - } - List<ResourceDefinition> definitions = api.getJobApi().captureStatus(uri); - return definitions != null; - } - } - - public static class VirtualMachineInStatePredicateFactory { - - private final AzureComputeApi api; - private final PowerState powerState; - private final long timeout; - private final long period; - private final long maxPeriod; - - VirtualMachineInStatePredicateFactory(final AzureComputeApi api, final PowerState powerState, final long timeout, - final long period, final long maxPeriod) { - this.api = checkNotNull(api, "api cannot be null"); - this.powerState = checkNotNull(powerState, "powerState cannot be null"); - this.timeout = timeout; - this.period = period; - this.maxPeriod = maxPeriod; - } - - public Predicate<String> create(final String azureGroup) { - return retry(new Predicate<String>() { - @Override - public boolean apply(final String name) { - checkNotNull(name, "name cannot be null"); - VirtualMachineInstance vmInstance = api.getVirtualMachineApi(azureGroup).getInstanceDetails(name); - if (vmInstance == null) { - return false; - } - return powerState == vmInstance.powerState(); - } - }, timeout, period, maxPeriod); - } - } - - public static class ResourceInStatusPredicate implements Predicate<Supplier<Provisionable>> { - private final String expectedStatus; - - ResourceInStatusPredicate(String expectedStatus) { - this.expectedStatus = checkNotNull(expectedStatus, "expectedStatus cannot be null"); - } - - @Override - public boolean apply(Supplier<Provisionable> provisionableSupplier) { - checkNotNull(provisionableSupplier, "provisionableSupplier supplier cannot be null"); - Provisionable provisionable = provisionableSupplier.get(); - return provisionable != null && provisionable.provisioningState().equalsIgnoreCase(expectedStatus); - } - } - - public static class PublicIpAvailablePredicateFactory { - private final AzureComputeApi api; - private final Predicate<Supplier<Provisionable>> resourceAvailable; - - PublicIpAvailablePredicateFactory(final AzureComputeApi api, Predicate<Supplier<Provisionable>> resourceAvailable) { - this.api = checkNotNull(api, "api cannot be null"); - this.resourceAvailable = resourceAvailable; - } - - public Predicate<String> create(final String azureGroup) { - checkNotNull(azureGroup, "azureGroup cannot be null"); - return new Predicate<String>() { - @Override - public boolean apply(final String name) { - checkNotNull(name, "name cannot be null"); - return resourceAvailable.apply(new Supplier<Provisionable>() { - @Override - public Provisionable get() { - PublicIPAddress publicIp = api.getPublicIPAddressApi(azureGroup).get(name); - return publicIp == null ? null : publicIp.properties(); - } - }); - } - }; - } - } - - public static class SecurityGroupAvailablePredicateFactory { - private final AzureComputeApi api; - private final Predicate<Supplier<Provisionable>> resourceAvailable; - - SecurityGroupAvailablePredicateFactory(final AzureComputeApi api, - Predicate<Supplier<Provisionable>> resourceAvailable) { - this.api = checkNotNull(api, "api cannot be null"); - this.resourceAvailable = resourceAvailable; - } - - public Predicate<String> create(final String resourceGroup) { - checkNotNull(resourceGroup, "resourceGroup cannot be null"); - return new Predicate<String>() { - @Override - public boolean apply(final String name) { - checkNotNull(name, "name cannot be null"); - return resourceAvailable.apply(new Supplier<Provisionable>() { - @Override - public Provisionable get() { - NetworkSecurityGroup sg = api.getNetworkSecurityGroupApi(resourceGroup).get(name); - return sg == null ? null : sg.properties(); - } - }); - } - }; - } - } - - public static class ImageAvailablePredicateFactory { - private final AzureComputeApi api; - private final Predicate<Supplier<Provisionable>> resourceAvailable; - - ImageAvailablePredicateFactory(final AzureComputeApi api, - Predicate<Supplier<Provisionable>> resourceAvailable) { - this.api = checkNotNull(api, "api cannot be null"); - this.resourceAvailable = resourceAvailable; - } - - public Predicate<String> create(final String resourceGroup) { - checkNotNull(resourceGroup, "resourceGroup cannot be null"); - return new Predicate<String>() { - @Override - public boolean apply(final String name) { - checkNotNull(name, "name cannot be null"); - return resourceAvailable.apply(new Supplier<Provisionable>() { - @Override - public Provisionable get() { - Image img = api.getVirtualMachineImageApi(resourceGroup).get(name); - return img == null ? null : img.properties(); - } - }); - } - }; - } - } - } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java new file mode 100644 index 0000000..c8dfd6e --- /dev/null +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/config/AzurePredicatesModule.java @@ -0,0 +1,602 @@ +/* + * 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.compute.config; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.name.Named; + +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.reference.ComputeServiceConstants.PollPeriod; + +import org.jclouds.azurecompute.arm.domain.Image; +import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; +import org.jclouds.azurecompute.arm.domain.Provisionable; +import org.jclouds.azurecompute.arm.domain.PublicIPAddress; +import org.jclouds.azurecompute.arm.domain.ResourceDefinition; +import org.jclouds.azurecompute.arm.domain.Vault; +import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance; +import org.jclouds.azurecompute.arm.functions.ParseJobStatus; +import org.jclouds.azurecompute.arm.AzureComputeApi; +import org.jclouds.azurecompute.arm.domain.Key.DeletedKeyBundle; +import org.jclouds.azurecompute.arm.domain.Key.KeyBundle; +import org.jclouds.azurecompute.arm.domain.Secret.DeletedSecretBundle; +import org.jclouds.azurecompute.arm.domain.Secret.SecretBundle; +import org.jclouds.azurecompute.arm.domain.Certificate.DeletedCertificateBundle; +import org.jclouds.azurecompute.arm.domain.Certificate.CertificateBundle; +import org.jclouds.azurecompute.arm.domain.Certificate.CertificateOperation; + +import java.net.URI; +import java.util.List; + +import static org.jclouds.util.Predicates2.retry; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.OPERATION_TIMEOUT; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_DELETE_STATUS; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_KEY_DELETED_STATUS; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_KEY_RECOVERABLE_STATUS; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_SECRET_DELETE_STATUS; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_SECRET_RECOVERABLE_STATUS; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_DELETE_STATUS; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_RECOVERABLE_STATUS; +import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.VAULT_CERTIFICATE_OPERATION_STATUS; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class AzurePredicatesModule extends AbstractModule { + protected void configure() { + } + + @Provides + @Named(TIMEOUT_NODE_RUNNING) + protected VirtualMachineInStatePredicateFactory provideVirtualMachineRunningPredicate(final AzureComputeApi api, + final ComputeServiceConstants.Timeouts timeouts, final PollPeriod pollPeriod) { + return new VirtualMachineInStatePredicateFactory(api, VirtualMachineInstance.PowerState.RUNNING, timeouts.nodeRunning, + pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(TIMEOUT_NODE_TERMINATED) + protected Predicate<URI> provideNodeTerminatedPredicate(final AzureComputeApi api, final ComputeServiceConstants.Timeouts timeouts, + final PollPeriod pollPeriod) { + return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, pollPeriod.pollInitialPeriod, + pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(TIMEOUT_IMAGE_AVAILABLE) + protected Predicate<URI> provideImageCapturedPredicate(final AzureComputeApi api, final ComputeServiceConstants.Timeouts timeouts, + final PollPeriod pollPeriod) { + return retry(new ImageCapturedPredicate(api), timeouts.imageAvailable, pollPeriod.pollInitialPeriod, + pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(TIMEOUT_RESOURCE_DELETED) + protected Predicate<URI> provideResourceDeletedPredicate(final AzureComputeApi api, final ComputeServiceConstants.Timeouts timeouts, + final PollPeriod pollPeriod) { + return retry(new ActionDonePredicate(api), timeouts.nodeTerminated, pollPeriod.pollInitialPeriod, + pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(TIMEOUT_NODE_SUSPENDED) + protected VirtualMachineInStatePredicateFactory provideNodeSuspendedPredicate(final AzureComputeApi api, + final ComputeServiceConstants.Timeouts timeouts, final PollPeriod pollPeriod) { + return new VirtualMachineInStatePredicateFactory(api, VirtualMachineInstance.PowerState.STOPPED, timeouts.nodeTerminated, + pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + @Provides + protected PublicIpAvailablePredicateFactory providePublicIpAvailablePredicate(final AzureComputeApi api, + Predicate<Supplier<Provisionable>> resourceAvailable) { + return new PublicIpAvailablePredicateFactory(api, resourceAvailable); + } + + @Provides + protected SecurityGroupAvailablePredicateFactory provideSecurityGroupAvailablePredicate(final AzureComputeApi api, + Predicate<Supplier<Provisionable>> resourceAvailable) { + return new SecurityGroupAvailablePredicateFactory(api, resourceAvailable); + } + + @Provides + protected ImageAvailablePredicateFactory provideImageAvailablePredicate(final AzureComputeApi api, + Predicate<Supplier<Provisionable>> resourceAvailable, final ComputeServiceConstants.Timeouts timeouts, final PollPeriod pollPeriod) { + return new ImageAvailablePredicateFactory(api, retry(new ResourceInStatusPredicate("Succeeded"), + timeouts.imageAvailable, pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod)); + } + + @Provides + protected Predicate<Supplier<Provisionable>> provideResourceAvailablePredicate(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, PollPeriod pollPeriod) { + return retry(new ResourceInStatusPredicate("Succeeded"), operationTimeout, pollPeriod.pollInitialPeriod, + pollPeriod.pollMaxPeriod); + } + + @VisibleForTesting + static class ActionDonePredicate implements Predicate<URI> { + + private final AzureComputeApi api; + + public ActionDonePredicate(final AzureComputeApi api) { + this.api = checkNotNull(api, "api must not be null"); + } + + @Override + public boolean apply(final URI uri) { + checkNotNull(uri, "uri cannot be null"); + return ParseJobStatus.JobStatus.DONE == api.getJobApi().jobStatus(uri) + || ParseJobStatus.JobStatus.NO_CONTENT == api.getJobApi().jobStatus(uri); + } + } + + @VisibleForTesting + static class ImageCapturedPredicate implements Predicate<URI> { + + private final AzureComputeApi api; + + public ImageCapturedPredicate(final AzureComputeApi api) { + this.api = checkNotNull(api, "api must not be null"); + } + + @Override + public boolean apply(final URI uri) { + checkNotNull(uri, "uri cannot be null"); + if (api.getJobApi().jobStatus(uri) != ParseJobStatus.JobStatus.DONE) { + return false; + } + List<ResourceDefinition> definitions = api.getJobApi().captureStatus(uri); + return definitions != null; + } + } + + public static class VirtualMachineInStatePredicateFactory { + + private final AzureComputeApi api; + private final VirtualMachineInstance.PowerState powerState; + private final long timeout; + private final long period; + private final long maxPeriod; + + VirtualMachineInStatePredicateFactory(final AzureComputeApi api, final VirtualMachineInstance.PowerState powerState, final long timeout, + final long period, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.powerState = checkNotNull(powerState, "powerState cannot be null"); + this.timeout = timeout; + this.period = period; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String azureGroup) { + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + VirtualMachineInstance vmInstance = api.getVirtualMachineApi(azureGroup).getInstanceDetails(name); + if (vmInstance == null) { + return false; + } + return powerState == vmInstance.powerState(); + } + }, timeout, period, maxPeriod); + } + } + + public static class ResourceInStatusPredicate implements Predicate<Supplier<Provisionable>> { + private final String expectedStatus; + + ResourceInStatusPredicate(String expectedStatus) { + this.expectedStatus = checkNotNull(expectedStatus, "expectedStatus cannot be null"); + } + + @Override + public boolean apply(Supplier<Provisionable> provisionableSupplier) { + checkNotNull(provisionableSupplier, "provisionableSupplier supplier cannot be null"); + Provisionable provisionable = provisionableSupplier.get(); + return provisionable != null && provisionable.provisioningState().equalsIgnoreCase(expectedStatus); + } + } + + public static class PublicIpAvailablePredicateFactory { + private final AzureComputeApi api; + private final Predicate<Supplier<Provisionable>> resourceAvailable; + + PublicIpAvailablePredicateFactory(final AzureComputeApi api, Predicate<Supplier<Provisionable>> resourceAvailable) { + this.api = checkNotNull(api, "api cannot be null"); + this.resourceAvailable = resourceAvailable; + } + + public Predicate<String> create(final String azureGroup) { + checkNotNull(azureGroup, "azureGroup cannot be null"); + return new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + return resourceAvailable.apply(new Supplier<Provisionable>() { + @Override + public Provisionable get() { + PublicIPAddress publicIp = api.getPublicIPAddressApi(azureGroup).get(name); + return publicIp == null ? null : publicIp.properties(); + } + }); + } + }; + } + } + + public static class SecurityGroupAvailablePredicateFactory { + private final AzureComputeApi api; + private final Predicate<Supplier<Provisionable>> resourceAvailable; + + SecurityGroupAvailablePredicateFactory(final AzureComputeApi api, + Predicate<Supplier<Provisionable>> resourceAvailable) { + this.api = checkNotNull(api, "api cannot be null"); + this.resourceAvailable = resourceAvailable; + } + + public Predicate<String> create(final String resourceGroup) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + return new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + return resourceAvailable.apply(new Supplier<Provisionable>() { + @Override + public Provisionable get() { + NetworkSecurityGroup sg = api.getNetworkSecurityGroupApi(resourceGroup).get(name); + return sg == null ? null : sg.properties(); + } + }); + } + }; + } + } + + public static class ImageAvailablePredicateFactory { + private final AzureComputeApi api; + private final Predicate<Supplier<Provisionable>> resourceAvailable; + + ImageAvailablePredicateFactory(final AzureComputeApi api, + Predicate<Supplier<Provisionable>> resourceAvailable) { + this.api = checkNotNull(api, "api cannot be null"); + this.resourceAvailable = resourceAvailable; + } + + public Predicate<String> create(final String resourceGroup) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + return new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + return resourceAvailable.apply(new Supplier<Provisionable>() { + @Override + public Provisionable get() { + Image img = api.getVirtualMachineImageApi(resourceGroup).get(name); + return img == null ? null : img.properties(); + } + }); + } + }; + } + } + + @Provides + @Named(VAULT_DELETE_STATUS) + protected VaultPredicates.DeletedVaultStatusPredicateFactory provideDeletedVaultStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultPredicates.DeletedVaultStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + public static class VaultPredicates { + public static class DeletedVaultStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + DeletedVaultStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final boolean shouldBePresent) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + boolean present = false; + List<Vault.DeletedVault> vaults = api.getVaultApi(resourceGroup).listDeletedVaults(); + return shouldBePresent == Iterables.any(vaults, new Predicate<Vault.DeletedVault>() { + @Override public boolean apply(Vault.DeletedVault input) { + return input.name().equals(name); + } + }); + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + } + + @Provides + @Named(VAULT_KEY_DELETED_STATUS) + protected VaultKeyPredicates.DeletedKeyStatusPredicateFactory provideDeletedKeyStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultKeyPredicates.DeletedKeyStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(VAULT_KEY_RECOVERABLE_STATUS) + protected VaultKeyPredicates.RecoverableKeyStatusPredicateFactory provideRecoverableKeyStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultKeyPredicates.RecoverableKeyStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + public static class VaultKeyPredicates { + public static class DeletedKeyStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + DeletedKeyStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final URI vaultUri, final boolean shouldBePresent) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + checkNotNull(vaultUri, "vaultUri cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + boolean present = false; + DeletedKeyBundle key = api.getVaultApi(resourceGroup).getDeletedKey(vaultUri, name); + return shouldBePresent == (key != null); + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + + public static class RecoverableKeyStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + RecoverableKeyStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final URI vaultUri, final boolean isRecovered) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + checkNotNull(vaultUri, "vaultUri cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + boolean result = false; + KeyBundle key = api.getVaultApi(resourceGroup).getKey(vaultUri, name); + return key != null ? (isRecovered ? true : key.attributes().recoveryLevel().contains("Recoverable")) : false; + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + } + + @Provides + @Named(VAULT_SECRET_DELETE_STATUS) + protected VaultSecretPredicates.DeletedSecretStatusPredicateFactory provideDeletedSecretStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultSecretPredicates.DeletedSecretStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(VAULT_SECRET_RECOVERABLE_STATUS) + protected VaultSecretPredicates.RecoverableSecretStatusPredicateFactory provideRecoverableSecretStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultSecretPredicates.RecoverableSecretStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + public static class VaultSecretPredicates { + public static class DeletedSecretStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + DeletedSecretStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final URI vaultUri, final boolean shouldBePresent) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + checkNotNull(vaultUri, "vaultUri cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + boolean present = false; + checkNotNull(name, "name cannot be null"); + DeletedSecretBundle secret = api.getVaultApi(resourceGroup).getDeletedSecret(vaultUri, name); + return shouldBePresent == (secret != null); + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + + public static class RecoverableSecretStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + RecoverableSecretStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final URI vaultUri, final boolean isRecovered) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + checkNotNull(vaultUri, "vaultUri cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + SecretBundle secret = api.getVaultApi(resourceGroup).getSecret(vaultUri, name, null); + return secret != null ? (isRecovered ? true : secret.attributes().recoveryLevel().contains("Recoverable")) : false; + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + } + + @Provides + @Named(VAULT_CERTIFICATE_DELETE_STATUS) + protected VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory provideDeletedCertificateStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultCertificatePredicates.DeletedCertificateStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(VAULT_CERTIFICATE_RECOVERABLE_STATUS) + protected VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory provideRecoverableCertificateStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultCertificatePredicates.RecoverableCertificateStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + @Provides + @Named(VAULT_CERTIFICATE_OPERATION_STATUS) + protected VaultCertificatePredicates.CertificateOperationStatusPredicateFactory provideCertificateOperationStatusPredicateFactory(final AzureComputeApi api, + @Named(OPERATION_TIMEOUT) Integer operationTimeout, + final PollPeriod pollPeriod) { + return new VaultCertificatePredicates.CertificateOperationStatusPredicateFactory(api, operationTimeout.longValue(), pollPeriod.pollInitialPeriod, pollPeriod.pollMaxPeriod); + } + + public static class VaultCertificatePredicates { + public static class DeletedCertificateStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + DeletedCertificateStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final URI vaultUri, final boolean shouldBePresent) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + checkNotNull(vaultUri, "vaultUri cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + boolean present = false; + checkNotNull(name, "name cannot be null"); + DeletedCertificateBundle cert = api.getVaultApi(resourceGroup).getDeletedCertificate(vaultUri, name); + return shouldBePresent == (cert != null); + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + + public static class RecoverableCertificateStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + RecoverableCertificateStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final URI vaultUri, final boolean isImport) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + checkNotNull(vaultUri, "vaultUri cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + CertificateBundle cert = api.getVaultApi(resourceGroup).getCertificate(vaultUri, name, null); + return cert != null ? (isImport ? true : cert.attributes().recoveryLevel().contains("Recoverable")) : false; + + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + + public static class CertificateOperationStatusPredicateFactory { + private final AzureComputeApi api; + private final long operationTimeout; + private final long initialPeriod; + private final long maxPeriod; + + CertificateOperationStatusPredicateFactory(final AzureComputeApi api, final long operationTimeout, final long initialPeriod, final long maxPeriod) { + this.api = checkNotNull(api, "api cannot be null"); + this.operationTimeout = operationTimeout; + this.initialPeriod = initialPeriod; + this.maxPeriod = maxPeriod; + } + + public Predicate<String> create(final String resourceGroup, final URI vaultUri, final boolean isCreate) { + checkNotNull(resourceGroup, "resourceGroup cannot be null"); + checkNotNull(vaultUri, "vaultUri cannot be null"); + return retry(new Predicate<String>() { + @Override + public boolean apply(final String name) { + checkNotNull(name, "name cannot be null"); + boolean result = false; + CertificateOperation certOp = api.getVaultApi(resourceGroup).getCertificateOperation(vaultUri, name); + return isCreate ? ((certOp != null) ? !certOp.status().equals("inProgress") : false) : (certOp == null); + } + }, operationTimeout, initialPeriod, maxPeriod); + } + } + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/domain/ResourceGroupAndNameAndIngressRules.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/domain/ResourceGroupAndNameAndIngressRules.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/domain/ResourceGroupAndNameAndIngressRules.java index 2b07406..7c11642 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/domain/ResourceGroupAndNameAndIngressRules.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/domain/ResourceGroupAndNameAndIngressRules.java @@ -18,6 +18,8 @@ package org.jclouds.azurecompute.arm.compute.domain; import static org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName.fromResourceGroupAndName; +import java.util.Arrays; + import com.google.auto.value.AutoValue; import com.google.common.base.Objects; @@ -28,6 +30,7 @@ public abstract class ResourceGroupAndNameAndIngressRules { public abstract String location(); + @SuppressWarnings("mutable") public abstract int[] inboundPorts(); ResourceGroupAndNameAndIngressRules() { @@ -37,7 +40,7 @@ public abstract class ResourceGroupAndNameAndIngressRules { public static ResourceGroupAndNameAndIngressRules create(String resourceGroup, String location, String name, int[] inboundPorts) { return new AutoValue_ResourceGroupAndNameAndIngressRules(fromResourceGroupAndName(resourceGroup, name), location, - inboundPorts); + Arrays.copyOf(inboundPorts, inboundPorts.length)); } public String name() { http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtension.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtension.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtension.java index d826a51..6cba2c4 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtension.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeImageExtension.java @@ -30,8 +30,8 @@ import javax.annotation.Resource; import org.jclouds.Constants; import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule.ImageAvailablePredicateFactory; -import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule.VirtualMachineInStatePredicateFactory; +import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.ImageAvailablePredicateFactory; +import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.VirtualMachineInStatePredicateFactory; import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName; import org.jclouds.azurecompute.arm.compute.functions.CustomImageToVMImage; import org.jclouds.azurecompute.arm.domain.IdReference; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java index eaf820c..b31e2a0 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/extensions/AzureComputeSecurityGroupExtension.java @@ -36,7 +36,7 @@ import javax.inject.Inject; import javax.inject.Named; import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule.SecurityGroupAvailablePredicateFactory; +import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.SecurityGroupAvailablePredicateFactory; import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndName; import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCard; import org.jclouds.azurecompute.arm.domain.NetworkProfile.NetworkInterface; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java index 98732d2..baba6f9 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/compute/loaders/CreateSecurityGroupIfNeeded.java @@ -29,7 +29,7 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.azurecompute.arm.AzureComputeApi; -import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule.SecurityGroupAvailablePredicateFactory; +import org.jclouds.azurecompute.arm.compute.config.AzurePredicatesModule.SecurityGroupAvailablePredicateFactory; import org.jclouds.azurecompute.arm.compute.domain.ResourceGroupAndNameAndIngressRules; import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroup; import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroupProperties; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/fa63f6b1/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java index 4ac5eaa..abe057d 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/config/AzureComputeProperties.java @@ -34,4 +34,13 @@ public class AzureComputeProperties { public static final String API_VERSION_PREFIX = "jclouds.azurecompute.arm.apiversion."; + // Predicate constants + public static final String VAULT_DELETE_STATUS = "jclouds.azurecompute.arm.vault.delete_status"; + public static final String VAULT_KEY_DELETED_STATUS = "jclouds.azurecompute.arm.vault.key.delete_status"; + public static final String VAULT_KEY_RECOVERABLE_STATUS = "jclouds.azurecompute.arm.vault.key.recoverable_status"; + public static final String VAULT_SECRET_DELETE_STATUS = "jclouds.azurecompute.arm.vault.secret.delete_status"; + public static final String VAULT_SECRET_RECOVERABLE_STATUS = "jclouds.azurecompute.arm.vault.secret.recoverable_status"; + public static final String VAULT_CERTIFICATE_DELETE_STATUS = "jclouds.azurecompute.arm.vault.certificate.delete_status"; + public static final String VAULT_CERTIFICATE_RECOVERABLE_STATUS = "jclouds.azurecompute.arm.vault.certificate.recoverable_status"; + public static final String VAULT_CERTIFICATE_OPERATION_STATUS = "jclouds.azurecompute.arm.vault.certificate.operation_status"; }
