From 5050bee3bffc9e4e26d8f141778271d84f6652cc Mon Sep 17 00:00:00 2001 From: George Arama <50641385+gearama@users.noreply.github.com> Date: Fri, 4 Mar 2022 12:38:16 -0800 Subject: [PATCH] [Certificates] Create Certificate operation return (#3392) * fix cert create * PR feedback, readme update * clang --- .../README.md | 11 ++++-- .../certificate_client_operations.hpp | 12 +++---- .../samples/certificate_basic_operations.md | 11 ++++-- .../samples/certificate_get_certificates.md | 2 +- .../src/certificate_client_operations.cpp | 36 +++++++------------ .../certificate_basic_operations.cpp | 15 ++++++-- .../certificate_get_certificates.cpp | 18 +++++++--- .../test/ut/certificate_client_base_test.hpp | 8 ++++- 8 files changed, 67 insertions(+), 46 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/README.md b/sdk/keyvault/azure-security-keyvault-certificates/README.md index 748fee9af..93484d2c0 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/README.md +++ b/sdk/keyvault/azure-security-keyvault-certificates/README.md @@ -84,13 +84,18 @@ auto response = certificateClient.StartCreateCertificate(certificateName, option ### Getting a Certificate once completed -Call PollUntilDone to poll the status of the creation. Once the opperation has completed it will return the certificate. +Call PollUntilDone to poll the status of the creation. Once the opperation has completed we will call GetCertificate to get the newly created certificate. ```cpp Snippet:CertificateSample1Get // wait for complete to get the certificate -certificate = response.PollUntilDone(defaultWait).Value; - +auto pollResponse = response.PollUntilDone(defaultWait).Value; +// check the status of the poll response +if (!pollResponse.Error && pollResponse.Status.Value() == "completed") +{ +// get the certificate +auto result = certificateClient.GetCertificate(certificateName).Value; std::cout << "Created certificate with policy. Certificate name : " << certificate.Name(); +} ``` ### Updating certificate properties diff --git a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_operations.hpp b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_operations.hpp index d42c0d7f6..1a9d3d8aa 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_operations.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_operations.hpp @@ -23,17 +23,16 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @brief Represents a create certificate long running operation */ class CreateCertificateOperation final - : public Azure::Core::Operation { + : public Azure::Core::Operation { friend class CertificateClient; private: std::shared_ptr m_certificateClient; - KeyVaultCertificateWithPolicy m_value; - CertificateOperationProperties m_properties; + CertificateOperationProperties m_value; std::string m_continuationToken; - Azure::Response PollUntilDoneInternal( + Azure::Response PollUntilDoneInternal( std::chrono::milliseconds period, Azure::Core::Context& context) override; @@ -47,7 +46,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat */ CreateCertificateOperation( std::shared_ptr certificateClient, - Azure::Response response); + Azure::Response response); CreateCertificateOperation( std::string resumeToken, @@ -70,9 +69,8 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * * @return A CertificateOperationProperties object. */ - KeyVaultCertificateWithPolicy Value() const override { return m_value; } + CertificateOperationProperties Value() const override { return m_value; } - CertificateOperationProperties Properties() const { return m_properties; } /** * @brief Get an Url as string which can be used to get the status of the * operation. diff --git a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_basic_operations.md b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_basic_operations.md index 47fc3ae7d..c0d0560c0 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_basic_operations.md +++ b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_basic_operations.md @@ -45,13 +45,18 @@ auto response = certificateClient.StartCreateCertificate(certificateName, option ## Getting a Certificate -Call PollUntilDone to poll the status of the creation. Once the opperation has completed it will return the certificate. +Call PollUntilDone to poll the status of the creation. Once the opperation has completed we will call GetCertificate ```cpp Snippet:CertificateSample1Get // wait for complete to get the certificate -certificate = response.PollUntilDone(defaultWait).Value; - +auto pollResponse = response.PollUntilDone(defaultWait).Value; +// check the status of the poll response +if (!pollResponse.Error && pollResponse.Status.Value() == "completed") +{ +// get the certificate +auto result = certificateClient.GetCertificate(certificateName).Value; std::cout << "Created certificate with policy. Certificate name : " << certificate.Name(); +} ``` ## Updating certificate properties diff --git a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_get_certificates.md b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_get_certificates.md index 55dfd8848..b38f9cc1f 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_get_certificates.md +++ b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate_get_certificates.md @@ -35,7 +35,7 @@ CertificateClient certificateClient(std::getenv("AZURE_KEYVAULT_URL"), credentia ## Creating a Certificate Call StartCreateCertificate to create a new certificate, with specified properties and policy. -Call PollUntilDone to poll the status of the creation. Once the opperation has completed it will return the certificate. +Call PollUntilDone to poll the status of the creation. Once the opperation has completed we can continue. ```cpp Snippet:CertificateSample2Create std::string certificateName = "Sample1"; diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client_operations.cpp b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client_operations.cpp index bb0f1d0ed..06b6bdcfa 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client_operations.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client_operations.cpp @@ -9,7 +9,7 @@ using namespace Azure::Security::KeyVault::Certificates; -Azure::Response CreateCertificateOperation::PollUntilDoneInternal( +Azure::Response CreateCertificateOperation::PollUntilDoneInternal( std::chrono::milliseconds period, Azure::Core::Context& context) { @@ -23,19 +23,7 @@ Azure::Response CreateCertificateOperation::PollU std::this_thread::sleep_for(period); } - if (!m_properties.Error) - { - auto response = m_certificateClient->GetCertificate(m_properties.Name); - m_value = response.Value; - m_rawResponse = std::move(response.RawResponse); - } - else - { - // the raw response here is from the pending operation thus contains the Properties. - throw Azure::Core::RequestFailedException(m_rawResponse); - } - - return Azure::Response( + return Azure::Response( m_value, std::make_unique(*m_rawResponse)); } @@ -71,7 +59,7 @@ std::unique_ptr CreateCertificateOperation::Poll if (m_status == Azure::Core::OperationStatus::Succeeded) { - m_properties = _detail::CertificateOperationSerializer::Deserialize(*rawResponse); + m_value = _detail::CertificateOperationSerializer::Deserialize(*rawResponse); } return rawResponse; @@ -79,14 +67,14 @@ std::unique_ptr CreateCertificateOperation::Poll CreateCertificateOperation::CreateCertificateOperation( std::shared_ptr certificateClient, - Azure::Response response) + Azure::Response response) : m_certificateClient(certificateClient) { m_value = response.Value; m_rawResponse = std::move(response.RawResponse); - m_continuationToken = m_value.Name(); + m_continuationToken = m_value.Name; - if (!m_value.Name().empty()) + if (!m_value.Name.empty()) { m_status = Azure::Core::OperationStatus::Succeeded; } @@ -113,26 +101,26 @@ void CreateCertificateOperation::Cancel(Azure::Core::Context const& context) { auto response = m_certificateClient->CancelPendingCertificateOperation(m_continuationToken, context); - m_properties = response.Value; + m_value = response.Value; } void CreateCertificateOperation::Delete(Azure::Core::Context const& context) { auto response = m_certificateClient->DeletePendingCertificateOperation(m_continuationToken, context); - m_properties = response.Value; + m_value = response.Value; } bool CreateCertificateOperation::IsCompleted() const { bool completed = false; - if (m_properties.Status - && (m_properties.Status.Value() == _detail::CompletedValue - || m_properties.Status.Value() == _detail::DeletedValue)) + if (m_value.Status + && (m_value.Status.Value() == _detail::CompletedValue + || m_value.Status.Value() == _detail::DeletedValue)) { completed = true; } - if (m_properties.Error.HasValue()) + if (m_value.Error.HasValue()) { completed = true; } diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-basic-operations/certificate_basic_operations.cpp b/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-basic-operations/certificate_basic_operations.cpp index 9096db104..2b70623ea 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-basic-operations/certificate_basic_operations.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-basic-operations/certificate_basic_operations.cpp @@ -67,9 +67,18 @@ int main() // start the create process auto response = certificateClient.StartCreateCertificate(certificateName, options); // wait for complete to get the certificate - certificate = response.PollUntilDone(defaultWait).Value; - - std::cout << "Created certificate with policy. Certificate name : " << certificate.Name(); + auto pollResponse = response.PollUntilDone(defaultWait).Value; + // check the status of the poll response + if (!pollResponse.Error && pollResponse.Status.Value() == "completed") + { + // get the certificate + auto result = certificateClient.GetCertificate(certificateName).Value; + std::cout << "Created certificate with policy. Certificate name : " << certificate.Name(); + } + else + { + std::cout << "Create certificate with policy result : " << pollResponse.Status.Value(); + } } // update certificate { diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-get-certificates/certificate_get_certificates.cpp b/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-get-certificates/certificate_get_certificates.cpp index 2b90deb53..a9ab51336 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-get-certificates/certificate_get_certificates.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/samples/certificate-get-certificates/certificate_get_certificates.cpp @@ -157,10 +157,20 @@ KeyVaultCertificateWithPolicy CreateCertificate( // start the create process auto response = certificateClient.StartCreateCertificate(certificateName, options); // wait for complete to get the certificate - auto certificate = response.PollUntilDone(defaultWait).Value; + auto pollResponse = response.PollUntilDone(defaultWait).Value; - std::cout << "Created certificate with policy. Certificate name : " << certificate.Name(); - - return certificate; + // check the status of the poll response + if (!pollResponse.Error && pollResponse.Status.Value() == "completed") + { + // get the certificate + auto certificate = certificateClient.GetCertificate(certificateName).Value; + std::cout << "Created certificate with policy. Certificate name : " << certificate.Name(); + return certificate; + } + else + { + throw std::runtime_error( + "Create certificate with policy result : " + pollResponse.Status.Value()); + } } } diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp index dde88453e..599a5270c 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_base_test.hpp @@ -176,7 +176,13 @@ namespace Azure { options.Policy.LifetimeActions.emplace_back(action); auto response = client.StartCreateCertificate(name, options); - auto result = response.PollUntilDone(defaultWait); + auto pollResult = response.PollUntilDone(defaultWait); + EXPECT_EQ(pollResult.Value.Name, name); + EXPECT_TRUE(pollResult.Value.Status.HasValue()); + EXPECT_EQ(pollResult.Value.Status.Value(), "completed"); + EXPECT_EQ(pollResult.RawResponse->GetStatusCode(), Azure::Core::Http::HttpStatusCode::Ok); + // get the certificate + auto result = client.GetCertificate(name); EXPECT_EQ(result.Value.Name(), options.Properties.Name); EXPECT_EQ(result.Value.Properties.Name, options.Properties.Name);