diff --git a/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupAsyncClient.java b/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupAsyncClient.java index b691d64901a7..3a32d90f34ec 100644 --- a/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupAsyncClient.java +++ b/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupAsyncClient.java @@ -53,6 +53,8 @@ public final class KeyVaultBackupAsyncClient { // for more information on Azure resource provider namespaces. private static final String KEYVAULT_TRACING_NAMESPACE_VALUE = "Microsoft.KeyVault"; + private static final Duration DEFAULT_POLLING_INTERVAL = Duration.ofSeconds(1); + /** * The logger to be used. */ @@ -68,6 +70,10 @@ public final class KeyVaultBackupAsyncClient { */ private final String vaultUrl; + Duration getDefaultPollingInterval() { + return DEFAULT_POLLING_INTERVAL; + } + /** * Package private constructor to be used by {@link KeyVaultBackupClientBuilder}. */ @@ -101,6 +107,20 @@ public String getVaultUrl() { */ @ServiceMethod(returns = ReturnType.SINGLE) public PollerFlux beginBackup(String blobStorageUrl, String sasToken) { + return beginBackup(blobStorageUrl, sasToken, getDefaultPollingInterval()); + } + + /** + * Initiates a full backup of the Key Vault. + * + * @param blobStorageUrl The URL for the Blob Storage resource where the backup will be located. + * @param sasToken A Shared Access Signature (SAS) token to authorize access to the blob. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} polling on the {@link KeyVaultBackupOperation backup operation} status. + * @throws NullPointerException if the {@code blobStorageUrl} or {@code sasToken} are {@code null}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginBackup(String blobStorageUrl, String sasToken, Duration pollingInterval) { Objects.requireNonNull(blobStorageUrl, String.format(KeyVaultErrorCodeStrings.getErrorString(KeyVaultErrorCodeStrings.PARAMETER_REQUIRED), "'blobStorageUrl'")); @@ -108,7 +128,7 @@ public PollerFlux beginBackup(String blobStorag String.format(KeyVaultErrorCodeStrings.getErrorString(KeyVaultErrorCodeStrings.PARAMETER_REQUIRED), "'sasToken'")); - return new PollerFlux<>(Duration.ofSeconds(1), + return new PollerFlux<>(pollingInterval, backupActivationOperation(blobStorageUrl, sasToken), backupPollOperation(), (pollingContext, firstResponse) -> Mono.error(new RuntimeException("Cancellation is not supported")), @@ -227,7 +247,7 @@ private static LongRunningOperationStatus toLongRunningOperationStatus(String op * Gets a pending {@link KeyVaultBackupOperation backup operation} from the Key Vault. * * @param jobId The operation identifier. - * @throws KeyVaultErrorException when a backup operation for a given {@code jobId} doesn't exist. + * @throws NullPointerException if the {@code jobId} is null. * @return A {@link PollerFlux} polling on the {@link KeyVaultRestoreOperation backup operation} status. */ @ServiceMethod(returns = ReturnType.SINGLE) @@ -265,6 +285,22 @@ private Function, Mono beginRestore(String blobStorageUrl, String sasToken, String folderName) { + return beginRestore(blobStorageUrl, sasToken, folderName, getDefaultPollingInterval()); + } + + /** + * Initiates a full restore of the Key Vault. + * + * @param blobStorageUrl The URL for the Blob Storage resource where the backup is located. + * @param sasToken A Shared Access Signature (SAS) token to authorize access to the blob. + * @param folderName The name of the folder containing the backup data to restore. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} polling on the {@link KeyVaultRestoreOperation backup operation} status. + * @throws NullPointerException if the {@code blobStorageUrl}, {@code sasToken} or {@code folderName} are {@code + * null}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginRestore(String blobStorageUrl, String sasToken, String folderName, Duration pollingInterval) { Objects.requireNonNull(blobStorageUrl, String.format(KeyVaultErrorCodeStrings.getErrorString(KeyVaultErrorCodeStrings.PARAMETER_REQUIRED), "'blobStorageUrl'")); @@ -275,8 +311,7 @@ public PollerFlux beginRestore(String blobStorag String.format(KeyVaultErrorCodeStrings.getErrorString(KeyVaultErrorCodeStrings.PARAMETER_REQUIRED), "'folderName'")); - - return new PollerFlux<>(Duration.ofSeconds(1), + return new PollerFlux<>(pollingInterval, restoreActivationOperation(blobStorageUrl, sasToken, folderName), restorePollOperation(), (pollingContext, firstResponse) -> Mono.empty(), @@ -374,7 +409,7 @@ private static Mono> processRestoreOperat * Gets a pending {@link KeyVaultRestoreOperation full or selective restore operation} from the Key Vault. * * @param jobId The operation identifier. - * @throws KeyVaultErrorException when a restore operation for a given {@code jobId} doesn't exist. + * @throws NullPointerException if the {@code jobId} is null. * @return A {@link PollerFlux} polling on the {@link KeyVaultRestoreOperation restore operation} status. */ @ServiceMethod(returns = ReturnType.SINGLE) @@ -414,6 +449,24 @@ private Function, Mono beginSelectiveRestore(String keyName, String blobStorageUrl, String sasToken, String folderName) { + return beginSelectiveRestore(keyName, blobStorageUrl, sasToken, folderName, getDefaultPollingInterval()); + } + + /** + * Restores all versions of a given key using the supplied SAS token pointing to a previously stored Azure Blob + * storage backup folder. + * + * @param keyName The name of the key to be restored. + * @param blobStorageUrl The URL for the Blob Storage resource where the backup is located. + * @param sasToken A Shared Access Signature (SAS) token to authorize access to the blob. + * @param folderName The name of the folder containing the backup data to restore. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} polling on the {@link KeyVaultRestoreOperation backup operation} status. + * @throws NullPointerException if the {@code keyName}, {@code blobStorageUrl}, {@code sasToken} or {@code + * folderName} are {@code null}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginSelectiveRestore(String keyName, String blobStorageUrl, String sasToken, String folderName, Duration pollingInterval) { Objects.requireNonNull(keyName, String.format(KeyVaultErrorCodeStrings.getErrorString(KeyVaultErrorCodeStrings.PARAMETER_REQUIRED), "'keyName'")); @@ -427,7 +480,7 @@ public PollerFlux beginSelectiveRestore(String k String.format(KeyVaultErrorCodeStrings.getErrorString(KeyVaultErrorCodeStrings.PARAMETER_REQUIRED), "'folderName'")); - return new PollerFlux<>(Duration.ofSeconds(1), + return new PollerFlux<>(pollingInterval, selectiveRestoreActivationOperation(keyName, blobStorageUrl, sasToken, folderName), selectiveRestorePollOperation(), (pollingContext, firstResponse) -> Mono.empty(), diff --git a/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupClient.java b/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupClient.java index c8d6137cc385..8e3c280bcff7 100644 --- a/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupClient.java +++ b/sdk/keyvault/azure-security-keyvault-administration/src/main/java/com/azure/security/keyvault/administration/KeyVaultBackupClient.java @@ -8,10 +8,11 @@ import com.azure.core.annotation.ServiceMethod; import com.azure.core.util.polling.PollerFlux; import com.azure.core.util.polling.SyncPoller; -import com.azure.security.keyvault.administration.implementation.models.KeyVaultErrorException; import com.azure.security.keyvault.administration.models.KeyVaultBackupOperation; import com.azure.security.keyvault.administration.models.KeyVaultRestoreOperation; +import java.time.Duration; + /** * The {@link KeyVaultBackupClient} provides synchronous methods to perform full backup and restore of an Azure Key * Vault. @@ -51,11 +52,25 @@ public SyncPoller beginBackup(String blobStorag return asyncClient.beginBackup(blobStorageUrl, sasToken).getSyncPoller(); } + /** + * Initiates a full backup of the Key Vault. + * + * @param blobStorageUrl The URL for the Blob Storage resource where the backup will be located. + * @param sasToken A Shared Access Signature (SAS) token to authorize access to the blob. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link SyncPoller} polling on the {@link KeyVaultBackupOperation backup operation} status. + * @throws NullPointerException if the {@code blobStorageUrl} or {@code sasToken} are {@code null}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SyncPoller beginBackup(String blobStorageUrl, String sasToken, Duration pollingInterval) { + return asyncClient.beginBackup(blobStorageUrl, sasToken, pollingInterval).getSyncPoller(); + } + /** * Gets a pending {@link KeyVaultBackupOperation backup operation} from the Key Vault. * * @param jobId The operation identifier. - * @throws KeyVaultErrorException when a backup operation for a given {@code jobId} doesn't exist. + * @throws NullPointerException if the {@code jobId} is null. * @return A {@link SyncPoller} to poll on the backup operation status. */ @ServiceMethod(returns = ReturnType.SINGLE) @@ -78,11 +93,27 @@ public SyncPoller beginRestore(String blobStorag return asyncClient.beginRestore(blobStorageUrl, sasToken, folderName).getSyncPoller(); } + /** + * Initiates a full restore of the Key Vault. + * + * @param blobStorageUrl The URL for the Blob Storage resource where the backup is located. + * @param sasToken A Shared Access Signature (SAS) token to authorize access to the blob. + * @param folderName The name of the folder containing the backup data to restore. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link SyncPoller} polling on the {@link KeyVaultRestoreOperation backup operation} status. + * @throws NullPointerException if the {@code blobStorageUrl}, {@code sasToken} or {@code folderName} are {@code + * null}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SyncPoller beginRestore(String blobStorageUrl, String sasToken, String folderName, Duration pollingInterval) { + return asyncClient.beginRestore(blobStorageUrl, sasToken, folderName, pollingInterval).getSyncPoller(); + } + /** * Gets a pending {@link KeyVaultRestoreOperation full or selective restore operation} from the Key Vault. * * @param jobId The operation identifier. - * @throws KeyVaultErrorException when a restore operation for a given {@code jobId} doesn't exist. + * @throws NullPointerException if the {@code jobId} is null. * @return A {@link SyncPoller} to poll on the restore operation status. */ @ServiceMethod(returns = ReturnType.SINGLE) @@ -106,4 +137,22 @@ public SyncPoller getRestoreOperation(String job public SyncPoller beginSelectiveRestore(String keyName, String blobStorageUrl, String sasToken, String folderName) { return asyncClient.beginSelectiveRestore(keyName, blobStorageUrl, sasToken, folderName).getSyncPoller(); } + + /** + * Restores all versions of a given key using the supplied SAS token pointing to a previously stored Azure Blob + * storage backup folder. + * + * @param keyName The name of the key to be restored. + * @param blobStorageUrl The URL for the Blob Storage resource where the backup is located. + * @param sasToken A Shared Access Signature (SAS) token to authorize access to the blob. + * @param folderName The name of the folder containing the backup data to restore. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} polling on the {@link KeyVaultRestoreOperation backup operation} status. + * @throws NullPointerException if the {@code keyName}, {@code blobStorageUrl}, {@code sasToken} or {@code + * folderName} are {@code null}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SyncPoller beginSelectiveRestore(String keyName, String blobStorageUrl, String sasToken, String folderName, Duration pollingInterval) { + return asyncClient.beginSelectiveRestore(keyName, blobStorageUrl, sasToken, folderName, pollingInterval).getSyncPoller(); + } } diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java index 4706fe0d9a48..210834cc2d53 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateAsyncClient.java @@ -81,7 +81,7 @@ public final class CertificateAsyncClient { // for more information on Azure resource provider namespaces. private static final String KEYVAULT_TRACING_NAMESPACE_VALUE = "Microsoft.KeyVault"; - private static final Duration DEFAULT_POLL_DURATION = Duration.ofSeconds(1); + private static final Duration DEFAULT_POLLING_INTERVAL = Duration.ofSeconds(1); private final String vaultUrl; private final CertificateService service; @@ -109,8 +109,8 @@ public String getVaultUrl() { return vaultUrl; } - Duration getPollDuration() { - return DEFAULT_POLL_DURATION; + Duration getDefaultPollingInterval() { + return DEFAULT_POLLING_INTERVAL; } /** @@ -131,11 +131,33 @@ Duration getPollDuration() { * @return A {@link PollerFlux} polling on the create certificate operation status. */ public PollerFlux beginCreateCertificate(String certificateName, CertificatePolicy policy, Boolean isEnabled, Map tags) { - return new PollerFlux<>(getPollDuration(), - activationOperation(certificateName, policy, isEnabled, tags), - createPollOperation(certificateName), - cancelOperation(certificateName), - fetchResultOperation(certificateName)); + return beginCreateCertificate(certificateName, policy, isEnabled, tags, getDefaultPollingInterval()); + } + + /** + * Creates a new certificate. If this is the first version, the certificate resource is created. This operation requires + * the certificates/create permission. + * + *

Code Samples

+ *

Create certificate is a long running operation. The {@link PollerFlux poller} allows users to automatically poll on the create certificate + * operation status. It is possible to monitor each intermediate poll response during the poll operation.

+ * + * {@codesnippet com.azure.security.keyvault.certificates.CertificateAsyncClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map-Duration} + * + * @param certificateName The name of the certificate to be created. + * @param policy The policy of the certificate to be created. + * @param isEnabled The enabled status for the certificate. + * @param tags The application specific metadata to set. + * @param pollingInterval The interval at which the operation status will be polled for. + * @throws ResourceModifiedException when invalid certificate policy configuration is provided. + * @return A {@link PollerFlux} polling on the create certificate operation status. + */ + public PollerFlux beginCreateCertificate(String certificateName, CertificatePolicy policy, Boolean isEnabled, Map tags, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, + activationOperation(certificateName, policy, isEnabled, tags), + createPollOperation(certificateName), + cancelOperation(certificateName), + fetchResultOperation(certificateName)); } private BiFunction, @@ -246,7 +268,25 @@ Mono> createCertificateWithResponse(String certif * @return A {@link PollerFlux} polling on the certificate operation status. */ public PollerFlux getCertificateOperation(String certificateName) { - return new PollerFlux<>(getPollDuration(), + return getCertificateOperation(certificateName, getDefaultPollingInterval()); + } + + /** + * Gets a pending {@link CertificateOperation} from the key vault. This operation requires the certificates/get permission. + * + *

Code Samples

+ *

Get a pending certificate operation. The {@link PollerFlux poller} allows users to automatically poll on the certificate + * operation status. It is possible to monitor each intermediate poll response during the poll operation.

+ * + * {@codesnippet com.azure.security.keyvault.certificates.CertificateAsyncClient.getCertificateOperation#String-Duration} + * + * @param certificateName The name of the certificate. + * @param pollingInterval The interval at which the operation status will be polled for. + * @throws ResourceNotFoundException when a certificate operation for a certificate with {@code certificateName} doesn't exist. + * @return A {@link PollerFlux} polling on the certificate operation status. + */ + public PollerFlux getCertificateOperation(String certificateName, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, (pollingContext) -> Mono.empty(), createPollOperation(certificateName), cancelOperation(certificateName), @@ -443,7 +483,7 @@ Mono> updateCertificatePropertiesWithResponse(Cert *

Code Samples

*

Deletes the certificate in the Azure Key Vault. Prints out the deleted certificate details when a response has been received.

* - * {@codesnippet com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#string} + * {@codesnippet com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#String} * * @param certificateName The name of the certificate to be deleted. * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the key vault. @@ -452,7 +492,29 @@ Mono> updateCertificatePropertiesWithResponse(Cert */ @ServiceMethod(returns = ReturnType.SINGLE) public PollerFlux beginDeleteCertificate(String certificateName) { - return new PollerFlux<>(getPollDuration(), + return beginDeleteCertificate(certificateName, getDefaultPollingInterval()); + } + + /** + * Deletes a certificate from a specified key vault. All the versions of the certificate along with its associated policy + * get deleted. If soft-delete is enabled on the key vault then the certificate is placed in the deleted state and requires to be + * purged for permanent deletion else the certificate is permanently deleted. The delete operation applies to any certificate stored in + * Azure Key Vault but it cannot be applied to an individual version of a certificate. This operation requires the certificates/delete permission. + * + *

Code Samples

+ *

Deletes the certificate in the Azure Key Vault. Prints out the deleted certificate details when a response has been received.

+ * + * {@codesnippet com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#String-Duration} + * + * @param certificateName The name of the certificate to be deleted. + * @param pollingInterval The interval at which the operation status will be polled for. + * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the key vault. + * @throws HttpResponseException when a certificate with {@code certificateName} is empty string. + * @return A {@link PollerFlux} to poll on the {@link DeletedCertificate deleted certificate}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginDeleteCertificate(String certificateName, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, activationOperation(certificateName), createDeletePollOperation(certificateName), (context, firstResponse) -> Mono.empty(), @@ -623,8 +685,8 @@ Mono> purgeDeletedCertificateWithResponse(String certificateName, *

Code Samples

*

Recovers the deleted certificate from the key vault enabled for soft-delete. Prints out the * recovered certificate details when a response has been received.

- - * {@codesnippet com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#string} + * + * {@codesnippet com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#String} * * @param certificateName The name of the deleted certificate to be recovered. * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the certificate vault. @@ -633,7 +695,29 @@ Mono> purgeDeletedCertificateWithResponse(String certificateName, */ @ServiceMethod(returns = ReturnType.SINGLE) public PollerFlux beginRecoverDeletedCertificate(String certificateName) { - return new PollerFlux<>(getPollDuration(), + return beginRecoverDeletedCertificate(certificateName, getDefaultPollingInterval()); + } + + /** + * Recovers the deleted certificate back to its current version under /certificates and can only be performed on a soft-delete enabled vault. + * The RecoverDeletedCertificate operation performs the reversal of the Delete operation and must be issued during the retention interval + * (available in the deleted certificate's attributes). This operation requires the certificates/recover permission. + * + *

Code Samples

+ *

Recovers the deleted certificate from the key vault enabled for soft-delete. Prints out the + * recovered certificate details when a response has been received.

+ + * {@codesnippet com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#String-Duration} + * + * @param certificateName The name of the deleted certificate to be recovered. + * @param pollingInterval The interval at which the operation status will be polled for. + * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the certificate vault. + * @throws HttpResponseException when a certificate with {@code certificateName} is empty string. + * @return A {@link PollerFlux} to poll on the {@link KeyVaultCertificate recovered certificate}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginRecoverDeletedCertificate(String certificateName, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, recoverActivationOperation(certificateName), createRecoverPollOperation(certificateName), (context, firstResponse) -> Mono.empty(), diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClient.java b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClient.java index c1c4aa9bbe22..8444ed239054 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClient.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/main/java/com/azure/security/keyvault/certificates/CertificateClient.java @@ -27,6 +27,7 @@ import com.azure.security.keyvault.certificates.models.LifetimeAction; import com.azure.security.keyvault.certificates.models.ImportCertificateOptions; +import java.time.Duration; import java.util.List; import java.util.Map; import java.util.Objects; @@ -90,13 +91,40 @@ public String getVaultUrl() { */ @ServiceMethod(returns = ReturnType.SINGLE) public SyncPoller beginCreateCertificate(String certificateName, CertificatePolicy policy, Boolean isEnabled, Map tags) { - return client.beginCreateCertificate(certificateName, policy, isEnabled, tags).getSyncPoller(); + return client.beginCreateCertificate(certificateName, policy, isEnabled, tags).getSyncPoller(); } /** * Creates a new certificate. If this is the first version, the certificate resource is created. This operation requires * the certificates/create permission. * + *

Create certificate is a long running operation. It indefinitely waits for the create certificate operation to complete on service side.

+ * + *

Code Samples

+ *

Create certificate is a long running operation. The createCertificate indefinitely waits for the operation to complete and + * returns its last status. The details of the last certificate operation status are printed when a response is received

+ * + * {@codesnippet com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map-Duration} + * + * @param certificateName The name of the certificate to be created. + * @param policy The policy of the certificate to be created. + * @param isEnabled The enabled status of the certificate. + * @param tags The application specific metadata to set. + * @param pollingInterval The interval at which the operation status will be polled. + * @throws ResourceModifiedException when invalid certificate policy configuration is provided. + * @return A {@link SyncPoller} to poll on the create certificate operation status. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SyncPoller beginCreateCertificate(String certificateName, CertificatePolicy policy, Boolean isEnabled, Map tags, Duration pollingInterval) { + return client.beginCreateCertificate(certificateName, policy, isEnabled, tags, pollingInterval).getSyncPoller(); + } + + /** + * Creates a new certificate. If this is the first version, the certificate resource is created. This operation requires + * the certificates/create permission. + * + *

Create certificate is a long running operation. It indefinitely waits for the create certificate operation to complete on service side.

+ * *

Code Samples

*

Create certificate is a long running operation. The createCertificate indefinitely waits for the operation to complete and * returns its last status. The details of the last certificate operation status are printed when a response is received

@@ -128,7 +156,26 @@ public SyncPoller beginCrea */ @ServiceMethod(returns = ReturnType.SINGLE) public SyncPoller getCertificateOperation(String certificateName) { - return client.getCertificateOperation(certificateName).getSyncPoller(); + return client.getCertificateOperation(certificateName).getSyncPoller(); + } + + /** + * Gets a pending {@link CertificateOperation} from the key vault. This operation requires the certificates/get permission. + * + *

Code Samples

+ *

Geta a pending certificate operation. The {@link SyncPoller poller} allows users to automatically poll on the certificate + * operation status.

+ * + * {@codesnippet com.azure.security.keyvault.certificates.CertificateClient.getCertificateOperation#String-Duration} + * + * @param certificateName The name of the certificate. + * @param pollingInterval The interval at which the operation status will be polled. + * @throws ResourceNotFoundException when a certificate operation for a certificate with {@code certificateName} doesn't exist. + * @return A {@link SyncPoller} to poll on the certificate operation status. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SyncPoller getCertificateOperation(String certificateName, Duration pollingInterval) { + return client.getCertificateOperation(certificateName, pollingInterval).getSyncPoller(); } /** @@ -261,7 +308,7 @@ public Response updateCertificatePropertiesWithResponse(Cer *

Deletes the certificate in the Azure Key Vault. Prints out the * deleted certificate details when a response has been received.

* - * {@codesnippet com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#string} + * {@codesnippet com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#String} * * @param certificateName The name of the certificate to be deleted. * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the key vault. @@ -273,6 +320,29 @@ public SyncPoller beginDeleteCertificate(String certif return client.beginDeleteCertificate(certificateName).getSyncPoller(); } + /** + * Deletes a certificate from a specified key vault. All the versions of the certificate along with its associated policy + * get deleted. If soft-delete is enabled on the key vault then the certificate is placed in the deleted state and requires to be + * purged for permanent deletion else the certificate is permanently deleted. The delete operation applies to any certificate stored in + * Azure Key Vault but it cannot be applied to an individual version of a certificate. This operation requires the certificates/delete permission. + * + *

Code Samples

+ *

Deletes the certificate in the Azure Key Vault. Prints out the + * deleted certificate details when a response has been received.

+ * + * {@codesnippet com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#String-Duration} + * + * @param certificateName The name of the certificate to be deleted. + * @param pollingInterval The interval at which the operation status will be polled. + * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the key vault. + * @throws HttpRequestException when a certificate with {@code certificateName} is empty string. + * @return A {@link SyncPoller} to poll on and retrieve {@link DeletedCertificate deleted certificate}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SyncPoller beginDeleteCertificate(String certificateName, Duration pollingInterval) { + return client.beginDeleteCertificate(certificateName, pollingInterval).getSyncPoller(); + } + /** * Retrieves information about the specified deleted certificate. The GetDeletedCertificate operation is applicable for soft-delete * enabled vaults and additionally retrieves deleted certificate's attributes, such as retention interval, scheduled permanent deletion and the current deletion recovery level. This operation @@ -365,7 +435,7 @@ public Response purgeDeletedCertificateWithResponse(String certificateName *

Recovers the deleted certificate from the key vault enabled for soft-delete. Prints out the * recovered certificate details when a response has been received.

- * {@codesnippet com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#string} + * {@codesnippet com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#String} * * @param certificateName The name of the deleted certificate to be recovered. * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the certificate vault. @@ -377,6 +447,28 @@ public SyncPoller beginRecoverDeletedCertif return client.beginRecoverDeletedCertificate(certificateName).getSyncPoller(); } + /** + * Recovers the deleted certificate back to its current version under /certificates and can only be performed on a soft-delete enabled vault. + * The RecoverDeletedCertificate operation performs the reversal of the Delete operation and must be issued during the retention interval + * (available in the deleted certificate's attributes). This operation requires the certificates/recover permission. + * + *

Code Samples

+ *

Recovers the deleted certificate from the key vault enabled for soft-delete. Prints out the + * recovered certificate details when a response has been received.

+ + * {@codesnippet com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#String-Duration} + * + * @param certificateName The name of the deleted certificate to be recovered. + * @param pollingInterval The interval at which the operation status will be polled. + * @throws ResourceNotFoundException when a certificate with {@code certificateName} doesn't exist in the certificate vault. + * @throws HttpRequestException when a certificate with {@code certificateName} is empty string. + * @return A {@link SyncPoller} to poll on and retrieve {@link KeyVaultCertificateWithPolicy recovered certificate}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public SyncPoller beginRecoverDeletedCertificate(String certificateName, Duration pollingInterval) { + return client.beginRecoverDeletedCertificate(certificateName, pollingInterval).getSyncPoller(); + } + /** * Requests that a backup of the specified certificate be downloaded to the client. All versions of the certificate will * be downloaded. This operation requires the certificates/backup permission. diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java b/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java index 326f10de0b21..58e497a341d1 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateAsyncClientJavaDocCodeSnippets.java @@ -21,6 +21,7 @@ import com.azure.security.keyvault.certificates.models.CertificateProperties; import reactor.util.context.Context; +import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -89,7 +90,7 @@ public CertificateAsyncClient createAsyncClientWithPipeline() { /** * Method to insert code snippets for {@link CertificateAsyncClient#getCertificatePolicy(String)} */ - public void getCertiificatePolicyCodeSnippets() { + public void getCertificatePolicyCodeSnippets() { CertificateAsyncClient certificateAsyncClient = getCertificateAsyncClient(); // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.getCertificatePolicy#string certificateAsyncClient.getCertificatePolicy("certificateName") @@ -162,7 +163,10 @@ public void getCertificateWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link CertificateAsyncClient#beginCreateCertificate(String, CertificatePolicy)} + * Method to insert code snippets for + * {@link CertificateAsyncClient#beginCreateCertificate(String, CertificatePolicy, Boolean, Map)}, + * {@link CertificateAsyncClient#beginCreateCertificate(String, CertificatePolicy, Boolean, Map, Duration)} and + * {@link CertificateAsyncClient#beginCreateCertificate(String, CertificatePolicy)}. */ public void createCertificateCodeSnippets() { CertificateAsyncClient certificateAsyncClient = getCertificateAsyncClient(); @@ -179,6 +183,19 @@ public void createCertificateCodeSnippets() { }); // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map + // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map-Duration + CertificatePolicy certificatePolicy = new CertificatePolicy("Self", "CN=SelfSignedJavaPkcs12"); + Map certificateTags = new HashMap<>(); + certificateTags.put("foo", "bar"); + certificateAsyncClient.beginCreateCertificate("certificateName", certificatePolicy, true, certificateTags, + Duration.ofSeconds(1)).subscribe(pollResponse -> { + System.out.println("---------------------------------------------------------------------------------"); + System.out.println(pollResponse.getStatus()); + System.out.println(pollResponse.getValue().getStatus()); + System.out.println(pollResponse.getValue().getStatusDetails()); + }); + // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map-Duration + // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginCreateCertificate#String-CertificatePolicy CertificatePolicy certPolicy = new CertificatePolicy("Self", "CN=SelfSignedJavaPkcs12"); certificateAsyncClient.beginCreateCertificate("certificateName", certPolicy) @@ -191,6 +208,11 @@ public void createCertificateCodeSnippets() { // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginCreateCertificate#String-CertificatePolicy } + /** + * Method to insert code snippets for + * {@link CertificateAsyncClient#getCertificateOperation(String)} and + * {@link CertificateAsyncClient#getCertificateOperation(String, Duration)}. + */ public void getCertificateOperation() { CertificateAsyncClient certificateAsyncClient = getCertificateAsyncClient(); // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.getCertificateOperation#String @@ -202,6 +224,16 @@ public void getCertificateOperation() { System.out.println(pollResponse.getValue().getStatusDetails()); }); // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.getCertificateOperation#String + + // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.getCertificateOperation#String-Duration + certificateAsyncClient.getCertificateOperation("certificateName", Duration.ofSeconds(1)) + .subscribe(pollResponse -> { + System.out.println("---------------------------------------------------------------------------------"); + System.out.println(pollResponse.getStatus()); + System.out.println(pollResponse.getValue().getStatus()); + System.out.println(pollResponse.getValue().getStatusDetails()); + }); + // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.getCertificateOperation#String-Duration } /** @@ -369,18 +401,28 @@ public void updateCertificateWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link CertificateAsyncClient#beginDeleteCertificate(String)} + * Method to insert code snippets for {@link CertificateAsyncClient#beginDeleteCertificate(String)} and + * {@link CertificateAsyncClient#beginDeleteCertificate(String, Duration)}. */ public void deleteCertificateCodeSnippets() { CertificateAsyncClient certificateAsyncClient = getCertificateAsyncClient(); - // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#string + // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#String certificateAsyncClient.beginDeleteCertificate("certificateName") .subscribe(pollResponse -> { System.out.println("Delete Status: " + pollResponse.getStatus().toString()); System.out.println("Delete Certificate Name: " + pollResponse.getValue().getName()); System.out.println("Certificate Delete Date: " + pollResponse.getValue().getDeletedOn().toString()); }); - // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#string + // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#String + + // BEGIN: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#String-Duration + certificateAsyncClient.beginDeleteCertificate("certificateName", Duration.ofSeconds(1)) + .subscribe(pollResponse -> { + System.out.println("Delete Status: " + pollResponse.getStatus().toString()); + System.out.println("Delete Certificate Name: " + pollResponse.getValue().getName()); + System.out.println("Certificate Delete Date: " + pollResponse.getValue().getDeletedOn().toString()); + }); + // END: com.azure.security.keyvault.certificates.CertificateAsyncClient.beginDeleteCertificate#String-Duration } /** @@ -450,18 +492,28 @@ public void purgeDeletedCertificateWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link CertificateAsyncClient#beginRecoverDeletedCertificate(String)} + * Method to insert code snippets for {@link CertificateAsyncClient#beginRecoverDeletedCertificate(String)} and + * {@link CertificateAsyncClient#beginRecoverDeletedCertificate(String, Duration)}. */ public void recoverDeletedCertificateCodeSnippets() { CertificateAsyncClient certificateAsyncClient = getCertificateAsyncClient(); - // BEGIN: com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#string + // BEGIN: com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#String certificateAsyncClient.beginRecoverDeletedCertificate("deletedCertificateName") .subscribe(pollResponse -> { System.out.println("Recovery Status: " + pollResponse.getStatus().toString()); System.out.println("Recover Certificate Name: " + pollResponse.getValue().getName()); System.out.println("Recover Certificate Id: " + pollResponse.getValue().getId()); }); - // END: com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#string + // END: com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#String + + // BEGIN: com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#String-Duration + certificateAsyncClient.beginRecoverDeletedCertificate("deletedCertificateName", Duration.ofSeconds(1)) + .subscribe(pollResponse -> { + System.out.println("Recovery Status: " + pollResponse.getStatus().toString()); + System.out.println("Recover Certificate Name: " + pollResponse.getValue().getName()); + System.out.println("Recover Certificate Id: " + pollResponse.getValue().getId()); + }); + // END: com.azure.security.certificatevault.certificates.CertificateAsyncClient.beginRecoverDeletedCertificate#String-Duration } /** diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateClientJavaDocCodeSnippets.java b/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateClientJavaDocCodeSnippets.java index 9d10fc7ab2ac..fe6c1b8f956a 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateClientJavaDocCodeSnippets.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/samples/java/com/azure/security/keyvault/certificates/CertificateClientJavaDocCodeSnippets.java @@ -24,10 +24,13 @@ import com.azure.security.keyvault.certificates.models.MergeCertificateOptions; import com.azure.security.keyvault.certificates.models.ImportCertificateOptions; import com.azure.security.keyvault.certificates.models.CertificateProperties; + +import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * This class contains code samples for generating javadocs through doclets for {@link CertificateClient} @@ -124,41 +127,66 @@ public void getCertificateWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link CertificateClient#beginCreateCertificate(String, CertificatePolicy)} + * Method to insert code snippets for + * {@link CertificateClient#beginCreateCertificate(String, CertificatePolicy, Boolean, Map)}, + * {@link CertificateClient#beginCreateCertificate(String, CertificatePolicy, Boolean, Map, Duration)} and + * {@link CertificateClient#beginCreateCertificate(String, CertificatePolicy)}. */ public void createCertificateCodeSnippets() { CertificateClient certificateClient = getCertificateClient(); // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map CertificatePolicy certificatePolicyPkcsSelf = new CertificatePolicy("Self", "CN=SelfSignedJavaPkcs12"); - SyncPoller certPoller = certificateClient + SyncPoller certificateSyncPoller = certificateClient .beginCreateCertificate("certificateName", certificatePolicyPkcsSelf, true, new HashMap<>()); - certPoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); - KeyVaultCertificate cert = certPoller.getFinalResult(); - System.out.printf("Certificate created with name %s", cert.getName()); + certificateSyncPoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); + KeyVaultCertificate createdCertificate = certificateSyncPoller.getFinalResult(); + System.out.printf("Certificate created with name %s", createdCertificate.getName()); // END: com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map - // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy + // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map-Duration CertificatePolicy certificatePolicy = new CertificatePolicy("Self", "CN=SelfSignedJavaPkcs12"); - SyncPoller certificatePoller = certificateClient - .beginCreateCertificate("certificateName", certificatePolicy); + SyncPoller certificatePoller = + certificateClient.beginCreateCertificate("certificateName", certificatePolicy, true, new HashMap<>(), + Duration.ofSeconds(1)); certificatePoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); KeyVaultCertificate certificate = certificatePoller.getFinalResult(); System.out.printf("Certificate created with name %s", certificate.getName()); + // END: com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy-Boolean-Map-Duration + + // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy + CertificatePolicy certPolicy = new CertificatePolicy("Self", + "CN=SelfSignedJavaPkcs12"); + SyncPoller certPoller = certificateClient + .beginCreateCertificate("certificateName", certPolicy); + certPoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); + KeyVaultCertificate cert = certPoller.getFinalResult(); + System.out.printf("Certificate created with name %s", cert.getName()); // END: com.azure.security.keyvault.certificates.CertificateClient.beginCreateCertificate#String-CertificatePolicy } + /** + * Method to insert code snippets for {@link CertificateClient#getCertificateOperation(String)} and + * {@link CertificateClient#getCertificateOperation(String, Duration)}. + */ public void getCertificateOperation() { CertificateClient certificateClient = getCertificateClient(); // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.getCertificateOperation#String - SyncPoller certPoller = certificateClient + SyncPoller getCertPoller = certificateClient .getCertificateOperation("certificateName"); - certPoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); - KeyVaultCertificate cert = certPoller.getFinalResult(); + getCertPoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); + KeyVaultCertificate cert = getCertPoller.getFinalResult(); System.out.printf("Certificate created with name %s", cert.getName()); // END: com.azure.security.keyvault.certificates.CertificateClient.getCertificateOperation#String + // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.getCertificateOperation#String-Duration + SyncPoller getCertificatePoller = certificateClient + .getCertificateOperation("certificateName", Duration.ofSeconds(1)); + getCertificatePoller.waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED); + KeyVaultCertificate certificate = getCertificatePoller.getFinalResult(); + System.out.printf("Certificate created with name %s", certificate.getName()); + // END: com.azure.security.keyvault.certificates.CertificateClient.getCertificateOperation#String-Duration } @@ -287,19 +315,31 @@ public void updateCertificatePolicyCodeSnippets() { } /** - * Method to insert code snippets for {@link CertificateClient#beginDeleteCertificate(String)} + * Method to insert code snippets for {@link CertificateClient#beginDeleteCertificate(String)} and + * {@link CertificateClient#beginDeleteCertificate(String, Duration)}. */ public void deleteCertificateCodeSnippets() { CertificateClient certificateClient = getCertificateClient(); - // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#string - SyncPoller deleteCertificatePoller = + // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#String + SyncPoller deleteCertPoller = certificateClient.beginDeleteCertificate("certificateName"); // Deleted Certificate is accessible as soon as polling beings. - PollResponse pollResponse = deleteCertificatePoller.poll(); - System.out.printf("Deleted certitifcate with name %s and recovery id %s", pollResponse.getValue().getName(), - pollResponse.getValue().getRecoveryId()); + PollResponse deleteCertPollResponse = deleteCertPoller.poll(); + System.out.printf("Deleted certificate with name %s and recovery id %s", + deleteCertPollResponse.getValue().getName(), deleteCertPollResponse.getValue().getRecoveryId()); + deleteCertPoller.waitForCompletion(); + // END: com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#String + + // BEGIN: com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#String-Duration + SyncPoller deleteCertificatePoller = + certificateClient.beginDeleteCertificate("certificateName", Duration.ofSeconds(1)); + // Deleted Certificate is accessible as soon as polling beings. + PollResponse deleteCertificatePollResponse = deleteCertificatePoller.poll(); + System.out.printf("Deleted certificate with name %s and recovery id %s", + deleteCertificatePollResponse.getValue().getName(), + deleteCertificatePollResponse.getValue().getRecoveryId()); deleteCertificatePoller.waitForCompletion(); - // END: com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#string + // END: com.azure.security.keyvault.certificates.CertificateClient.beginDeleteCertificate#String-Duration } /** @@ -366,19 +406,33 @@ public void purgeDeletedCertificateWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link CertificateClient#beginRecoverDeletedCertificate(String)} (String)} + * Method to insert code snippets for {@link CertificateClient#beginRecoverDeletedCertificate(String)} and + * {@link CertificateClient#beginRecoverDeletedCertificate(String, Duration)}. */ public void recoverDeletedCertificateCodeSnippets() { CertificateClient certificateClient = getCertificateClient(); - // BEGIN: com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#string - SyncPoller recoverCertPoller = certificateClient + // BEGIN: com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#String + SyncPoller recoverDeletedCertPoller = certificateClient .beginRecoverDeletedCertificate("deletedCertificateName"); // Recovered certificate is accessible as soon as polling beings - PollResponse pollResponse = recoverCertPoller.poll(); - System.out.printf(" Recovered Deleted certificate with name %s and id %s", pollResponse.getValue() - .getProperties().getName(), pollResponse.getValue().getProperties().getId()); - recoverCertPoller.waitForCompletion(); - // END: com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#string + PollResponse recoverDeletedCertPollResponse = recoverDeletedCertPoller.poll(); + System.out.printf(" Recovered Deleted certificate with name %s and id %s", + recoverDeletedCertPollResponse.getValue().getProperties().getName(), + recoverDeletedCertPollResponse.getValue().getProperties().getId()); + recoverDeletedCertPoller.waitForCompletion(); + // END: com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#String + + // BEGIN: com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#String-Duration + SyncPoller recoverDeletedCertificatePoller = certificateClient + .beginRecoverDeletedCertificate("deletedCertificateName", Duration.ofSeconds(1)); + // Recovered certificate is accessible as soon as polling beings + PollResponse recoverDeletedCertificatePollResponse = + recoverDeletedCertificatePoller.poll(); + System.out.printf(" Recovered Deleted certificate with name %s and id %s", + recoverDeletedCertificatePollResponse.getValue().getProperties().getName(), + recoverDeletedCertificatePollResponse.getValue().getProperties().getId()); + recoverDeletedCertificatePoller.waitForCompletion(); + // END: com.azure.security.certificatevault.certificates.CertificateClient.beginRecoverDeletedCertificate#String-Duration } /** diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java index 1fc06dfaf584..3556a2c2428e 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTest.java @@ -62,7 +62,7 @@ private void createCertificateClient(HttpClient httpClient, .buildAsyncClient()); if (interceptorManager.isPlaybackMode()) { - when(asyncClient.getPollDuration()).thenReturn(Duration.ofMillis(10)); + when(asyncClient.getDefaultPollingInterval()).thenReturn(Duration.ofMillis(10)); } client = new CertificateClient(asyncClient); @@ -109,7 +109,7 @@ public void createCertificateNullPolicy(HttpClient httpClient, CertificateServic @ParameterizedTest(name = DISPLAY_NAME_WITH_ARGUMENTS) @MethodSource("getTestParameters") - public void createCertoificateNull(HttpClient httpClient, CertificateServiceVersion serviceVersion) { + public void createCertificateNull(HttpClient httpClient, CertificateServiceVersion serviceVersion) { createCertificateClient(httpClient, serviceVersion); assertRunnableThrowsException(() -> client.beginCreateCertificate(null, null), NullPointerException.class); diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java index 676896b6d31a..30e129cf6f6e 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/test/java/com/azure/security/keyvault/certificates/CertificateClientTestBase.java @@ -132,7 +132,7 @@ void createCertificateRunner(Consumer testRunner) { @Test public abstract void createCertificateNullPolicy(HttpClient httpClient, CertificateServiceVersion serviceVersion); - @Test public abstract void createCertoificateNull(HttpClient httpClient, CertificateServiceVersion serviceVersion); + @Test public abstract void createCertificateNull(HttpClient httpClient, CertificateServiceVersion serviceVersion); @Test public abstract void updateCertificate(HttpClient httpClient, CertificateServiceVersion serviceVersion); diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/test/resources/session-records/createCertoificateNull.json b/sdk/keyvault/azure-security-keyvault-certificates/src/test/resources/session-records/createCertificateNull.json similarity index 100% rename from sdk/keyvault/azure-security-keyvault-certificates/src/test/resources/session-records/createCertoificateNull.json rename to sdk/keyvault/azure-security-keyvault-certificates/src/test/resources/session-records/createCertificateNull.json diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyAsyncClient.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyAsyncClient.java index a3a750fc7be7..b199b06f5edd 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyAsyncClient.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyAsyncClient.java @@ -70,7 +70,7 @@ public final class KeyAsyncClient { // for more information on Azure resource provider namespaces. private static final String KEYVAULT_TRACING_NAMESPACE_VALUE = "Microsoft.KeyVault"; - private static final Duration DEFAULT_POLL_DURATION = Duration.ofSeconds(1); + private static final Duration DEFAULT_POLLING_INTERVAL = Duration.ofSeconds(1); private final String vaultUrl; private final KeyService service; @@ -100,8 +100,8 @@ public String getVaultUrl() { return vaultUrl; } - Duration getPollDuration() { - return DEFAULT_POLL_DURATION; + Duration getDefaultPollingInterval() { + return DEFAULT_POLLING_INTERVAL; } /** @@ -682,7 +682,7 @@ Mono> updateKeyPropertiesWithResponse(KeyProperties keyPro *

Deletes the key in the Azure Key Vault. Subscribes to the call asynchronously and prints out the deleted key * details when a response has been received.

* - * {@codesnippet com.azure.security.keyvault.keys.async.keyclient.deleteKey#string} + * {@codesnippet com.azure.security.keyvault.keys.async.keyclient.deleteKey#String} * * @param name The name of the key to be deleted. * @return A {@link PollerFlux} to poll on the {@link DeletedKey deleted key} status. @@ -691,7 +691,32 @@ Mono> updateKeyPropertiesWithResponse(KeyProperties keyPro */ @ServiceMethod(returns = ReturnType.SINGLE) public PollerFlux beginDeleteKey(String name) { - return new PollerFlux<>(getPollDuration(), + return beginDeleteKey(name, getDefaultPollingInterval()); + } + + /** + * Deletes a key of any type from the key vault. If soft-delete is enabled on the key vault then the key is placed + * in the deleted state and requires to be purged for permanent deletion else the key is permanently deleted. The + * delete operation applies to any key stored in Azure Key Vault but it cannot be applied to an individual version + * of a key. This operation removes the cryptographic material associated with the key, which means the key is not + * usable for Sign/Verify, Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the + * {@code keys/delete} permission. + * + *

Code Samples

+ *

Deletes the key in the Azure Key Vault. Subscribes to the call asynchronously and prints out the deleted key + * details when a response has been received.

+ * + * {@codesnippet com.azure.security.keyvault.keys.async.keyclient.deleteKey#String-Duration} + * + * @param name The name of the key to be deleted. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} to poll on the {@link DeletedKey deleted key} status. + * @throws ResourceNotFoundException when a key with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a key with {@code name} is empty string. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginDeleteKey(String name, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, activationOperation(name), createPollOperation(name), (context, firstResponse) -> Mono.empty(), @@ -859,7 +884,7 @@ Mono> purgeDeletedKeyWithResponse(String name, Context context) { *

Recovers the deleted key from the key vault enabled for soft-delete. Subscribes to the call asynchronously and * prints out the recovered key details when a response has been received.

* //Assuming key is deleted on a soft-delete enabled vault. - * {@codesnippet com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#string} + * {@codesnippet com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#String} * * @param name The name of the deleted key to be recovered. * @return A {@link PollerFlux} to poll on the {@link KeyVaultKey recovered key} status. @@ -868,7 +893,29 @@ Mono> purgeDeletedKeyWithResponse(String name, Context context) { */ @ServiceMethod(returns = ReturnType.SINGLE) public PollerFlux beginRecoverDeletedKey(String name) { - return new PollerFlux<>(getPollDuration(), + return beginRecoverDeletedKey(name, getDefaultPollingInterval()); + } + + /** + * Recovers the deleted key in the key vault to its latest version and can only be performed on a soft-delete + * enabled vault. An attempt to recover an non-deleted key will return an error. Consider this the inverse of the + * delete operation on soft-delete enabled vaults. This operation requires the {@code keys/recover} permission. + * + *

Code Samples

+ *

Recovers the deleted key from the key vault enabled for soft-delete. Subscribes to the call asynchronously and + * prints out the recovered key details when a response has been received.

+ * //Assuming key is deleted on a soft-delete enabled vault. + * {@codesnippet com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#String-Duration} + * + * @param name The name of the deleted key to be recovered. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} to poll on the {@link KeyVaultKey recovered key} status. + * @throws ResourceNotFoundException when a key with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a key with {@code name} is empty string. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginRecoverDeletedKey(String name, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, recoverActivationOperation(name), createRecoverPollOperation(name), (context, firstResponse) -> Mono.empty(), diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClient.java b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClient.java index f1733022ef44..ffe27274a44c 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClient.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/main/java/com/azure/security/keyvault/keys/KeyClient.java @@ -23,6 +23,8 @@ import com.azure.security.keyvault.keys.models.KeyOperation; import com.azure.security.keyvault.keys.models.KeyType; +import java.time.Duration; + /** * The KeyClient provides synchronous methods to manage {@link KeyVaultKey keys} in the Azure Key Vault. The client supports * creating, retrieving, updating, deleting, purging, backing up, restoring and listing the {@link KeyVaultKey keys}. The client @@ -437,7 +439,7 @@ public Response updateKeyPropertiesWithResponse(KeyProperties keyPr *

Code Samples

*

Deletes the key from the keyvault. Prints out the recovery id of the deleted key returned in the * response.

- * {@codesnippet com.azure.keyvault.keys.keyclient.deleteKey#string} + * {@codesnippet com.azure.keyvault.keys.keyclient.deleteKey#String} * * @param name The name of the key to be deleted. * @return A {@link SyncPoller} to poll on and retrieve {@link DeletedKey deleted key} @@ -448,6 +450,29 @@ public SyncPoller beginDeleteKey(String name) { return client.beginDeleteKey(name).getSyncPoller(); } + /** + * Deletes a key of any type from the key vault. If soft-delete is enabled on the key vault then the key is placed + * in the deleted state and requires to be purged for permanent deletion else the key is permanently deleted. The + * delete operation applies to any key stored in Azure Key Vault but it cannot be applied to an individual version + * of a key. This operation removes the cryptographic material associated with the key, which means the key is not + * usable for Sign/Verify, Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the {@code + * keys/delete} permission. + * + *

Code Samples

+ *

Deletes the key from the keyvault. Prints out the recovery id of the deleted key returned in the + * response.

+ * {@codesnippet com.azure.keyvault.keys.keyclient.deleteKey#String-Duration} + * + * @param name The name of the key to be deleted. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link SyncPoller} to poll on and retrieve {@link DeletedKey deleted key} + * @throws ResourceNotFoundException when a key with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a key with {@code name} is empty string. + */ + public SyncPoller beginDeleteKey(String name, Duration pollingInterval) { + return client.beginDeleteKey(name, pollingInterval).getSyncPoller(); + } + /** * Gets the public part of a deleted key. The Get Deleted Key operation is applicable for soft-delete enabled * vaults. This operation requires the {@code keys/get} permission. @@ -533,7 +558,7 @@ public Response purgeDeletedKeyWithResponse(String name, Context context) *

Code Samples

*

Recovers the deleted key from the key vault enabled for soft-delete.

* //Assuming key is deleted on a soft-delete enabled key vault. - * {@codesnippet com.azure.keyvault.keys.keyclient.recoverDeletedKey#string} + * {@codesnippet com.azure.keyvault.keys.keyclient.recoverDeletedKey#String} * * @param name The name of the deleted key to be recovered. * @return A {@link SyncPoller} to poll on and retrieve {@link KeyVaultKey recovered key}. @@ -544,6 +569,26 @@ public SyncPoller beginRecoverDeletedKey(String name) { return client.beginRecoverDeletedKey(name).getSyncPoller(); } + /** + * Recovers the deleted key in the key vault to its latest version and can only be performed on a soft-delete + * enabled vault. An attempt to recover an non-deleted key will return an error. Consider this the inverse of the + * delete operation on soft-delete enabled vaults. This operation requires the {@code keys/recover} permission. + * + *

Code Samples

+ *

Recovers the deleted key from the key vault enabled for soft-delete.

+ * //Assuming key is deleted on a soft-delete enabled key vault. + * {@codesnippet com.azure.keyvault.keys.keyclient.recoverDeletedKey#String-Duration} + * + * @param name The name of the deleted key to be recovered. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link SyncPoller} to poll on and retrieve {@link KeyVaultKey recovered key}. + * @throws ResourceNotFoundException when a key with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a key with {@code name} is empty string. + */ + public SyncPoller beginRecoverDeletedKey(String name, Duration pollingInterval) { + return client.beginRecoverDeletedKey(name, pollingInterval).getSyncPoller(); + } + /** * Requests a backup of the specified key be downloaded to the client. The Key Backup operation exports a key from * Azure Key Vault in a protected form. Note that this operation does not return key material in a form that can be diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyAsyncClientJavaDocCodeSnippets.java b/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyAsyncClientJavaDocCodeSnippets.java index e01a950bd606..84389cd3f3ae 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyAsyncClientJavaDocCodeSnippets.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyAsyncClientJavaDocCodeSnippets.java @@ -23,6 +23,7 @@ import com.azure.identity.DefaultAzureCredentialBuilder; import reactor.util.context.Context; +import java.time.Duration; import java.time.OffsetDateTime; /** @@ -133,18 +134,28 @@ public void createKey() { } /** - * Generates a code sample for using {@link KeyAsyncClient#beginDeleteKey(String)} + * Generates a code sample for using {@link KeyAsyncClient#beginDeleteKey(String)} and + * {@link KeyAsyncClient#beginDeleteKey(String, Duration)}. */ public void deleteKeySnippets() { KeyAsyncClient keyAsyncClient = createAsyncClient(); - // BEGIN: com.azure.security.keyvault.keys.async.keyclient.deleteKey#string + // BEGIN: com.azure.security.keyvault.keys.async.keyclient.deleteKey#String keyAsyncClient.beginDeleteKey("keyName") .subscribe(pollResponse -> { System.out.println("Delete Status: " + pollResponse.getStatus().toString()); System.out.println("Delete Key Name: " + pollResponse.getValue().getName()); System.out.println("Key Delete Date: " + pollResponse.getValue().getDeletedOn().toString()); }); - // END: com.azure.security.keyvault.keys.async.keyclient.deleteKey#string + // END: com.azure.security.keyvault.keys.async.keyclient.deleteKey#String + + // BEGIN: com.azure.security.keyvault.keys.async.keyclient.deleteKey#String-Duration + keyAsyncClient.beginDeleteKey("keyName", Duration.ofSeconds(1)) + .subscribe(pollResponse -> { + System.out.println("Delete Status: " + pollResponse.getStatus().toString()); + System.out.println("Delete Key Name: " + pollResponse.getValue().getName()); + System.out.println("Key Delete Date: " + pollResponse.getValue().getDeletedOn().toString()); + }); + // END: com.azure.security.keyvault.keys.async.keyclient.deleteKey#String-Duration } /** @@ -360,18 +371,28 @@ public void purgeDeletedKeyWithResponseSnippets() { } /** - * Generates a code sample for using {@link KeyAsyncClient#beginRecoverDeletedKey(String)} + * Generates a code sample for using {@link KeyAsyncClient#beginRecoverDeletedKey(String)} and + * {@link KeyAsyncClient#beginRecoverDeletedKey(String, Duration)}. */ public void recoverDeletedKeySnippets() { KeyAsyncClient keyAsyncClient = createAsyncClient(); - // BEGIN: com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#string + // BEGIN: com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#String keyAsyncClient.beginRecoverDeletedKey("deletedKeyName") .subscribe(pollResponse -> { System.out.println("Recovery Status: " + pollResponse.getStatus().toString()); System.out.println("Recover Key Name: " + pollResponse.getValue().getName()); System.out.println("Recover Key Type: " + pollResponse.getValue().getKeyType()); }); - // END: com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#string + // END: com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#String + + // BEGIN: com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#String-Duration + keyAsyncClient.beginRecoverDeletedKey("deletedKeyName", Duration.ofSeconds(1)) + .subscribe(pollResponse -> { + System.out.println("Recovery Status: " + pollResponse.getStatus().toString()); + System.out.println("Recover Key Name: " + pollResponse.getValue().getName()); + System.out.println("Recover Key Type: " + pollResponse.getValue().getKeyType()); + }); + // END: com.azure.security.keyvault.keys.async.keyclient.recoverDeletedKey#String-Duration } /** diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyClientJavaDocCodeSnippets.java b/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyClientJavaDocCodeSnippets.java index a4a226032790..f3555fa803eb 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyClientJavaDocCodeSnippets.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/samples/java/com/azure/security/keyvault/keys/KeyClientJavaDocCodeSnippets.java @@ -21,6 +21,7 @@ import com.azure.security.keyvault.keys.models.JsonWebKey; import com.azure.identity.DefaultAzureCredentialBuilder; +import java.time.Duration; import java.time.OffsetDateTime; /** @@ -116,13 +117,29 @@ public void importKeySnippets() { } /** - * Generates a code sample for using {@link KeyClient#beginDeleteKey(String)} - * @throws InterruptedException when the thread is interrupted in sleep mode. + * Generates a code sample for using {@link KeyClient#beginDeleteKey(String)} and + * {@link KeyClient#beginDeleteKey(String, Duration)}. */ - public void deleteKeySnippets() throws InterruptedException { + public void deleteKeySnippets() { KeyClient keyClient = createClient(); - // BEGIN: com.azure.keyvault.keys.keyclient.deleteKey#string - SyncPoller deletedKeyPoller = keyClient.beginDeleteKey("keyName"); + // BEGIN: com.azure.keyvault.keys.keyclient.deleteKey#String + SyncPoller deleteKeyPoller = keyClient.beginDeleteKey("keyName"); + + PollResponse deleteKeyPollResponse = deleteKeyPoller.poll(); + + // Deleted date only works for SoftDelete Enabled Key Vault. + DeletedKey key = deleteKeyPollResponse.getValue(); + System.out.println("Deleted Date %s" + key.getDeletedOn().toString()); + System.out.printf("Deleted Key's Recovery Id %s", key.getRecoveryId()); + + // Key is being deleted on server. + deleteKeyPoller.waitForCompletion(); + // Key is deleted + // END: com.azure.keyvault.keys.keyclient.deleteKey#String + + + // BEGIN: com.azure.keyvault.keys.keyclient.deleteKey#String-Duration + SyncPoller deletedKeyPoller = keyClient.beginDeleteKey("keyName", Duration.ofSeconds(1)); PollResponse deletedKeyPollResponse = deletedKeyPoller.poll(); @@ -134,7 +151,7 @@ public void deleteKeySnippets() throws InterruptedException { // Key is being deleted on server. deletedKeyPoller.waitForCompletion(); // Key is deleted - // END: com.azure.keyvault.keys.keyclient.deleteKey#string + // END: com.azure.keyvault.keys.keyclient.deleteKey#String-Duration } /** @@ -279,12 +296,12 @@ public void purgeDeletedKeyWithResponseSnippets() { } /** - * Generates a code sample for using {@link KeyClient#beginRecoverDeletedKey(String)} - * @throws InterruptedException when the thread is interrupted in sleep mode. + * Generates a code sample for using {@link KeyClient#beginRecoverDeletedKey(String)} and + * {@link KeyClient#beginRecoverDeletedKey(String, Duration)}. */ - public void recoverDeletedKeySnippets() throws InterruptedException { + public void recoverDeletedKeySnippets() { KeyClient keyClient = createClient(); - // BEGIN: com.azure.keyvault.keys.keyclient.recoverDeletedKey#string + // BEGIN: com.azure.keyvault.keys.keyclient.recoverDeletedKey#String SyncPoller recoverKeyPoller = keyClient.beginRecoverDeletedKey("deletedKeyName"); PollResponse recoverKeyPollResponse = recoverKeyPoller.poll(); @@ -296,7 +313,22 @@ public void recoverDeletedKeySnippets() throws InterruptedException { // Key is being recovered on server. recoverKeyPoller.waitForCompletion(); // Key is recovered - // END: com.azure.keyvault.keys.keyclient.recoverDeletedKey#string + // END: com.azure.keyvault.keys.keyclient.recoverDeletedKey#String + + // BEGIN: com.azure.keyvault.keys.keyclient.recoverDeletedKey#String-Duration + SyncPoller recoverDeletedKeyPoller = keyClient.beginRecoverDeletedKey("deletedKeyName", + Duration.ofSeconds(1)); + + PollResponse recoverDeletedKeyPollResponse = recoverDeletedKeyPoller.poll(); + + KeyVaultKey recoveredDeletedKey = recoverDeletedKeyPollResponse.getValue(); + System.out.println("Recovered Key Name %s" + recoveredDeletedKey.getName()); + System.out.printf("Recovered Key's Id %s", recoveredDeletedKey.getId()); + + // Key is being recovered on server. + recoverDeletedKeyPoller.waitForCompletion(); + // Key is recovered + // END: com.azure.keyvault.keys.keyclient.recoverDeletedKey#String-Duration } /** diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyAsyncClientTest.java b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyAsyncClientTest.java index e1cb17228ddd..24b4ecf61c98 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyAsyncClientTest.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyAsyncClientTest.java @@ -50,7 +50,7 @@ private void createKeyAsyncClient(HttpClient httpClient, KeyServiceVersion servi .buildAsyncClient()); if (interceptorManager.isPlaybackMode()) { - when(client.getPollDuration()).thenReturn(Duration.ofMillis(10)); + when(client.getDefaultPollingInterval()).thenReturn(Duration.ofMillis(10)); } } diff --git a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyClientTest.java b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyClientTest.java index 9754c6222ff1..d87fc3195f6e 100644 --- a/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyClientTest.java +++ b/sdk/keyvault/azure-security-keyvault-keys/src/test/java/com/azure/security/keyvault/keys/KeyClientTest.java @@ -48,7 +48,7 @@ private void getKeyClient(HttpClient httpClient, KeyServiceVersion serviceVersio .buildAsyncClient()); if (interceptorManager.isPlaybackMode()) { - when(asyncClient.getPollDuration()).thenReturn(Duration.ofMillis(10)); + when(asyncClient.getDefaultPollingInterval()).thenReturn(Duration.ofMillis(10)); } client = new KeyClient(asyncClient); diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretAsyncClient.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretAsyncClient.java index 3b790a1633c0..346e2a64e508 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretAsyncClient.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretAsyncClient.java @@ -63,7 +63,7 @@ public final class SecretAsyncClient { // for more information on Azure resource provider namespaces. private static final String KEYVAULT_TRACING_NAMESPACE_VALUE = "Microsoft.KeyVault"; - private static final Duration DEFAULT_POLL_DURATION = Duration.ofSeconds(1); + private static final Duration DEFAULT_POLLING_INTERVAL = Duration.ofSeconds(1); private final String vaultUrl; private final SecretService service; @@ -92,8 +92,8 @@ public String getVaultUrl() { return vaultUrl; } - Duration getPollDuration() { - return DEFAULT_POLL_DURATION; + Duration getDefaultPollingInterval() { + return DEFAULT_POLLING_INTERVAL; } /** @@ -388,7 +388,7 @@ Mono> updateSecretPropertiesWithResponse(SecretProper *

Code sample

*

Deletes the secret in the Azure Key Vault. Subscribes to the call asynchronously and prints out the deleted * secret details when a response is received.

- * {@codesnippet com.azure.keyvault.secrets.secretclient.deleteSecret#string} + * {@codesnippet com.azure.keyvault.secrets.secretclient.deleteSecret#String} * * @param name The name of the secret to be deleted. * @return A {@link PollerFlux} to poll on and retrieve {@link DeletedSecret deleted secret}. @@ -397,7 +397,29 @@ Mono> updateSecretPropertiesWithResponse(SecretProper */ @ServiceMethod(returns = ReturnType.SINGLE) public PollerFlux beginDeleteSecret(String name) { - return new PollerFlux<>(getPollDuration(), + return beginDeleteSecret(name, getDefaultPollingInterval()); + } + + /** + * Deletes a secret from the key vault. If soft-delete is enabled on the key vault then the secret is placed in the + * deleted state and for permanent deletion, needs to be purged. Otherwise, the secret is permanently deleted. + * All versions of a secret are deleted. This cannot be applied to individual versions of a secret. + * This operation requires the {@code secrets/delete} permission. + * + *

Code sample

+ *

Deletes the secret in the Azure Key Vault. Subscribes to the call asynchronously and prints out the deleted + * secret details when a response is received.

+ * {@codesnippet com.azure.keyvault.secrets.secretclient.deleteSecret#String-Duration} + * + * @param name The name of the secret to be deleted. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} to poll on and retrieve {@link DeletedSecret deleted secret}. + * @throws ResourceNotFoundException when a secret with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a secret with {@code name} is empty string. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginDeleteSecret(String name, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, activationOperation(name), createPollOperation(name), (pollingContext, firstResponse) -> Mono.empty(), @@ -560,7 +582,7 @@ Mono> purgeDeletedSecretWithResponse(String name, Context context *

Recovers the deleted secret from the key vault enabled for soft-delete. Subscribes to the call * asynchronously and prints out the recovered secret details when a response is received.

* - * {@codesnippet com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#string} + * {@codesnippet com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#String} * * @param name The name of the deleted secret to be recovered. * @return A {@link PollerFlux} to poll on and retrieve the {@link KeyVaultSecret recovered secret}. @@ -569,7 +591,28 @@ Mono> purgeDeletedSecretWithResponse(String name, Context context */ @ServiceMethod(returns = ReturnType.SINGLE) public PollerFlux beginRecoverDeletedSecret(String name) { - return new PollerFlux<>(getPollDuration(), + return beginRecoverDeletedSecret(name, getDefaultPollingInterval()); + } + + /** + * Recovers the deleted secret in the key vault to its latest version. Can only be performed on a soft-delete + * enabled vault. This operation requires the {@code secrets/recover} permission. + * + *

Code sample

+ *

Recovers the deleted secret from the key vault enabled for soft-delete. Subscribes to the call + * asynchronously and prints out the recovered secret details when a response is received.

+ * + * {@codesnippet com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#String-Duration} + * + * @param name The name of the deleted secret to be recovered. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link PollerFlux} to poll on and retrieve the {@link KeyVaultSecret recovered secret}. + * @throws ResourceNotFoundException when a secret with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a secret with {@code name} is empty string. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public PollerFlux beginRecoverDeletedSecret(String name, Duration pollingInterval) { + return new PollerFlux<>(pollingInterval, recoverActivationOperation(name), createRecoverPollOperation(name), (pollerContext, firstResponse) -> Mono.empty(), diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClient.java b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClient.java index e34e28f8465e..074c359efca9 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClient.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/main/java/com/azure/security/keyvault/secrets/SecretClient.java @@ -15,6 +15,8 @@ import com.azure.security.keyvault.secrets.models.KeyVaultSecret; import com.azure.security.keyvault.secrets.models.SecretProperties; +import java.time.Duration; + /** * The SecretClient provides synchronous methods to manage {@link KeyVaultSecret secrets} in the Azure Key Vault. The client * supports creating, retrieving, updating, deleting, purging, backing up, restoring, and listing the {@link KeyVaultSecret @@ -231,7 +233,7 @@ public SecretProperties updateSecretProperties(SecretProperties secretProperties *

Code sample

*

Deletes the secret from a soft-delete enabled key vault. Prints out the recovery id of the deleted secret * returned in the response.

- * {@codesnippet com.azure.security.keyvault.secretclient.deleteSecret#string} + * {@codesnippet com.azure.security.keyvault.secretclient.deleteSecret#String} * * @param name The name of the secret to be deleted. * @return A {@link SyncPoller} to poll on and retrieve the {@link DeletedSecret deleted secret}. @@ -242,6 +244,27 @@ public SyncPoller beginDeleteSecret(String name) { return client.beginDeleteSecret(name).getSyncPoller(); } + /** + * Deletes a secret from the key vault. If soft-delete is enabled on the key vault then the secret is placed in the + * deleted state and for permanent deletion, needs to be purged. Otherwise, the secret is permanently deleted. + * All versions of a secret are deleted. This cannot be applied to individual versions of a secret. + * This operation requires the {@code secrets/delete} permission. + * + *

Code sample

+ *

Deletes the secret from a soft-delete enabled key vault. Prints out the recovery id of the deleted secret + * returned in the response.

+ * {@codesnippet com.azure.security.keyvault.secretclient.deleteSecret#String-Duration} + * + * @param name The name of the secret to be deleted. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link SyncPoller} to poll on and retrieve the {@link DeletedSecret deleted secret}. + * @throws ResourceNotFoundException when a secret with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a secret with {@code name} is empty string. + */ + public SyncPoller beginDeleteSecret(String name, Duration pollingInterval) { + return client.beginDeleteSecret(name, pollingInterval).getSyncPoller(); + } + /** * Gets a secret that has been deleted for a soft-delete enabled key vault. This operation requires the * {@code secrets/list} permission. @@ -324,7 +347,7 @@ public Response purgeDeletedSecretWithResponse(String name, Context contex *

Code sample

*

Recovers the deleted secret from the key vault enabled for soft-delete. Prints out the details of the * recovered secret returned in the response.

- * {@codesnippet com.azure.security.keyvault.secretclient.recoverDeletedSecret#string} + * {@codesnippet com.azure.security.keyvault.secretclient.recoverDeletedSecret#String} * * @param name The name of the deleted secret to be recovered. * @return A {@link SyncPoller} to poll on and retrieve the {@link KeyVaultSecret recovered secret}. @@ -335,6 +358,25 @@ public SyncPoller beginRecoverDeletedSecret(String name) { return client.beginRecoverDeletedSecret(name).getSyncPoller(); } + /** + * Recovers the deleted secret in the key vault to its latest version. Can only be performed on a soft-delete + * enabled vault. This operation requires the {@code secrets/recover} permission. + * + *

Code sample

+ *

Recovers the deleted secret from the key vault enabled for soft-delete. Prints out the details of the + * recovered secret returned in the response.

+ * {@codesnippet com.azure.security.keyvault.secretclient.recoverDeletedSecret#String-Duration} + * + * @param name The name of the deleted secret to be recovered. + * @param pollingInterval The interval at which the operation status will be polled for. + * @return A {@link SyncPoller} to poll on and retrieve the {@link KeyVaultSecret recovered secret}. + * @throws ResourceNotFoundException when a secret with {@code name} doesn't exist in the key vault. + * @throws HttpResponseException when a secret with {@code name} is empty string. + */ + public SyncPoller beginRecoverDeletedSecret(String name, Duration pollingInterval) { + return client.beginRecoverDeletedSecret(name, pollingInterval).getSyncPoller(); + } + /** * Requests a backup of the secret be downloaded to the client. All versions of the secret will be downloaded. * This operation requires the {@code secrets/backup} permission. diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretAsyncClientJavaDocCodeSnippets.java b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretAsyncClientJavaDocCodeSnippets.java index 9abb7a3ed534..d6649952668b 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretAsyncClientJavaDocCodeSnippets.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretAsyncClientJavaDocCodeSnippets.java @@ -16,6 +16,7 @@ import com.azure.security.keyvault.secrets.models.SecretProperties; import reactor.util.context.Context; +import java.time.Duration; import java.time.OffsetDateTime; /** @@ -203,14 +204,23 @@ public void updateSecretWithResponseCodeSnippets() { */ public void deleteSecretCodeSnippets() { SecretAsyncClient secretAsyncClient = getAsyncSecretClient(); - // BEGIN: com.azure.keyvault.secrets.secretclient.deleteSecret#string + // BEGIN: com.azure.keyvault.secrets.secretclient.deleteSecret#String secretAsyncClient.beginDeleteSecret("secretName") .subscribe(pollResponse -> { System.out.println("Delete Status: " + pollResponse.getStatus().toString()); System.out.println("Deleted Secret Name: " + pollResponse.getValue().getName()); System.out.println("Deleted Secret Value: " + pollResponse.getValue().getValue()); }); - // END: com.azure.keyvault.secrets.secretclient.deleteSecret#string + // END: com.azure.keyvault.secrets.secretclient.deleteSecret#String + + // BEGIN: com.azure.keyvault.secrets.secretclient.deleteSecret#String-Duration + secretAsyncClient.beginDeleteSecret("secretName", Duration.ofSeconds(1)) + .subscribe(pollResponse -> { + System.out.println("Delete Status: " + pollResponse.getStatus().toString()); + System.out.println("Deleted Secret Name: " + pollResponse.getValue().getName()); + System.out.println("Deleted Secret Value: " + pollResponse.getValue().getValue()); + }); + // END: com.azure.keyvault.secrets.secretclient.deleteSecret#String-Duration } /** @@ -264,18 +274,28 @@ public void purgeDeletedSecretWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link SecretAsyncClient#beginRecoverDeletedSecret(String)} + * Method to insert code snippets for {@link SecretAsyncClient#beginRecoverDeletedSecret(String)} and + * {@link SecretAsyncClient#beginRecoverDeletedSecret(String, Duration)}. */ public void recoverDeletedSecretCodeSnippets() { SecretAsyncClient secretAsyncClient = getAsyncSecretClient(); - // BEGIN: com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#string + // BEGIN: com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#String + secretAsyncClient.beginRecoverDeletedSecret("deletedSecretName") + .subscribe(pollResponse -> { + System.out.println("Recovery Status: " + pollResponse.getStatus().toString()); + System.out.println("Recovered Secret Name: " + pollResponse.getValue().getName()); + System.out.println("Recovered Secret Value: " + pollResponse.getValue().getValue()); + }); + // END: com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#String + + // BEGIN: com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#String-Duration secretAsyncClient.beginRecoverDeletedSecret("deletedSecretName") .subscribe(pollResponse -> { System.out.println("Recovery Status: " + pollResponse.getStatus().toString()); System.out.println("Recovered Secret Name: " + pollResponse.getValue().getName()); System.out.println("Recovered Secret Value: " + pollResponse.getValue().getValue()); }); - // END: com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#string + // END: com.azure.keyvault.secrets.secretclient.recoverDeletedSecret#String-Duration } /** diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretClientJavaDocCodeSnippets.java b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretClientJavaDocCodeSnippets.java index fbbb24f59092..d5b5939e21bf 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretClientJavaDocCodeSnippets.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/samples/java/com/azure/security/keyvault/secrets/SecretClientJavaDocCodeSnippets.java @@ -14,6 +14,7 @@ import com.azure.security.keyvault.secrets.models.KeyVaultSecret; import com.azure.security.keyvault.secrets.models.SecretProperties; +import java.time.Duration; import java.time.OffsetDateTime; /** @@ -147,26 +148,43 @@ public void updateSecretWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link SecretClient#beginDeleteSecret(String)} - * @throws InterruptedException when the thread is interrupted in sleep mode. + * Method to insert code snippets for {@link SecretClient#beginDeleteSecret(String)} and + * {@link SecretClient#beginDeleteSecret(String, Duration)} */ - public void deleteSecretCodeSnippets() throws InterruptedException { + public void deleteSecretCodeSnippets() { SecretClient secretClient = getSecretClient(); - // BEGIN: com.azure.security.keyvault.secretclient.deleteSecret#string - SyncPoller deletedSecretPoller = secretClient.beginDeleteSecret("secretName"); + // BEGIN: com.azure.security.keyvault.secretclient.deleteSecret#String + SyncPoller deleteSecretPoller = secretClient.beginDeleteSecret("secretName"); + + // Deleted Secret is accessible as soon as polling begins. + PollResponse deleteSecretPollResponse = deleteSecretPoller.poll(); + + // Deletion date only works for a SoftDelete-enabled Key Vault. + System.out.println("Deleted Date %s" + deleteSecretPollResponse.getValue() + .getDeletedOn().toString()); + System.out.printf("Deleted Secret's Recovery Id %s", deleteSecretPollResponse.getValue() + .getRecoveryId()); + + // Secret is being deleted on server. + deleteSecretPoller.waitForCompletion(); + // END: com.azure.security.keyvault.secretclient.deleteSecret#String + + // BEGIN: com.azure.security.keyvault.secretclient.deleteSecret#String-Duration + SyncPoller deletedSecretPoller = secretClient.beginDeleteSecret("secretName", + Duration.ofSeconds(1)); // Deleted Secret is accessible as soon as polling begins. PollResponse deletedSecretPollResponse = deletedSecretPoller.poll(); // Deletion date only works for a SoftDelete-enabled Key Vault. System.out.println("Deleted Date %s" + deletedSecretPollResponse.getValue() - .getDeletedOn().toString()); + .getDeletedOn().toString()); System.out.printf("Deleted Secret's Recovery Id %s", deletedSecretPollResponse.getValue() - .getRecoveryId()); + .getRecoveryId()); // Secret is being deleted on server. deletedSecretPoller.waitForCompletion(); - // END: com.azure.security.keyvault.secretclient.deleteSecret#string + // END: com.azure.security.keyvault.secretclient.deleteSecret#String-Duration } /** @@ -216,12 +234,12 @@ public void purgeDeletedSecretWithResponseCodeSnippets() { } /** - * Method to insert code snippets for {@link SecretClient#beginRecoverDeletedSecret(String)} - * @throws InterruptedException when the thread is interrupted in sleep mode. + * Method to insert code snippets for {@link SecretClient#beginRecoverDeletedSecret(String)} and + * {@link SecretClient#beginRecoverDeletedSecret(String, Duration)}. */ - public void recoverDeletedSecretCodeSnippets() throws InterruptedException { + public void recoverDeletedSecretCodeSnippets() { SecretClient secretClient = getSecretClient(); - // BEGIN: com.azure.security.keyvault.secretclient.recoverDeletedSecret#string + // BEGIN: com.azure.security.keyvault.secretclient.recoverDeletedSecret#String SyncPoller recoverSecretPoller = secretClient.beginRecoverDeletedSecret("deletedSecretName"); @@ -232,7 +250,20 @@ public void recoverDeletedSecretCodeSnippets() throws InterruptedException { // Key is being recovered on server. recoverSecretPoller.waitForCompletion(); - // END: com.azure.security.keyvault.secretclient.recoverDeletedSecret#string + // END: com.azure.security.keyvault.secretclient.recoverDeletedSecret#String + + // BEGIN: com.azure.security.keyvault.secretclient.recoverDeletedSecret#String-Duration + SyncPoller recoverDeletedSecretPoller = + secretClient.beginRecoverDeletedSecret("deletedSecretName", Duration.ofSeconds(1)); + + // Deleted Secret can be accessed as soon as polling is in progress. + PollResponse recoveredDeletedSecretPollResponse = recoverDeletedSecretPoller.poll(); + System.out.println("Recovered Key Name %s" + recoveredDeletedSecretPollResponse.getValue().getName()); + System.out.printf("Recovered Key's Id %s", recoveredDeletedSecretPollResponse.getValue().getId()); + + // Key is being recovered on server. + recoverDeletedSecretPoller.waitForCompletion(); + // END: com.azure.security.keyvault.secretclient.recoverDeletedSecret#String-Duration } /** diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretAsyncClientTest.java b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretAsyncClientTest.java index 9557972c3ea6..c6dd01170111 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretAsyncClientTest.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretAsyncClientTest.java @@ -46,7 +46,7 @@ private void initializeClient(HttpClient httpClient, SecretServiceVersion servic .buildAsyncClient()); if (interceptorManager.isPlaybackMode()) { - when(client.getPollDuration()).thenReturn(Duration.ofMillis(10)); + when(client.getDefaultPollingInterval()).thenReturn(Duration.ofMillis(10)); } } diff --git a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretClientTest.java b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretClientTest.java index bbcd3dfd177a..e921fd821389 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretClientTest.java +++ b/sdk/keyvault/azure-security-keyvault-secrets/src/test/java/com/azure/security/keyvault/secrets/SecretClientTest.java @@ -43,7 +43,7 @@ private void initializeClient(HttpClient httpClient, SecretServiceVersion servic .buildAsyncClient()); if (interceptorManager.isPlaybackMode()) { - when(asyncClient.getPollDuration()).thenReturn(Duration.ofMillis(10)); + when(asyncClient.getDefaultPollingInterval()).thenReturn(Duration.ofMillis(10)); } client = new SecretClient(asyncClient);