diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml index 64ebd555a1d5..7c30302dc1b7 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml +++ b/sdk/keyvault/azure-keyvault-certificates/tests/recordings/test_parse_id.test_parse_certificate_id_with_version.yaml @@ -28,7 +28,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Thu, 15 Oct 2020 00:52:14 GMT + - Fri, 06 Nov 2020 23:15:58 GMT expires: - '-1' pragma: @@ -45,15 +45,15 @@ interactions: x-ms-keyvault-region: - westus x-ms-keyvault-service-version: - - 1.2.41.0 + - 1.2.58.0 x-powered-by: - ASP.NET status: code: 401 message: Unauthorized - request: - body: '{"policy": {"issuer": {"name": "Self"}, "x509_props": {"subject": "CN=DefaultPolicy", - "sans": {}}}}' + body: '{"policy": {"x509_props": {"subject": "CN=DefaultPolicy", "sans": {}}, + "issuer": {"name": "Self"}}}' headers: Accept: - application/json @@ -71,9 +71,9 @@ interactions: uri: https://vaultname.vault.azure.net/certificates/cert3382155d/create?api-version=7.1 response: body: - string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMauvCl4utNKFCErlckBT5SG9h+BDm9mVVhruEgZZaQ5EcOe2bfOLplfJfuOO4qLapwT81INcWuUnxyqH89UBa05rZBr7a+9Zvrai2KqtoWXfSHHecJPma86NDS+6jCCpwynCgkIXYd2FrxRXcrB0kSXN39XTcBw5fNnquCMbpf9+Wja4MTBZbdIF1wcB47NL2/usq/fzGKOHet/8clsYGtP67qAd5lspjEjkalPi9TVzkV3b48TFg+0Zr7BmM9gGMN4jF57N02oqpnRIfxC7HLs5WxJOeAL5SXuW6LBH+xhQcy0utjvxqTKbwHFRmyG7wkqIeaVbmt3j82kkwjUz0CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBW/gnlVgImxYlW8cVmrBc19QRmELKOhvV9+vNEOaZx9PnSWnntyEcOkvE19mtKLucBQZqLjqUtBYfh5vxdQgndEnfbhLqUC+OrgpLNRY/SLOuzCdz+SJLtvB1JsRF3f0HSgXvEy460p54v3W95oUZJZx2YCpsIZS3Vi6oIq3oRL3Zu2hj9MwTn6Ghguo+DHmE4KS3HBc8s23CLfr81UNXlpstHrhYmkkKjP0uJ0IVKZ1HBx9Y2eTbERV+31K9dMYCStahNKGID04hpL94e1hg2/pIrlpkJD3tq1I/wD0HzQgj7DWHm7J7GSdxbHO7gMntxkhgns+yPZN4e3YCveTRv","cancellation_requested":false,"status":"inProgress","status_details":"Pending + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOjMY8A+g5XkYiFon6qbj8eVkO1PK6zulUjmkNRKTSwANMDhZP9RpEeckHI0s31L/TYd9YTxX1k++xpeRg2uNAxFc8d98RovycXaU/38KO2iSHNF90tQGW6EhiibPvmd1WnCXpsfe63i2rBgHoT1c2FTDbSjLWsbI3KLcUXQ0yGGnsz6cLNt95aJTMzKGQGFh1PA2HQ/d/DgKNbAG0FZHKNeC9XyGx93auU9m8X8op5lpczZgQkKJSjorRTC0VZWa9MH5QgRmcOZyJkCUCNcXSaEf+yijptf6qpB8r2OcMBpFkwuikaT9Lq57R8MNrhzjfu1M3Fv8nVXaFKnAAGF3AUCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAi+Xg3BX2YNUwA9Nfgb7TTS+0svCu3NqjJqxFVG98v/DNjIe4a1bH+X8RHl+tvQge2yLX7f+KhmlrtwsmSCVB4bKbHiGe/AuvjwccQqTSwy9y45tBoKSoNYz0Xx1V8MKEz8szfODvXSPSNHGFXA+3iMaM/6tyaEMTg8OLkeOxhL2PGN232tBaU1I1upbKzx/4wQGOGqqjuKnDGsav4wHiVsy/2R49x/be7MtJqIZk7e0DNePdIrZwdrwchup4yh+ELPq+BYnDJ/udcqVk6PjWeCGTCZu9Sf03/35ZHuP57slFXLJL+cQz+F1GErXvMKDAFoGh2ZSPCOlVo1T4xuS63","cancellation_requested":false,"status":"inProgress","status_details":"Pending certificate created. Certificate request is in progress. This may take some - time based on the issuer provider. Please check again later.","request_id":"1fb9b2cef9804791be79eed316fdc4c6"}' + time based on the issuer provider. Please check again later.","request_id":"3abd2606f58f4e3fb735d15e5ac1bf02"}' headers: cache-control: - no-cache @@ -82,11 +82,11 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Thu, 15 Oct 2020 00:52:17 GMT + - Fri, 06 Nov 2020 23:15:59 GMT expires: - '-1' location: - - https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1&request_id=1fb9b2cef9804791be79eed316fdc4c6 + - https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1&request_id=3abd2606f58f4e3fb735d15e5ac1bf02 pragma: - no-cache strict-transport-security: @@ -98,7 +98,7 @@ interactions: x-ms-keyvault-region: - westus x-ms-keyvault-service-version: - - 1.2.41.0 + - 1.2.58.0 x-powered-by: - ASP.NET status: @@ -119,9 +119,9 @@ interactions: uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 response: body: - string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMauvCl4utNKFCErlckBT5SG9h+BDm9mVVhruEgZZaQ5EcOe2bfOLplfJfuOO4qLapwT81INcWuUnxyqH89UBa05rZBr7a+9Zvrai2KqtoWXfSHHecJPma86NDS+6jCCpwynCgkIXYd2FrxRXcrB0kSXN39XTcBw5fNnquCMbpf9+Wja4MTBZbdIF1wcB47NL2/usq/fzGKOHet/8clsYGtP67qAd5lspjEjkalPi9TVzkV3b48TFg+0Zr7BmM9gGMN4jF57N02oqpnRIfxC7HLs5WxJOeAL5SXuW6LBH+xhQcy0utjvxqTKbwHFRmyG7wkqIeaVbmt3j82kkwjUz0CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBW/gnlVgImxYlW8cVmrBc19QRmELKOhvV9+vNEOaZx9PnSWnntyEcOkvE19mtKLucBQZqLjqUtBYfh5vxdQgndEnfbhLqUC+OrgpLNRY/SLOuzCdz+SJLtvB1JsRF3f0HSgXvEy460p54v3W95oUZJZx2YCpsIZS3Vi6oIq3oRL3Zu2hj9MwTn6Ghguo+DHmE4KS3HBc8s23CLfr81UNXlpstHrhYmkkKjP0uJ0IVKZ1HBx9Y2eTbERV+31K9dMYCStahNKGID04hpL94e1hg2/pIrlpkJD3tq1I/wD0HzQgj7DWHm7J7GSdxbHO7gMntxkhgns+yPZN4e3YCveTRv","cancellation_requested":false,"status":"inProgress","status_details":"Pending + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOjMY8A+g5XkYiFon6qbj8eVkO1PK6zulUjmkNRKTSwANMDhZP9RpEeckHI0s31L/TYd9YTxX1k++xpeRg2uNAxFc8d98RovycXaU/38KO2iSHNF90tQGW6EhiibPvmd1WnCXpsfe63i2rBgHoT1c2FTDbSjLWsbI3KLcUXQ0yGGnsz6cLNt95aJTMzKGQGFh1PA2HQ/d/DgKNbAG0FZHKNeC9XyGx93auU9m8X8op5lpczZgQkKJSjorRTC0VZWa9MH5QgRmcOZyJkCUCNcXSaEf+yijptf6qpB8r2OcMBpFkwuikaT9Lq57R8MNrhzjfu1M3Fv8nVXaFKnAAGF3AUCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAi+Xg3BX2YNUwA9Nfgb7TTS+0svCu3NqjJqxFVG98v/DNjIe4a1bH+X8RHl+tvQge2yLX7f+KhmlrtwsmSCVB4bKbHiGe/AuvjwccQqTSwy9y45tBoKSoNYz0Xx1V8MKEz8szfODvXSPSNHGFXA+3iMaM/6tyaEMTg8OLkeOxhL2PGN232tBaU1I1upbKzx/4wQGOGqqjuKnDGsav4wHiVsy/2R49x/be7MtJqIZk7e0DNePdIrZwdrwchup4yh+ELPq+BYnDJ/udcqVk6PjWeCGTCZu9Sf03/35ZHuP57slFXLJL+cQz+F1GErXvMKDAFoGh2ZSPCOlVo1T4xuS63","cancellation_requested":false,"status":"inProgress","status_details":"Pending certificate created. Certificate request is in progress. This may take some - time based on the issuer provider. Please check again later.","request_id":"1fb9b2cef9804791be79eed316fdc4c6"}' + time based on the issuer provider. Please check again later.","request_id":"3abd2606f58f4e3fb735d15e5ac1bf02"}' headers: cache-control: - no-cache @@ -130,7 +130,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Thu, 15 Oct 2020 00:52:17 GMT + - Fri, 06 Nov 2020 23:15:59 GMT expires: - '-1' pragma: @@ -144,7 +144,7 @@ interactions: x-ms-keyvault-region: - westus x-ms-keyvault-service-version: - - 1.2.41.0 + - 1.2.58.0 x-powered-by: - ASP.NET status: @@ -165,9 +165,9 @@ interactions: uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 response: body: - string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMauvCl4utNKFCErlckBT5SG9h+BDm9mVVhruEgZZaQ5EcOe2bfOLplfJfuOO4qLapwT81INcWuUnxyqH89UBa05rZBr7a+9Zvrai2KqtoWXfSHHecJPma86NDS+6jCCpwynCgkIXYd2FrxRXcrB0kSXN39XTcBw5fNnquCMbpf9+Wja4MTBZbdIF1wcB47NL2/usq/fzGKOHet/8clsYGtP67qAd5lspjEjkalPi9TVzkV3b48TFg+0Zr7BmM9gGMN4jF57N02oqpnRIfxC7HLs5WxJOeAL5SXuW6LBH+xhQcy0utjvxqTKbwHFRmyG7wkqIeaVbmt3j82kkwjUz0CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBW/gnlVgImxYlW8cVmrBc19QRmELKOhvV9+vNEOaZx9PnSWnntyEcOkvE19mtKLucBQZqLjqUtBYfh5vxdQgndEnfbhLqUC+OrgpLNRY/SLOuzCdz+SJLtvB1JsRF3f0HSgXvEy460p54v3W95oUZJZx2YCpsIZS3Vi6oIq3oRL3Zu2hj9MwTn6Ghguo+DHmE4KS3HBc8s23CLfr81UNXlpstHrhYmkkKjP0uJ0IVKZ1HBx9Y2eTbERV+31K9dMYCStahNKGID04hpL94e1hg2/pIrlpkJD3tq1I/wD0HzQgj7DWHm7J7GSdxbHO7gMntxkhgns+yPZN4e3YCveTRv","cancellation_requested":false,"status":"inProgress","status_details":"Pending + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOjMY8A+g5XkYiFon6qbj8eVkO1PK6zulUjmkNRKTSwANMDhZP9RpEeckHI0s31L/TYd9YTxX1k++xpeRg2uNAxFc8d98RovycXaU/38KO2iSHNF90tQGW6EhiibPvmd1WnCXpsfe63i2rBgHoT1c2FTDbSjLWsbI3KLcUXQ0yGGnsz6cLNt95aJTMzKGQGFh1PA2HQ/d/DgKNbAG0FZHKNeC9XyGx93auU9m8X8op5lpczZgQkKJSjorRTC0VZWa9MH5QgRmcOZyJkCUCNcXSaEf+yijptf6qpB8r2OcMBpFkwuikaT9Lq57R8MNrhzjfu1M3Fv8nVXaFKnAAGF3AUCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAi+Xg3BX2YNUwA9Nfgb7TTS+0svCu3NqjJqxFVG98v/DNjIe4a1bH+X8RHl+tvQge2yLX7f+KhmlrtwsmSCVB4bKbHiGe/AuvjwccQqTSwy9y45tBoKSoNYz0Xx1V8MKEz8szfODvXSPSNHGFXA+3iMaM/6tyaEMTg8OLkeOxhL2PGN232tBaU1I1upbKzx/4wQGOGqqjuKnDGsav4wHiVsy/2R49x/be7MtJqIZk7e0DNePdIrZwdrwchup4yh+ELPq+BYnDJ/udcqVk6PjWeCGTCZu9Sf03/35ZHuP57slFXLJL+cQz+F1GErXvMKDAFoGh2ZSPCOlVo1T4xuS63","cancellation_requested":false,"status":"inProgress","status_details":"Pending certificate created. Certificate request is in progress. This may take some - time based on the issuer provider. Please check again later.","request_id":"1fb9b2cef9804791be79eed316fdc4c6"}' + time based on the issuer provider. Please check again later.","request_id":"3abd2606f58f4e3fb735d15e5ac1bf02"}' headers: cache-control: - no-cache @@ -176,7 +176,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Thu, 15 Oct 2020 00:52:22 GMT + - Fri, 06 Nov 2020 23:16:05 GMT expires: - '-1' pragma: @@ -190,7 +190,7 @@ interactions: x-ms-keyvault-region: - westus x-ms-keyvault-service-version: - - 1.2.41.0 + - 1.2.58.0 x-powered-by: - ASP.NET status: @@ -211,7 +211,7 @@ interactions: uri: https://vaultname.vault.azure.net/certificates/cert3382155d/pending?api-version=7.1 response: body: - string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMauvCl4utNKFCErlckBT5SG9h+BDm9mVVhruEgZZaQ5EcOe2bfOLplfJfuOO4qLapwT81INcWuUnxyqH89UBa05rZBr7a+9Zvrai2KqtoWXfSHHecJPma86NDS+6jCCpwynCgkIXYd2FrxRXcrB0kSXN39XTcBw5fNnquCMbpf9+Wja4MTBZbdIF1wcB47NL2/usq/fzGKOHet/8clsYGtP67qAd5lspjEjkalPi9TVzkV3b48TFg+0Zr7BmM9gGMN4jF57N02oqpnRIfxC7HLs5WxJOeAL5SXuW6LBH+xhQcy0utjvxqTKbwHFRmyG7wkqIeaVbmt3j82kkwjUz0CAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBW/gnlVgImxYlW8cVmrBc19QRmELKOhvV9+vNEOaZx9PnSWnntyEcOkvE19mtKLucBQZqLjqUtBYfh5vxdQgndEnfbhLqUC+OrgpLNRY/SLOuzCdz+SJLtvB1JsRF3f0HSgXvEy460p54v3W95oUZJZx2YCpsIZS3Vi6oIq3oRL3Zu2hj9MwTn6Ghguo+DHmE4KS3HBc8s23CLfr81UNXlpstHrhYmkkKjP0uJ0IVKZ1HBx9Y2eTbERV+31K9dMYCStahNKGID04hpL94e1hg2/pIrlpkJD3tq1I/wD0HzQgj7DWHm7J7GSdxbHO7gMntxkhgns+yPZN4e3YCveTRv","cancellation_requested":false,"status":"completed","target":"https://vaultname.vault.azure.net/certificates/cert3382155d","request_id":"1fb9b2cef9804791be79eed316fdc4c6"}' + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending","issuer":{"name":"Self"},"csr":"MIICqDCCAZACAQAwGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOjMY8A+g5XkYiFon6qbj8eVkO1PK6zulUjmkNRKTSwANMDhZP9RpEeckHI0s31L/TYd9YTxX1k++xpeRg2uNAxFc8d98RovycXaU/38KO2iSHNF90tQGW6EhiibPvmd1WnCXpsfe63i2rBgHoT1c2FTDbSjLWsbI3KLcUXQ0yGGnsz6cLNt95aJTMzKGQGFh1PA2HQ/d/DgKNbAG0FZHKNeC9XyGx93auU9m8X8op5lpczZgQkKJSjorRTC0VZWa9MH5QgRmcOZyJkCUCNcXSaEf+yijptf6qpB8r2OcMBpFkwuikaT9Lq57R8MNrhzjfu1M3Fv8nVXaFKnAAGF3AUCAwEAAaBLMEkGCSqGSIb3DQEJDjE8MDowDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAi+Xg3BX2YNUwA9Nfgb7TTS+0svCu3NqjJqxFVG98v/DNjIe4a1bH+X8RHl+tvQge2yLX7f+KhmlrtwsmSCVB4bKbHiGe/AuvjwccQqTSwy9y45tBoKSoNYz0Xx1V8MKEz8szfODvXSPSNHGFXA+3iMaM/6tyaEMTg8OLkeOxhL2PGN232tBaU1I1upbKzx/4wQGOGqqjuKnDGsav4wHiVsy/2R49x/be7MtJqIZk7e0DNePdIrZwdrwchup4yh+ELPq+BYnDJ/udcqVk6PjWeCGTCZu9Sf03/35ZHuP57slFXLJL+cQz+F1GErXvMKDAFoGh2ZSPCOlVo1T4xuS63","cancellation_requested":false,"status":"completed","target":"https://vaultname.vault.azure.net/certificates/cert3382155d","request_id":"3abd2606f58f4e3fb735d15e5ac1bf02"}' headers: cache-control: - no-cache @@ -220,7 +220,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Thu, 15 Oct 2020 00:52:27 GMT + - Fri, 06 Nov 2020 23:16:10 GMT expires: - '-1' pragma: @@ -234,7 +234,7 @@ interactions: x-ms-keyvault-region: - westus x-ms-keyvault-service-version: - - 1.2.41.0 + - 1.2.58.0 x-powered-by: - ASP.NET status: @@ -255,7 +255,7 @@ interactions: uri: https://vaultname.vault.azure.net/certificates/cert3382155d/?api-version=7.1 response: body: - string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/f91e6e5e73504e7f87134378c9112204","kid":"https://vaultname.vault.azure.net/keys/cert3382155d/f91e6e5e73504e7f87134378c9112204","sid":"https://vaultname.vault.azure.net/secrets/cert3382155d/f91e6e5e73504e7f87134378c9112204","x5t":"vi5l5__fOMTzb1mgOAni3tma1F4","cer":"MIIDNjCCAh6gAwIBAgIQJIR8MCGBQaaL0U2EzAqIIjANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTIwMTAxNTAwNDIyMloXDTIxMTAxNTAwNTIyMlowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMauvCl4utNKFCErlckBT5SG9h+BDm9mVVhruEgZZaQ5EcOe2bfOLplfJfuOO4qLapwT81INcWuUnxyqH89UBa05rZBr7a+9Zvrai2KqtoWXfSHHecJPma86NDS+6jCCpwynCgkIXYd2FrxRXcrB0kSXN39XTcBw5fNnquCMbpf9+Wja4MTBZbdIF1wcB47NL2/usq/fzGKOHet/8clsYGtP67qAd5lspjEjkalPi9TVzkV3b48TFg+0Zr7BmM9gGMN4jF57N02oqpnRIfxC7HLs5WxJOeAL5SXuW6LBH+xhQcy0utjvxqTKbwHFRmyG7wkqIeaVbmt3j82kkwjUz0CAwEAAaN8MHowDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFNiCZ9cnE9Tjvip/iwbciKV+KlMyMB0GA1UdDgQWBBTYgmfXJxPU474qf4sG3IilfipTMjANBgkqhkiG9w0BAQsFAAOCAQEADPw45/uVTanMUpxjOlm+3Gt+fOfmVV1cRoKjNBA/vA9QZlNkvQFxY6sme+HzNkqzIc/z/N2gFfSgHMiVzwkIXsFgaaH4bSgZ7r6G1aCx3J1yCoLSZCWbEJvQuAQIZnB/BvULTK9y9zOeC6JQO36OCQrR1KwyzjxNLfMFejVxm/OR8b+p51ZN7xJaL8oG1Bw3QRwV8+AHHqBGzO/Pawk+Dz8VDfYQ79/1OdJAf0uZCyXUE2fF7F/Vs8VD0DoEd6wLbecUhmu6HcmWhVHjtkJwCZe7JHrRFymRTDJv6NgJZ8ytcBcOhjy82oEScqc+1lcOM9r1dppMXhPRSp7dfU6zpQ==","attributes":{"enabled":true,"nbf":1602722542,"exp":1634259142,"created":1602723143,"updated":1602723143,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90},"policy":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1602723136,"updated":1602723136}},"pending":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending"}}' + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/3642058776c549d196a47a6abdc3ae7f","kid":"https://vaultname.vault.azure.net/keys/cert3382155d/3642058776c549d196a47a6abdc3ae7f","sid":"https://vaultname.vault.azure.net/secrets/cert3382155d/3642058776c549d196a47a6abdc3ae7f","x5t":"-D_HpqV7wNTT2tOhxS1QmtsJRkY","cer":"MIIDNjCCAh6gAwIBAgIQc2foDXbZQNmDETa/0qdAKTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTIwMTEwNjIzMDYwN1oXDTIxMTEwNjIzMTYwN1owGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOjMY8A+g5XkYiFon6qbj8eVkO1PK6zulUjmkNRKTSwANMDhZP9RpEeckHI0s31L/TYd9YTxX1k++xpeRg2uNAxFc8d98RovycXaU/38KO2iSHNF90tQGW6EhiibPvmd1WnCXpsfe63i2rBgHoT1c2FTDbSjLWsbI3KLcUXQ0yGGnsz6cLNt95aJTMzKGQGFh1PA2HQ/d/DgKNbAG0FZHKNeC9XyGx93auU9m8X8op5lpczZgQkKJSjorRTC0VZWa9MH5QgRmcOZyJkCUCNcXSaEf+yijptf6qpB8r2OcMBpFkwuikaT9Lq57R8MNrhzjfu1M3Fv8nVXaFKnAAGF3AUCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFJ2BFHxFcuu4fUHqsbn5iwEtPuRWMB0GA1UdDgQWBBSdgRR8RXLruH1B6rG5+YsBLT7kVjANBgkqhkiG9w0BAQsFAAOCAQEAe+KtiUp5NwfU5DWCvyU/6wJYvNy36JYKL23AfC3LCN0N1HHzhySHwz4WupbGUDczLjIS5bPtd2zbVM3Q8BjHnhUv/rXjcTc3RJcXSdWccrSA0u/HsZjFo0UL6sYbd5FGTFqELsYp9r+ZqT9MixNqDY0gIOGniwJaLta7UHq7iNEFtTmXbBOqBkyrkonIv9sWcV9j/+M+/zVLJ5ZiXD2cdU34AIh2hpbaIVTZOP8JDYsIrRhVZQdAj37vGf/2o2Al69mF5irQjWt8FBywApDYW03rkkNKYyREL1xSitM6toeO3VewjBOC4oFgi3c7bP/mhqivSuB/P0Tiwh8CUipd6Q==","attributes":{"enabled":true,"nbf":1604703967,"exp":1636240567,"created":1604704567,"updated":1604704567,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90},"policy":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1604704559,"updated":1604704559}},"pending":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending"}}' headers: cache-control: - no-cache @@ -264,7 +264,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Thu, 15 Oct 2020 00:52:27 GMT + - Fri, 06 Nov 2020 23:16:10 GMT expires: - '-1' pragma: @@ -278,7 +278,7 @@ interactions: x-ms-keyvault-region: - westus x-ms-keyvault-service-version: - - 1.2.41.0 + - 1.2.58.0 x-powered-by: - ASP.NET status: @@ -299,7 +299,7 @@ interactions: uri: https://vaultname.vault.azure.net/certificates/cert3382155d/?api-version=7.1 response: body: - string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/f91e6e5e73504e7f87134378c9112204","kid":"https://vaultname.vault.azure.net/keys/cert3382155d/f91e6e5e73504e7f87134378c9112204","sid":"https://vaultname.vault.azure.net/secrets/cert3382155d/f91e6e5e73504e7f87134378c9112204","x5t":"vi5l5__fOMTzb1mgOAni3tma1F4","cer":"MIIDNjCCAh6gAwIBAgIQJIR8MCGBQaaL0U2EzAqIIjANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTIwMTAxNTAwNDIyMloXDTIxMTAxNTAwNTIyMlowGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMauvCl4utNKFCErlckBT5SG9h+BDm9mVVhruEgZZaQ5EcOe2bfOLplfJfuOO4qLapwT81INcWuUnxyqH89UBa05rZBr7a+9Zvrai2KqtoWXfSHHecJPma86NDS+6jCCpwynCgkIXYd2FrxRXcrB0kSXN39XTcBw5fNnquCMbpf9+Wja4MTBZbdIF1wcB47NL2/usq/fzGKOHet/8clsYGtP67qAd5lspjEjkalPi9TVzkV3b48TFg+0Zr7BmM9gGMN4jF57N02oqpnRIfxC7HLs5WxJOeAL5SXuW6LBH+xhQcy0utjvxqTKbwHFRmyG7wkqIeaVbmt3j82kkwjUz0CAwEAAaN8MHowDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFNiCZ9cnE9Tjvip/iwbciKV+KlMyMB0GA1UdDgQWBBTYgmfXJxPU474qf4sG3IilfipTMjANBgkqhkiG9w0BAQsFAAOCAQEADPw45/uVTanMUpxjOlm+3Gt+fOfmVV1cRoKjNBA/vA9QZlNkvQFxY6sme+HzNkqzIc/z/N2gFfSgHMiVzwkIXsFgaaH4bSgZ7r6G1aCx3J1yCoLSZCWbEJvQuAQIZnB/BvULTK9y9zOeC6JQO36OCQrR1KwyzjxNLfMFejVxm/OR8b+p51ZN7xJaL8oG1Bw3QRwV8+AHHqBGzO/Pawk+Dz8VDfYQ79/1OdJAf0uZCyXUE2fF7F/Vs8VD0DoEd6wLbecUhmu6HcmWhVHjtkJwCZe7JHrRFymRTDJv6NgJZ8ytcBcOhjy82oEScqc+1lcOM9r1dppMXhPRSp7dfU6zpQ==","attributes":{"enabled":true,"nbf":1602722542,"exp":1634259142,"created":1602723143,"updated":1602723143,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90},"policy":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1602723136,"updated":1602723136}},"pending":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending"}}' + string: '{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/3642058776c549d196a47a6abdc3ae7f","kid":"https://vaultname.vault.azure.net/keys/cert3382155d/3642058776c549d196a47a6abdc3ae7f","sid":"https://vaultname.vault.azure.net/secrets/cert3382155d/3642058776c549d196a47a6abdc3ae7f","x5t":"-D_HpqV7wNTT2tOhxS1QmtsJRkY","cer":"MIIDNjCCAh6gAwIBAgIQc2foDXbZQNmDETa/0qdAKTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1EZWZhdWx0UG9saWN5MB4XDTIwMTEwNjIzMDYwN1oXDTIxMTEwNjIzMTYwN1owGDEWMBQGA1UEAxMNRGVmYXVsdFBvbGljeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOjMY8A+g5XkYiFon6qbj8eVkO1PK6zulUjmkNRKTSwANMDhZP9RpEeckHI0s31L/TYd9YTxX1k++xpeRg2uNAxFc8d98RovycXaU/38KO2iSHNF90tQGW6EhiibPvmd1WnCXpsfe63i2rBgHoT1c2FTDbSjLWsbI3KLcUXQ0yGGnsz6cLNt95aJTMzKGQGFh1PA2HQ/d/DgKNbAG0FZHKNeC9XyGx93auU9m8X8op5lpczZgQkKJSjorRTC0VZWa9MH5QgRmcOZyJkCUCNcXSaEf+yijptf6qpB8r2OcMBpFkwuikaT9Lq57R8MNrhzjfu1M3Fv8nVXaFKnAAGF3AUCAwEAAaN8MHowDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFJ2BFHxFcuu4fUHqsbn5iwEtPuRWMB0GA1UdDgQWBBSdgRR8RXLruH1B6rG5+YsBLT7kVjANBgkqhkiG9w0BAQsFAAOCAQEAe+KtiUp5NwfU5DWCvyU/6wJYvNy36JYKL23AfC3LCN0N1HHzhySHwz4WupbGUDczLjIS5bPtd2zbVM3Q8BjHnhUv/rXjcTc3RJcXSdWccrSA0u/HsZjFo0UL6sYbd5FGTFqELsYp9r+ZqT9MixNqDY0gIOGniwJaLta7UHq7iNEFtTmXbBOqBkyrkonIv9sWcV9j/+M+/zVLJ5ZiXD2cdU34AIh2hpbaIVTZOP8JDYsIrRhVZQdAj37vGf/2o2Al69mF5irQjWt8FBywApDYW03rkkNKYyREL1xSitM6toeO3VewjBOC4oFgi3c7bP/mhqivSuB/P0Tiwh8CUipd6Q==","attributes":{"enabled":true,"nbf":1604703967,"exp":1636240567,"created":1604704567,"updated":1604704567,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90},"policy":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/policy","key_props":{"exportable":true,"kty":"RSA","key_size":2048,"reuse_key":false},"secret_props":{"contentType":"application/x-pkcs12"},"x509_props":{"subject":"CN=DefaultPolicy","sans":{},"ekus":["1.3.6.1.5.5.7.3.1","1.3.6.1.5.5.7.3.2"],"key_usage":["digitalSignature","keyEncipherment"],"validity_months":12,"basic_constraints":{"ca":false}},"lifetime_actions":[{"trigger":{"lifetime_percentage":80},"action":{"action_type":"AutoRenew"}}],"issuer":{"name":"Self"},"attributes":{"enabled":true,"created":1604704559,"updated":1604704559}},"pending":{"id":"https://vaultname.vault.azure.net/certificates/cert3382155d/pending"}}' headers: cache-control: - no-cache @@ -308,7 +308,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Thu, 15 Oct 2020 00:52:27 GMT + - Fri, 06 Nov 2020 23:16:10 GMT expires: - '-1' pragma: @@ -322,7 +322,7 @@ interactions: x-ms-keyvault-region: - westus x-ms-keyvault-service-version: - - 1.2.41.0 + - 1.2.58.0 x-powered-by: - ASP.NET status: diff --git a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py index 1b35902bac19..06640e37a130 100644 --- a/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py +++ b/sdk/keyvault/azure-keyvault-certificates/tests/test_parse_id.py @@ -2,22 +2,17 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------- -import pytest -import functools from azure.keyvault.certificates import CertificateClient, CertificatePolicy, parse_key_vault_certificate_id from devtools_testutils import ResourceGroupPreparer, KeyVaultPreparer -from _shared.preparer import KeyVaultClientPreparer as _KeyVaultClientPreparer +from _shared.preparer import KeyVaultClientPreparer from _shared.test_case import KeyVaultTestCase -# pre-apply the client_cls positional argument so it needn't be explicitly passed below -KeyVaultClientPreparer = functools.partial(_KeyVaultClientPreparer, CertificateClient) - class TestParseId(KeyVaultTestCase): @ResourceGroupPreparer(random_name_enabled=True) @KeyVaultPreparer() - @KeyVaultClientPreparer() + @KeyVaultClientPreparer(CertificateClient) def test_parse_certificate_id_with_version(self, client): cert_name = self.get_resource_name("cert") # create certificate @@ -32,31 +27,32 @@ def test_parse_certificate_id_with_version(self, client): print(parsed_certificate_id.version) print(parsed_certificate_id.source_id) # [END parse_key_vault_certificate_id] - self.assertEqual(parsed_certificate_id.name, cert_name) - self.assertEqual(parsed_certificate_id.vault_url, client.vault_url) - self.assertEqual(parsed_certificate_id.version, cert.properties.version) - self.assertEqual(parsed_certificate_id.source_id, cert.id) - - def test_parse_certificate_id_with_pending_version(self): - source_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" - parsed_certificate_id = parse_key_vault_certificate_id(source_id) - - self.assertEqual(parsed_certificate_id.name, "certificate-name") - self.assertEqual(parsed_certificate_id.vault_url, "https://keyvault-name.vault.azure.net") - self.assertEqual(parsed_certificate_id.version, "pending") - self.assertEqual( - parsed_certificate_id.source_id, - "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending", - ) - - def test_parse_deleted_certificate_id(self): - source_id = "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" - parsed_certificate_id = parse_key_vault_certificate_id(source_id) - - self.assertEqual(parsed_certificate_id.name, "deleted-certificate") - self.assertEqual(parsed_certificate_id.vault_url, "https://keyvault-name.vault.azure.net") - self.assertIsNone(parsed_certificate_id.version) - self.assertEqual( - parsed_certificate_id.source_id, - "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate", - ) + assert parsed_certificate_id.name == cert_name + assert parsed_certificate_id.vault_url == client.vault_url + assert parsed_certificate_id.version == cert.properties.version + assert parsed_certificate_id.source_id == cert.id + + +def test_parse_certificate_id_with_pending_version(): + source_id = "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + parsed_certificate_id = parse_key_vault_certificate_id(source_id) + + assert parsed_certificate_id.name == "certificate-name" + assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" + assert parsed_certificate_id.version == "pending" + assert ( + parsed_certificate_id.source_id == "https://keyvault-name.vault.azure.net/certificates/certificate-name/pending" + ) + + +def test_parse_deleted_certificate_id(): + source_id = "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + parsed_certificate_id = parse_key_vault_certificate_id(source_id) + + assert parsed_certificate_id.name == "deleted-certificate" + assert parsed_certificate_id.vault_url == "https://keyvault-name.vault.azure.net" + assert parsed_certificate_id.version is None + assert ( + parsed_certificate_id.source_id + == "https://keyvault-name.vault.azure.net/deletedcertificates/deleted-certificate" + ) diff --git a/sdk/keyvault/azure-keyvault-keys/CHANGELOG.md b/sdk/keyvault/azure-keyvault-keys/CHANGELOG.md index 686a4186c206..e3f95c6a192a 100644 --- a/sdk/keyvault/azure-keyvault-keys/CHANGELOG.md +++ b/sdk/keyvault/azure-keyvault-keys/CHANGELOG.md @@ -1,6 +1,9 @@ # Release History ## 4.3.1 (Unreleased) +### Added +- Added method `parse_key_vault_key_id` that parses out a full ID returned by Key Vault, so users can easily +access the key's `name`, `vault_url`, and `version`. ## 4.3.0 (2020-10-06) diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/__init__.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/__init__.py index 2d5049c88d23..a9ca71234a7a 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/__init__.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/__init__.py @@ -3,7 +3,9 @@ # Licensed under the MIT License. # ------------------------------------- from ._enums import KeyCurveName, KeyOperation, KeyType +from ._parse_id import parse_key_vault_key_id from ._shared.client_base import ApiVersion +from ._shared import KeyVaultResourceId from ._models import DeletedKey, JsonWebKey, KeyProperties, KeyVaultKey from ._client import KeyClient @@ -17,6 +19,8 @@ "KeyType", "DeletedKey", "KeyProperties", + "parse_key_vault_key_id", + "KeyVaultResourceId" ] from ._version import VERSION diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_models.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_models.py index 5b5319f8b9e2..4e9879cec068 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_models.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_models.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. # ------------------------------------- from collections import namedtuple -from ._shared import parse_vault_id +from ._shared import parse_key_vault_id from ._generated.v7_1.models import JsonWebKey as _JsonWebKey try: @@ -68,7 +68,7 @@ def __init__(self, key_id, attributes=None, **kwargs): # type: (str, Optional[_models.KeyAttributes], **Any) -> None self._attributes = attributes self._id = key_id - self._vault_id = parse_vault_id(key_id) + self._vault_id = parse_key_vault_id(key_id) self._managed = kwargs.get("managed", None) self._tags = kwargs.get("tags", None) diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_parse_id.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_parse_id.py new file mode 100644 index 000000000000..b3c05e8458ff --- /dev/null +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_parse_id.py @@ -0,0 +1,29 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +from ._shared import parse_key_vault_id, KeyVaultResourceId + + +def parse_key_vault_key_id(source_id): + # type: (str) -> KeyVaultResourceId + """Parses a key's full ID into a class with parsed contents as attributes. + + :param str source_id: the full original identifier of a key + :returns: Returns a parsed key ID as a :class:`KeyVaultResourceId` + :rtype: ~azure.keyvault.keys.KeyVaultResourceId + :raises: ValueError + Example: + .. literalinclude:: ../tests/test_parse_id.py + :start-after: [START parse_key_vault_key_id] + :end-before: [END parse_key_vault_key_id] + :language: python + :caption: Parse a key's ID + :dedent: 8 + """ + parsed_id = parse_key_vault_id(source_id) + + return KeyVaultResourceId( + name=parsed_id.name, source_id=parsed_id.source_id, vault_url=parsed_id.vault_url, version=parsed_id.version + ) diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py index e13f15a61c71..c981f211427e 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/_shared/__init__.py @@ -2,19 +2,22 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ -from collections import namedtuple - try: import urllib.parse as parse except ImportError: # pylint:disable=import-error import urlparse as parse # type: ignore +from typing import TYPE_CHECKING from .challenge_auth_policy import ChallengeAuthPolicy, ChallengeAuthPolicyBase from .client_base import KeyVaultClientBase from .http_challenge import HttpChallenge from . import http_challenge_cache as HttpChallengeCache +if TYPE_CHECKING: + # pylint: disable=unused-import + from typing import Optional + __all__ = [ "ChallengeAuthPolicy", @@ -24,25 +27,45 @@ "KeyVaultClientBase", ] -_VaultId = namedtuple("VaultId", ["vault_url", "collection", "name", "version"]) +class KeyVaultResourceId(): + """Represents a Key Vault identifier and its parsed contents. + + :param str source_id: The complete identifier received from Key Vault + :param str vault_url: The vault URL + :param str name: The name extracted from the ID + :param str version: The version extracted from the ID + """ + + def __init__( + self, + source_id, # type: str + vault_url, # type: str + name, # type: str + version=None # type: Optional[str] + ): + self.source_id = source_id + self.vault_url = vault_url + self.name = name + self.version = version -def parse_vault_id(url): +def parse_key_vault_id(source_id): + # type: (str) -> KeyVaultResourceId try: - parsed_uri = parse.urlparse(url) + parsed_uri = parse.urlparse(source_id) except Exception: # pylint: disable=broad-except - raise ValueError("'{}' is not not a valid url".format(url)) + raise ValueError("'{}' is not not a valid url".format(source_id)) if not (parsed_uri.scheme and parsed_uri.hostname): - raise ValueError("'{}' is not not a valid url".format(url)) + raise ValueError("'{}' is not not a valid url".format(source_id)) path = list(filter(None, parsed_uri.path.split("/"))) if len(path) < 2 or len(path) > 3: - raise ValueError("'{}' is not not a valid vault url".format(url)) + raise ValueError("'{}' is not not a valid vault url".format(source_id)) - return _VaultId( + return KeyVaultResourceId( + source_id=source_id, vault_url="{}://{}".format(parsed_uri.scheme, parsed_uri.hostname), - collection=path[0], name=path[1], version=path[2] if len(path) == 3 else None, ) diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/_client.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/_client.py index c75d0089bb8b..6a6f0e275f43 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/_client.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/_client.py @@ -14,7 +14,7 @@ from ._providers import get_local_cryptography_provider, NoLocalCryptography from .. import KeyOperation from .._models import KeyVaultKey -from .._shared import KeyVaultClientBase, parse_vault_id +from .._shared import KeyVaultClientBase, parse_key_vault_id if TYPE_CHECKING: # pylint:disable=unused-import @@ -53,10 +53,10 @@ def __init__(self, key, credential, **kwargs): if isinstance(key, KeyVaultKey): self._key = key - self._key_id = parse_vault_id(key.id) + self._key_id = parse_key_vault_id(key.id) elif isinstance(key, six.string_types): self._key = None - self._key_id = parse_vault_id(key) + self._key_id = parse_key_vault_id(key) self._keys_get_forbidden = None # type: Optional[bool] else: raise ValueError("'key' must be a KeyVaultKey instance or a key ID string including a version") @@ -76,7 +76,7 @@ def key_id(self): :rtype: str """ - return "/".join(self._key_id) + return self._key_id.source_id @distributed_trace def _initialize(self, **kwargs): @@ -242,7 +242,7 @@ def unwrap_key(self, algorithm, encrypted_key, **kwargs): parameters=self._models.KeyOperationsParameters(algorithm=algorithm, value=encrypted_key), **kwargs ) - return UnwrapResult(key_id=self._key_id, algorithm=algorithm, key=operation_result.result) + return UnwrapResult(key_id=self.key_id, algorithm=algorithm, key=operation_result.result) @distributed_trace def sign(self, algorithm, digest, **kwargs): diff --git a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/aio/_client.py b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/aio/_client.py index 487611ad3b5c..61d2edb12cb7 100644 --- a/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/aio/_client.py +++ b/sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/crypto/aio/_client.py @@ -13,7 +13,7 @@ from .._providers import get_local_cryptography_provider, NoLocalCryptography from ... import KeyOperation from ..._models import KeyVaultKey -from ..._shared import AsyncKeyVaultClientBase, parse_vault_id +from ..._shared import AsyncKeyVaultClientBase, parse_key_vault_id if TYPE_CHECKING: # pylint:disable=unused-import @@ -50,10 +50,10 @@ class CryptographyClient(AsyncKeyVaultClientBase): def __init__(self, key: "Union[KeyVaultKey, str]", credential: "AsyncTokenCredential", **kwargs: "Any") -> None: if isinstance(key, KeyVaultKey): self._key = key - self._key_id = parse_vault_id(key.id) + self._key_id = parse_key_vault_id(key.id) elif isinstance(key, str): self._key = None - self._key_id = parse_vault_id(key) + self._key_id = parse_key_vault_id(key) self._keys_get_forbidden = None # type: Optional[bool] else: raise ValueError("'key' must be a KeyVaultKey instance or a key ID string including a version") @@ -72,7 +72,7 @@ def key_id(self) -> str: :rtype: str """ - return "/".join(self._key_id) + return self._key_id.source_id @distributed_trace_async async def _initialize(self, **kwargs): diff --git a/sdk/keyvault/azure-keyvault-keys/tests/recordings/test_parse_id.test_parse_key_id_with_version.yaml b/sdk/keyvault/azure-keyvault-keys/tests/recordings/test_parse_id.test_parse_key_id_with_version.yaml new file mode 100644 index 000000000000..4dd8d37f428e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-keys/tests/recordings/test_parse_id.test_parse_key_id_with_version.yaml @@ -0,0 +1,146 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-keys/4.3.1 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://vaultname.vault.azure.net/keys/key95c61223/create?api-version=7.1 + response: + body: + string: '{"error":{"code":"Unauthorized","message":"Request is missing a Bearer + or PoP token."}}' + headers: + cache-control: + - no-cache + content-length: + - '87' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 06 Nov 2020 23:10:59 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + www-authenticate: + - Bearer authorization="https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47", + resource="https://vault.azure.net" + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=162.211.216.102;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.2.58.0 + x-powered-by: + - ASP.NET + status: + code: 401 + message: Unauthorized +- request: + body: '{"kty": "RSA"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '14' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-keys/4.3.1 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://vaultname.vault.azure.net/keys/key95c61223/create?api-version=7.1 + response: + body: + string: '{"key":{"kid":"https://vaultname.vault.azure.net/keys/key95c61223/8a383cf408804b92b666d5374f99b56d","kty":"RSA","key_ops":["encrypt","decrypt","sign","verify","wrapKey","unwrapKey"],"n":"zUqt23buPv5IPJlmoY6u3yc5sTkV3Oe5vGl6KlXWPFYG7KSC2FBMozLt6Q4xYlk8-yB5SSO17ukTbmuoluhif9Ad3CgbSq_Op7FxMWdGgg8OgwNLS6hB0kxdaq-skmmbzsDmuBX5wYo6mU99FPbtNYMm2-TgjU_BjFdE7qwpQKGa8g-4v4AAWDMvHeTVxJ5m-_DT4Ygz5L-KGXBwMi2EjdwRpamCtZbo3pZPsKrIYxxD1GBLUn3wYKmvKO7YujwaFmNrahPy1mR3bWq5Zy30SKhXY33ttLfmXTyID0kiIu4phpdRaSvS7-Z9lqNzvcIsN5IDr0z7x3EUZwJMK1QdbQ","e":"AQAB"},"attributes":{"enabled":true,"created":1604704259,"updated":1604704259,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90}}' + headers: + cache-control: + - no-cache + content-length: + - '691' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 06 Nov 2020 23:10:59 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=162.211.216.102;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.2.58.0 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-keyvault-keys/4.3.1 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://vaultname.vault.azure.net/keys/key95c61223/?api-version=7.1 + response: + body: + string: '{"key":{"kid":"https://vaultname.vault.azure.net/keys/key95c61223/8a383cf408804b92b666d5374f99b56d","kty":"RSA","key_ops":["encrypt","decrypt","sign","verify","wrapKey","unwrapKey"],"n":"zUqt23buPv5IPJlmoY6u3yc5sTkV3Oe5vGl6KlXWPFYG7KSC2FBMozLt6Q4xYlk8-yB5SSO17ukTbmuoluhif9Ad3CgbSq_Op7FxMWdGgg8OgwNLS6hB0kxdaq-skmmbzsDmuBX5wYo6mU99FPbtNYMm2-TgjU_BjFdE7qwpQKGa8g-4v4AAWDMvHeTVxJ5m-_DT4Ygz5L-KGXBwMi2EjdwRpamCtZbo3pZPsKrIYxxD1GBLUn3wYKmvKO7YujwaFmNrahPy1mR3bWq5Zy30SKhXY33ttLfmXTyID0kiIu4phpdRaSvS7-Z9lqNzvcIsN5IDr0z7x3EUZwJMK1QdbQ","e":"AQAB"},"attributes":{"enabled":true,"created":1604704259,"updated":1604704259,"recoveryLevel":"Recoverable+Purgeable","recoverableDays":90}}' + headers: + cache-control: + - no-cache + content-length: + - '691' + content-type: + - application/json; charset=utf-8 + date: + - Fri, 06 Nov 2020 23:10:59 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000;includeSubDomains + x-content-type-options: + - nosniff + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=162.211.216.102;act_addr_fam=InterNetwork; + x-ms-keyvault-region: + - westus + x-ms-keyvault-service-version: + - 1.2.58.0 + x-powered-by: + - ASP.NET + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/keyvault/azure-keyvault-keys/tests/test_parse_id.py b/sdk/keyvault/azure-keyvault-keys/tests/test_parse_id.py new file mode 100644 index 000000000000..afca1590b247 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-keys/tests/test_parse_id.py @@ -0,0 +1,53 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------- +from azure.keyvault.keys import KeyClient, parse_key_vault_key_id +from devtools_testutils import ResourceGroupPreparer, KeyVaultPreparer + +from _shared.preparer import KeyVaultClientPreparer +from _shared.test_case import KeyVaultTestCase + + +class TestParseId(KeyVaultTestCase): + @ResourceGroupPreparer(random_name_enabled=True) + @KeyVaultPreparer() + @KeyVaultClientPreparer(KeyClient) + def test_parse_key_id_with_version(self, client): + key_name = self.get_resource_name("key") + # create key + created_key = client.create_rsa_key(key_name) + + # [START parse_key_vault_key_id] + key = client.get_key(key_name) + parsed_key_id = parse_key_vault_key_id(key.id) + + print(parsed_key_id.name) + print(parsed_key_id.vault_url) + print(parsed_key_id.version) + print(parsed_key_id.source_id) + # [END parse_key_vault_key_id] + assert parsed_key_id.name == key_name + assert parsed_key_id.vault_url == client.vault_url + assert parsed_key_id.version == key.properties.version + assert parsed_key_id.source_id == key.id + + +def test_parse_key_id_with_pending_version(): + source_id = "https://keyvault-name.vault.azure.net/keys/key-name/pending" + parsed_key_id = parse_key_vault_key_id(source_id) + + assert parsed_key_id.name == "key-name" + assert parsed_key_id.vault_url == "https://keyvault-name.vault.azure.net" + assert parsed_key_id.version == "pending" + assert parsed_key_id.source_id == "https://keyvault-name.vault.azure.net/keys/key-name/pending" + + +def test_parse_deleted_key_id(): + source_id = "https://keyvault-name.vault.azure.net/deletedkeys/deleted-key" + parsed_key_id = parse_key_vault_key_id(source_id) + + assert parsed_key_id.name == "deleted-key" + assert parsed_key_id.vault_url == "https://keyvault-name.vault.azure.net" + assert parsed_key_id.version is None + assert parsed_key_id.source_id == "https://keyvault-name.vault.azure.net/deletedkeys/deleted-key"