From 30f62eb3aa9dc802039ff46cda05033e8b85e728 Mon Sep 17 00:00:00 2001 From: George Arama <50641385+gearama@users.noreply.github.com> Date: Wed, 27 Oct 2021 10:26:30 -0700 Subject: [PATCH] Api review changes (#2994) * operator != * moved download , make protected private * structs and classes * comments * change std::vector into struct * optional structs * get version * api signature changes * remove the options structs where not necessary , they are extremelly ugly * fix issue * small sample readme update --- .../certificates/certificate_client.hpp | 44 +++---- .../certificate_client_models.hpp | 123 ++++++++++-------- .../certificate_client_options.hpp | 8 +- .../certificate-ImportCertificate/README.md | 8 +- .../certificate-basic-operations.cpp | 6 +- .../src/certificate_client.cpp | 59 ++------- .../src/certificate_serializers.cpp | 6 +- .../src/private/certificate_serializers.hpp | 2 +- .../test/ut/certificate_client_base_test.hpp | 55 +++++++- .../test/ut/certificate_client_test.cpp | 43 +++--- 10 files changed, 191 insertions(+), 163 deletions(-) diff --git a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp index 9d5e35aa2..39ee51794 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client.hpp @@ -21,7 +21,11 @@ #include namespace Azure { namespace Security { namespace KeyVault { namespace Certificates { - +#if defined(TESTING_BUILD) + namespace Test { + class KeyVaultCertificateClientTest; + } +#endif /** * @brief The CertificateClient provides synchronous methods to manage KeyVaultCertificate in * Azure Key Vault. @@ -35,7 +39,11 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat { friend class CreateCertificateOperation; - protected: +#if defined(TESTING_BUILD) + friend class Test::KeyVaultCertificateClientTest; +#endif + + private: // Using a shared pipeline for a client to share it with LRO (like delete key) Azure::Core::Url m_vaultUrl; std::string m_apiVersion; @@ -90,14 +98,14 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @remark This operation requires the certificates/get permission. * * @param name The name of the certificate. - * @param options Optional parameters for this operation. + * @param version The version of the certificate. * @param context The context for the operation can be used for request cancellation. * @return A response containing the certificate and policy as a KeyVaultCertificateWithPolicy * instance. */ Azure::Response GetCertificateVersion( std::string const& name, - GetCertificateVersionOptions const& options = GetCertificateVersionOptions(), + std::string const& version, Azure::Core::Context const& context = Azure::Core::Context()) const; /** @@ -124,11 +132,13 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * * @remark This operation requires the certificates/setissuers permission. * + * @param name The certificate issuer name. * @param issuer The certificate issuer. * @param context The context for the operation can be used for request cancellation. * @return CertificateIssuer instance used to determine create status. */ Azure::Response CreateIssuer( + std::string const& name, CertificateIssuer const& issuer, Azure::Core::Context const& context = Azure::Core::Context()) const; @@ -189,7 +199,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @param context The context for the operation can be used for request cancellation. * @return The contacts list for the key vault certificate. */ - Azure::Response> GetContacts( + Azure::Response GetContacts( Azure::Core::Context const& context = Azure::Core::Context()) const; /** @@ -202,7 +212,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @param context The context for the operation can be used for request cancellation. * @return The contacts for the key vault certificate. */ - Azure::Response> DeleteContacts( + Azure::Response DeleteContacts( Azure::Core::Context const& context = Azure::Core::Context()) const; /** @@ -216,7 +226,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @param context The context for the operation can be used for request cancellation. * @return The contacts for the key vault certificate. */ - Azure::Response> SetContacts( + Azure::Response SetContacts( std::vector const& contacts, Azure::Core::Context const& context = Azure::Core::Context()) const; @@ -423,22 +433,6 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat GetDeletedCertificatesOptions const& options = GetDeletedCertificatesOptions(), Azure::Core::Context const& context = Azure::Core::Context()) const; - /** - * @brief Downloads a copy of a certificate. - * - * @details The Download Certificate operation attempts to download the managed secret which - * contains the full certificate - * - * @param name The name of the certificate. - * @param options The options for the request. - * @param context The context for the operation can be used for request cancellation. - * @return Downloaded certificate. - */ - Azure::Response DownloadCertificate( - std::string const& name, - DownloadCertificateOptions const& options = DownloadCertificateOptions(), - Azure::Core::Context const& context = Azure::Core::Context()) const; - /** * @brief Imports a certificate into a specified key vault. * @@ -484,11 +478,15 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * * @remark This operation requires the certificates/update permission. * + * @param name The certificate name. + * @param version The certificate version. * @param options The options for the request. * @param context The context for the operation can be used for request cancellation. * @return The updated certificate. */ Azure::Response UpdateCertificateProperties( + std::string const& name, + std::string const& version, CertificateUpdateOptions const& options, Azure::Core::Context const& context = Azure::Core::Context()) const; diff --git a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp index 2a6910cc7..019249457 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_models.hpp @@ -231,6 +231,13 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat return m_value == other.m_value; } + /** + * @brief Enables using the not equal operator for JWT. + * + * @param other A JWT to be compared. + */ + bool operator!=(const CertificateKeyType& other) const noexcept { return !operator==(other); } + /** * @brief Return the JSON Web Token (JWT) as a string. * @@ -303,6 +310,16 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat return m_value == other.m_value; } + /** + * @brief Enables using the not equal operator for JWT. + * + * @param other A JWT to be compared. + */ + bool operator!=(const CertificateKeyCurveName& other) const noexcept + { + return !operator==(other); + } + /** * @brief Get the string value of the key curve. * @@ -415,6 +432,16 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat return m_value == other.m_value; } + /** + * @brief Enables using the not equal operator for JWT. + * + * @param other A JWT to be compared. + */ + bool operator!=(const CertificateContentType& other) const noexcept + { + return !operator==(other); + } + /** * @brief Get the string value of the key curve. * @@ -481,6 +508,13 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat return m_value == other.m_value; } + /** + * @brief Enables using the not equal operator for JWT. + * + * @param other A JWT to be compared. + */ + bool operator!=(const CertificateKeyUsage& other) const noexcept { return !operator==(other); } + /** * @brief Get the string value of the key curve. * @@ -590,6 +624,16 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat return m_value == other.m_value; } + /** + * @brief Enables using the not equal operator for JWT. + * + * @param other A JWT to be compared. + */ + bool operator!=(const CertificatePolicyAction& other) const noexcept + { + return !operator==(other); + } + /** * @brief Get the string value of the key curve. * @@ -774,8 +818,8 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @brief A KeyVaultCertificate along with its CertificatePolicy. * */ - struct KeyVaultCertificateWithPolicy : public KeyVaultCertificate - { + class KeyVaultCertificateWithPolicy : public KeyVaultCertificate { + public: /** * @brief Gets the current policy for the certificate. * @@ -800,38 +844,12 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat KeyVaultCertificateWithPolicy() = default; }; - /** - * @brief The options for calling GetCertificate. - * - */ - struct GetCertificateVersionOptions final - { - /** - * @brief Certificate Version. - * - */ - std::string Version; - }; - - /** - * @brief The options for calling DownloadCertificate. - * - */ - struct DownloadCertificateOptions final - { - /** - * @brief Certificate Version. - * - */ - Azure::Nullable Version; - }; - /** * @brief Parameters for StartCreateCertificate. * */ - struct CertificateCreateParameters final - { + class CertificateCreateParameters final { + public: /** * @brief Certificate policy. * @@ -1037,8 +1055,8 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @brief Key vault server error * */ - struct ServerError final - { + class ServerError final { + public: ~ServerError() = default; /** * @brief Error Code @@ -1063,8 +1081,8 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat * @brief A certificate operation. * */ - struct CertificateOperationProperties final - { + class CertificateOperationProperties final { + public: /** * @brief The certificate id. * @@ -1149,8 +1167,8 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat ~CertificateOperationProperties() = default; }; - struct DeletedCertificate final : public KeyVaultCertificateWithPolicy - { + class DeletedCertificate final : public KeyVaultCertificateWithPolicy { + public: /** * @brief Gets the identifier of the deleted certificate. * @@ -1267,25 +1285,6 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat std::string Provider; }; - /** - * @brief A certificate downloaded X509 data. - * - */ - struct DownloadCertificateResult final - { - /** - * @brief Certificate data. - * - */ - std::string Certificate; - - /** - * @brief Content Type. - * - */ - CertificateContentType ContentType; - }; - /** * @brief Define a single page to list the certificates from the Key Vault. * @@ -1509,4 +1508,18 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat */ std::unordered_map Tags; }; + + /** + * @brief The certificate contacts API result. + * + */ + struct CertificateContactsResult + { + /** + * @brief The certificate contacts list. + * + */ + std::vector Contacts; + }; + }}}} // namespace Azure::Security::KeyVault::Certificates diff --git a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_options.hpp b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_options.hpp index e53266f93..63dff01a4 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_options.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/inc/azure/keyvault/certificates/certificate_client_options.hpp @@ -3,7 +3,7 @@ /** * @file - * @brief Defines the supported options to create a Key Vault Keys client. + * @brief Defines the supported options to create a Key Vault Certificate client. * */ @@ -30,7 +30,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat /** * @brief Construct a new Service Version object * - * @param version The string version for the Key Vault keys service. + * @param version The string version for the Key Vault Certificate service. */ ServiceVersion(std::string version) : m_version(std::move(version)) {} @@ -55,7 +55,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat }; /** - * @brief Define the options to create an SDK Keys client. + * @brief Define the options to create an SDK Certificate client. * */ struct CertificateClientOptions final : public Azure::Core::_internal::ClientOptions @@ -63,7 +63,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat ServiceVersion Version; /** - * @brief Construct a new Key Client Options object. + * @brief Construct a new Certificate Client Options object. * * @param version Optional version for the client. */ diff --git a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-ImportCertificate/README.md b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-ImportCertificate/README.md index 36a19271a..b78e0e168 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-ImportCertificate/README.md +++ b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-ImportCertificate/README.md @@ -26,14 +26,14 @@ CertificateClient certificateClient(std::getenv("AZURE_KEYVAULT_URL"), credentia ## Importing a PEM certificate -You will need the certificate content in PEM format to perform this operation. One sample is provided in certificate-ImportCertificate.hpp as the pemCertificate string. +You will need the certificate content in PEM format to perform this operation. One sample is provided in certificate-ImportCertificate.hpp as the GetPemCertificate() string. Once the import parameters are setup we can call Import certificate and get back the newly imported certificate. ```cpp Snippet:CertificateSample3ImportPEM // prepare the parameters ImportCertificateOptions params; -params.Value = pemCertificate; +params.Value = GetPemCertificate(); params.Policy.Enabled = true; params.Policy.KeyType = CertificateKeyType::Rsa; @@ -48,14 +48,14 @@ std::cout << "Imported pem certificate with name " << imported.Name(); ## Importing a PKCS certificate -You will need the certificate content in PKCS format to perform this operation. One sample is provided in certificate-ImportCertificate.hpp as the pkcsBase64 string. +You will need the certificate content in PKCS format to perform this operation. One sample is provided in certificate-ImportCertificate.hpp as the GetPkcsCertificate() string. Once the import parameters are setup we can call Import certificate and get back the newly imported certificate ```cpp Snippet:CertificateSample3ImportPKCS // prepare the parameters ImportCertificateOptions params; -params.Value = pkcsBase64; +params.Value = GetPemCertificate(); params.Policy.Enabled = true; params.Policy.KeyType = CertificateKeyType::Rsa; diff --git a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-basic-operations/certificate-basic-operations.cpp b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-basic-operations/certificate-basic-operations.cpp index 312b4a386..88067e24b 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-basic-operations/certificate-basic-operations.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/samples/certificate-basic-operations/certificate-basic-operations.cpp @@ -88,7 +88,11 @@ int main() updateOptions.Properties = certificate.Properties; updateOptions.Properties.Enabled = false; - auto updatedCertificate = certificateClient.UpdateCertificateProperties(updateOptions).Value; + auto updatedCertificate + = certificateClient + .UpdateCertificateProperties( + updateOptions.Properties.Name, updateOptions.Properties.Version, updateOptions) + .Value; std::cout << "After update certificate is enabled : " << (updatedCertificate.Properties.Enabled.Value() ? "true" : "false"); diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp index 682d4b5ca..bb9e19080 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_client.cpp @@ -102,15 +102,11 @@ Response CertificateClient::GetCertificate( Response CertificateClient::GetCertificateVersion( std::string const& name, - GetCertificateVersionOptions const& options, + std::string const& version, Context const& context) const { // Request with no payload - std::vector path{{CertificatesPath, name}}; - if (!options.Version.empty()) - { - path.emplace_back(options.Version); - } + std::vector path{{CertificatesPath, name, version}}; auto request = CreateRequest(HttpMethod::Get, std::move(path)); @@ -175,10 +171,10 @@ Azure::Response CertificateClient::DeleteIssuer( } Azure::Response CertificateClient::CreateIssuer( + std::string const& name, CertificateIssuer const& issuer, Azure::Core::Context const& context) const { - std::string name = issuer.Name; auto payload = CertificateIssuerSerializer::Serialize(issuer); Azure::Core::IO::MemoryBodyStream payloadStream( reinterpret_cast(payload.data()), payload.size()); @@ -208,7 +204,7 @@ Azure::Response CertificateClient::UpdateIssuer( return Azure::Response(std::move(value), std::move(rawResponse)); } -Response> CertificateClient::GetContacts( +Response CertificateClient::GetContacts( Azure::Core::Context const& context) const { auto request = CreateRequest(HttpMethod::Get, {CertificatesPath, ContactsPath}); @@ -216,10 +212,10 @@ Response> CertificateClient::GetContacts( // Send and parse respone auto rawResponse = SendRequest(request, context); auto value = CertificateContactsSerializer::Deserialize(*rawResponse); - return Azure::Response>(std::move(value), std::move(rawResponse)); + return Azure::Response(std::move(value), std::move(rawResponse)); } -Response> CertificateClient::DeleteContacts( +Response CertificateClient::DeleteContacts( Azure::Core::Context const& context) const { auto request = CreateRequest(HttpMethod::Delete, {CertificatesPath, ContactsPath}); @@ -227,10 +223,10 @@ Response> CertificateClient::DeleteContacts( // Send and parse respone auto rawResponse = SendRequest(request, context); auto value = CertificateContactsSerializer::Deserialize(*rawResponse); - return Azure::Response>(std::move(value), std::move(rawResponse)); + return Azure::Response(std::move(value), std::move(rawResponse)); } -Response> CertificateClient::SetContacts( +Response CertificateClient::SetContacts( std::vector const& contacts, Azure::Core::Context const& context) const { @@ -242,7 +238,7 @@ Response> CertificateClient::SetContacts( auto rawResponse = SendRequest(request, context); auto value = CertificateContactsSerializer::Deserialize(*rawResponse); - return Azure::Response>(std::move(value), std::move(rawResponse)); + return Azure::Response(std::move(value), std::move(rawResponse)); } Azure::Response CertificateClient::GetPendingCertificateOperation( @@ -383,6 +379,7 @@ CertificatePropertiesPagedResponse CertificateClient::GetPropertiesOfCertificate GetPropertiesOfCertificatesOptions const& options, Azure::Core::Context const& context) const { + (void)options; // Request and settings auto request = ContinuationTokenRequest({CertificatesPath}, options.NextPageToken); if (options.IncludePending) @@ -441,34 +438,6 @@ DeletedCertificatesPagedResponse CertificateClient::GetDeletedCertificates( std::move(value), std::move(rawResponse), std::make_unique(*this)); } -Azure::Response CertificateClient::DownloadCertificate( - std::string const& name, - DownloadCertificateOptions const& options, - Azure::Core::Context const& context) const -{ - KeyVaultCertificateWithPolicy certificate; - if (options.Version) - { - GetCertificateVersionOptions getVersionOptions{options.Version.Value()}; - auto response = GetCertificateVersion(name, getVersionOptions, context); - certificate = response.Value; - } - else - { - auto response = GetCertificate(name, context); - certificate = response.Value; - } - - Azure::Core::Url url(certificate.SecretId); - auto secretRequest = CreateRequest(HttpMethod::Get, {url.GetPath()}); - - auto secretResponse = SendRequest(secretRequest, context); - auto secret = KeyVaultSecretSerializer::Deserialize(*secretResponse); - - DownloadCertificateResult result{secret.Value, secret.ContentType.Value()}; - return Azure::Response(std::move(result), std::move(secretResponse)); -} - Azure::Response CertificateClient::ImportCertificate( std::string const& name, ImportCertificateOptions const& options, @@ -504,6 +473,8 @@ Azure::Response CertificateClient::MergeCertifica } Azure::Response CertificateClient::UpdateCertificateProperties( + std::string const& name, + std::string const& version, CertificateUpdateOptions const& options, Azure::Core::Context const& context) const { @@ -511,10 +482,8 @@ Azure::Response CertificateClient::UpdateCertific Azure::Core::IO::MemoryBodyStream payloadStream( reinterpret_cast(payload.data()), payload.size()); - auto request = CreateRequest( - HttpMethod::Patch, - {CertificatesPath, options.Properties.Name, options.Properties.Version}, - &payloadStream); + auto request + = CreateRequest(HttpMethod::Patch, {CertificatesPath, name, version}, &payloadStream); auto rawResponse = SendRequest(request, context); auto value = KeyVaultCertificateSerializer::Deserialize(options.Properties.Name, *rawResponse); diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp index 1a3b7a4cc..5d1b42d52 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/certificate_serializers.cpp @@ -547,10 +547,10 @@ std::string CertificateContactsSerializer::Serialize( return payload.dump(); } -std::vector CertificateContactsSerializer::Deserialize( +CertificateContactsResult CertificateContactsSerializer::Deserialize( Azure::Core::Http::RawResponse const& rawResponse) { - std::vector response; + CertificateContactsResult response; auto const& body = rawResponse.GetBody(); auto jsonResponse = json::parse(body); @@ -565,7 +565,7 @@ std::vector CertificateContactsSerializer::Deserialize( JsonOptional::SetIfExists(contact.Name, contactJson, NamePropertyName); JsonOptional::SetIfExists(contact.Phone, contactJson, PhonePropertyName); - response.emplace_back(contact); + response.Contacts.emplace_back(contact); } } diff --git a/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp b/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp index 05a824c99..d86f29a6f 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/src/private/certificate_serializers.hpp @@ -135,7 +135,7 @@ namespace Azure { namespace Security { namespace KeyVault { namespace Certificat public: static std::string Serialize(std::vector const& constacts); - static std::vector Deserialize( + static CertificateContactsResult Deserialize( Azure::Core::Http::RawResponse const& rawResponse); }; 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 343c7ce66..a1f775a22 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 @@ -8,10 +8,10 @@ */ #include +#include "../src/private/certificate_serializers.hpp" #include #include #include - #include using namespace std::chrono_literals; @@ -21,9 +21,28 @@ namespace Azure { namespace KeyVault { namespace Certificates { namespace Test { + /** - * @brief Client Certificate Credential authenticates with the Azure services using a Tenant ID, - * Client ID and a client secret. + * @brief A certificate downloaded X509 data. + * + */ + struct DownloadCertificateResult final + { + /** + * @brief Certificate data. + * + */ + std::string Certificate; + + /** + * @brief Content Type. + * + */ + CertificateContentType ContentType; + }; + /** + * @brief Client Certificate Credential authenticates with the Azure services using a + * Tenant ID, Client ID and a client secret. * */ class TestClientSecretCredential final : public Core::Credentials::TokenCredential { @@ -134,9 +153,9 @@ namespace Azure { m_defaultWait = 10s; } - // When running live tests, service can return 429 error response if the client is sending - // multiple requests per second. This can happen if the network is fast and tests are running - // without any delay between them. + // When running live tests, service can return 429 error response if the client is + // sending multiple requests per second. This can happen if the network is fast and + // tests are running without any delay between them. auto avoidTestThrottled = GetEnv("AZURE_KEYVAULT_AVOID_THROTTLED", "0"); if (avoidTestThrottled != "0") @@ -266,6 +285,28 @@ namespace Azure { return cert.Value; } - }; + Azure::Response DownloadCertificate( + std::string const& name, + CertificateClient const& client, + Azure::Core::Context const& context = Azure::Core::Context()) const + { + { + KeyVaultCertificateWithPolicy certificate; + auto response = client.GetCertificate(name, context); + certificate = response.Value; + + Azure::Core::Url url(certificate.SecretId); + auto secretRequest + = client.CreateRequest(Azure::Core::Http::HttpMethod::Get, {url.GetPath()}); + + auto secretResponse = client.SendRequest(secretRequest, context); + auto secret = _detail::KeyVaultSecretSerializer::Deserialize(*secretResponse); + + DownloadCertificateResult result{secret.Value, secret.ContentType.Value()}; + return Azure::Response( + std::move(result), std::move(secretResponse)); + } + } + }; }}}}} // namespace Azure::Security::KeyVault::Certificates::Test diff --git a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp index 38ca628b5..21b76ccfb 100644 --- a/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp +++ b/sdk/keyvault/azure-security-keyvault-certificates/test/ut/certificate_client_test.cpp @@ -173,11 +173,10 @@ TEST_F(KeyVaultCertificateClientTest, GetCertificateVersion) auto const& client = GetClientForTest(::testing::UnitTest::GetInstance()->current_test_info()->name()); - GetCertificateVersionOptions options; - options.Version = CreateCertificate(certificateName, client, m_defaultWait).Properties.Version; + std::string version + = CreateCertificate(certificateName, client, m_defaultWait).Properties.Version; { - - auto response = client.GetCertificateVersion(certificateName, options); + auto response = client.GetCertificateVersion(certificateName, version); CheckValidResponse(response); auto cert = response.Value; EXPECT_EQ(cert.Name(), cert.Properties.Name); @@ -305,7 +304,7 @@ TEST_F(KeyVaultCertificateClientTest, CreateGetIssuer) issuer.Organization.AdminDetails.emplace_back(admin); { - auto result = client.CreateIssuer(issuer); + auto result = client.CreateIssuer(issuer.Name, issuer); CheckIssuers(result.Value, issuer); } @@ -341,7 +340,7 @@ TEST_F(KeyVaultCertificateClientTest, UpdateIssuer) issuer.Organization.AdminDetails.emplace_back(admin); { - auto result = client.CreateIssuer(issuer); + auto result = client.CreateIssuer(issuer.Name, issuer); CheckIssuers(result.Value, issuer); } @@ -380,11 +379,11 @@ TEST_F(KeyVaultCertificateClientTest, SetContacts) auto response = client.SetContacts(contacts); - CheckContactsCollections(contacts, response.Value); + CheckContactsCollections(contacts, response.Value.Contacts); auto response2 = client.DeleteContacts(); - CheckContactsCollections(contacts, response2.Value); + CheckContactsCollections(contacts, response2.Value.Contacts); } TEST_F(KeyVaultCertificateClientTest, GetContacts) @@ -411,11 +410,11 @@ TEST_F(KeyVaultCertificateClientTest, GetContacts) client.SetContacts(contacts); auto response = client.GetContacts(); - CheckContactsCollections(contacts, response.Value); + CheckContactsCollections(contacts, response.Value.Contacts); auto response2 = client.DeleteContacts(); - CheckContactsCollections(contacts, response2.Value); + CheckContactsCollections(contacts, response2.Value.Contacts); } TEST_F(KeyVaultCertificateClientTest, GetContactsPartial) @@ -444,11 +443,11 @@ TEST_F(KeyVaultCertificateClientTest, GetContactsPartial) client.SetContacts(contacts); auto response = client.GetContacts(); - CheckContactsCollections(contacts, response.Value); + CheckContactsCollections(contacts, response.Value.Contacts); auto response2 = client.DeleteContacts(); - CheckContactsCollections(contacts, response2.Value); + CheckContactsCollections(contacts, response2.Value.Contacts); } TEST_F(KeyVaultCertificateClientTest, GetContactsDuplicateEmail) @@ -477,11 +476,11 @@ TEST_F(KeyVaultCertificateClientTest, GetContactsDuplicateEmail) client.SetContacts(contacts); auto response = client.GetContacts(); - CheckContactsCollections(contacts, response.Value); + CheckContactsCollections(contacts, response.Value.Contacts); auto response2 = client.DeleteContacts(); - CheckContactsCollections(contacts, response2.Value); + CheckContactsCollections(contacts, response2.Value.Contacts); } TEST_F(KeyVaultCertificateClientTest, GetCertificatePolicy) @@ -783,11 +782,11 @@ TEST_F(KeyVaultCertificateClientTest, GetPropertiesOfIssuers) issuer2.Organization.AdminDetails.emplace_back(admin); { - auto result = client.CreateIssuer(issuer); + auto result = client.CreateIssuer(issuer.Name, issuer); CheckIssuers(result.Value, issuer); } { - auto result = client.CreateIssuer(issuer2); + auto result = client.CreateIssuer(issuer2.Name, issuer2); CheckIssuers(result.Value, issuer2); } { @@ -862,7 +861,7 @@ TEST_F(KeyVaultCertificateClientTest, DownloadImportPkcs) = CreateCertificate(pkcs, client, m_defaultWait, "CN=xyz", CertificateContentType::Pkcs12); { - auto result = client.DownloadCertificate(pkcs); + auto result = DownloadCertificate(pkcs, client); auto params = ImportCertificateOptions(); params.Value = result.Value.Certificate; @@ -911,7 +910,7 @@ TEST_F(KeyVaultCertificateClientTest, DownloadImportPem) = CreateCertificate(pem, client, m_defaultWait, "CN=xyz", CertificateContentType::Pem); { - auto result = client.DownloadCertificate(pem); + auto result = DownloadCertificate(pem, client); auto params = ImportCertificateOptions(); params.Value = result.Value.Certificate; @@ -957,7 +956,11 @@ TEST_F(KeyVaultCertificateClientTest, UpdateCertificate) certificate.Properties.Enabled = false; CertificateUpdateOptions updateOptions; updateOptions.Properties = certificate.Properties; - auto updatedCert = client.UpdateCertificateProperties(updateOptions).Value; + auto updatedCert + = client + .UpdateCertificateProperties( + certificate.Properties.Name, certificate.Properties.Version, updateOptions) + .Value; EXPECT_FALSE(updatedCert.Properties.Enabled.Value()); } { @@ -991,7 +994,7 @@ TEST_F(KeyVaultCertificateClientTest, DISABLED_MergeCertificate) { auto certificate = CreateCertificate(pkcsToMerge, client, 1s, "CN=bbb"); - auto result = client.DownloadCertificate(pkcsToMerge); + auto result = DownloadCertificate(pkcsToMerge, client); // mergeParams.Certificates.emplace_back(Azure::Core::Convert::Base64Encode(certificate.Cer)); } {