diff --git a/sdk/spring/azure-spring-boot-test-keyvault-certificate/CHANGELOG.md b/sdk/spring/azure-spring-boot-test-keyvault-certificate/CHANGELOG.md new file mode 100644 index 0000000000000..46314a46d1801 --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-keyvault-certificate/CHANGELOG.md @@ -0,0 +1,5 @@ +# Release History + +## 1.0.0 (Unreleased) + + diff --git a/sdk/spring/azure-spring-boot-test-keyvault-certificate/README.md b/sdk/spring/azure-spring-boot-test-keyvault-certificate/README.md new file mode 100644 index 0000000000000..bc18d9e9c993c --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-keyvault-certificate/README.md @@ -0,0 +1,8 @@ +# Azure Spring Boot Integration tests client library for Java + +## Key concepts +## Getting started +## Examples +## Troubleshooting +## Next steps +## Contributing diff --git a/sdk/spring/azure-spring-boot-test-keyvault-certificate/pom.xml b/sdk/spring/azure-spring-boot-test-keyvault-certificate/pom.xml new file mode 100644 index 0000000000000..01896f9ca854f --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-keyvault-certificate/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + + com.azure.spring + azure-spring-boot-test-parent + 1.0.0 + ../azure-spring-boot-test-parent + + + com.azure.spring + azure-spring-boot-test-keyvault-certificate + 1.0.0 + + + + com.azure.spring + azure-spring-boot-starter-keyvault-certificates + 3.0.0-beta.8 + + + com.azure.spring + azure-spring-boot-test-core + 1.0.0 + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/KeyVaultCertificateIT.java b/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/KeyVaultCertificateIT.java new file mode 100644 index 0000000000000..5395f3cbcf1bc --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/KeyVaultCertificateIT.java @@ -0,0 +1,148 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +package com.azure.spring.test.keyvault; + +import com.azure.security.keyvault.jca.KeyVaultLoadStoreParameter; +import com.azure.spring.test.AppRunner; +import com.azure.spring.test.keyvault.app.DummyApp; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.PrivateKeyDetails; +import org.apache.http.ssl.PrivateKeyStrategy; +import org.apache.http.ssl.SSLContexts; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import javax.net.ssl.SSLContext; +import java.net.Socket; +import java.security.KeyStore; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import static com.azure.spring.test.keyvault.PropertyConvertorUtils.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class KeyVaultCertificateIT { + + private RestTemplate restTemplate; + + private static AppRunner app; + + @BeforeAll + public static void setEnvironmentProperty() { + PropertyConvertorUtils.putEnvironmentPropertyToSystemProperty( + Arrays.asList("CERTIFICATE_AZURE_KEYVAULT_URI", + "CERTIFICATE_AZURE_KEYVAULT_TENANT_ID", + "CERTIFICATE_AZURE_KEYVAULT_CLIENT_ID", + "CERTIFICATE_AZURE_KEYVAULT_CLIENT_SECRET") + ); + } + + public static KeyStore getAzureKeyVaultKeyStore() throws Exception { + KeyStore trustStore = KeyStore.getInstance("AzureKeyVault"); + KeyVaultLoadStoreParameter parameter = new KeyVaultLoadStoreParameter( + System.getProperty("azure.keyvault.uri"), + System.getProperty("azure.keyvault.tenant-id"), + System.getProperty("azure.keyvault.client-id"), + System.getProperty("azure.keyvault.client-secret")); + trustStore.load(parameter); + return trustStore; + } + + private void setRestTemplate(SSLContext sslContext) { + SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, + (hostname, session) -> true); + CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(socketFactory) + .build(); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); + + restTemplate = new RestTemplate(requestFactory); + } + + public void setRestTemplate() throws Exception { + KeyStore keyStore = getAzureKeyVaultKeyStore(); + SSLContext sslContext = SSLContexts.custom() + .loadTrustMaterial(keyStore, null) + .build(); + setRestTemplate(sslContext); + } + + public void setMTLSRestTemplate() throws Exception { + KeyStore keyStore = getAzureKeyVaultKeyStore(); + SSLContext sslContext = SSLContexts.custom() + .loadTrustMaterial(keyStore, null) + .loadKeyMaterial(keyStore, "".toCharArray(), new ClientPrivateKeyStrategy()) + .build(); + setRestTemplate(sslContext); + } + + public void startAppRunner(Map properties) { + app = new AppRunner(DummyApp.class); + properties.forEach(app::property); + app.start(); + } + + public Map getDefaultMap() { + Map properties = new HashMap<>(); + properties.put("azure.keyvault.uri", AZURE_KEYVAULT_URI); + properties.put("azure.keyvault.client-id", SPRING_CLIENT_ID); + properties.put("azure.keyvault.client-secret", SPRING_CLIENT_SECRET); + properties.put("azure.keyvault.tenant-id", SPRING_TENANT_ID); + properties.put("server.ssl.key-alias", "myalias"); + properties.put("server.ssl.key-store-type", "AzureKeyVault"); + return properties; + } + + /** + * Test the Spring Boot Health indicator integration. + */ + @Test + public void testSpringBootWebApplication() throws Exception { + Map properties = getDefaultMap(); + startAppRunner(properties); + + setRestTemplate(); + sendRequest(); + } + + @AfterAll + public static void destroy() { + app.close(); + } + + /** + * Test the Spring Boot Health indicator integration. + */ + @Test + public void testSpringBootMTLSWebApplication() throws Exception { + + Map properties = getDefaultMap(); + properties.put("server.ssl.client-auth", "need"); + properties.put("server.ssl.trust-store-type", "AzureKeyVault"); + + startAppRunner(properties); + + setMTLSRestTemplate(); + sendRequest(); + } + + public void sendRequest() { + final String response = restTemplate.getForObject( + "https://localhost:" + app.port() + "", String.class); + assertEquals(response, "Hello World"); + } + + private static class ClientPrivateKeyStrategy implements PrivateKeyStrategy { + @Override + public String chooseAlias(Map map, Socket socket) { + return "myalias"; // It should be your certificate alias used in client-side + } + } + +} diff --git a/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/PropertyConvertorUtils.java b/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/PropertyConvertorUtils.java new file mode 100644 index 0000000000000..45a33687476e5 --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/PropertyConvertorUtils.java @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.test.keyvault; + +import java.util.List; + +public class PropertyConvertorUtils { + + public static final String CERTIFICATE_PREFIX = "certificate_"; + + public static final String AZURE_KEYVAULT_URI = System.getenv("CERTIFICATE_AZURE_KEYVAULT_URI"); + public static final String SPRING_CLIENT_ID = System.getenv("CERTIFICATE_AZURE_KEYVAULT_CLIENT_ID"); + public static final String SPRING_CLIENT_SECRET = System.getenv("CERTIFICATE_AZURE_KEYVAULT_CLIENT_SECRET"); + public static final String SPRING_TENANT_ID = System.getenv("CERTIFICATE_AZURE_KEYVAULT_TENANT_ID"); + public static void putEnvironmentPropertyToSystemProperty(List key) { + key.forEach( + environmentPropertyKey -> { + String value = System.getenv(environmentPropertyKey); + String systemPropertyKey = environmentPropertyKey + .toLowerCase() + .replaceFirst(CERTIFICATE_PREFIX, "") + .replaceFirst("azure_keyvault_", "azure.keyvault.") + .replaceAll("_", "-"); + System.getProperties().put(systemPropertyKey, value); + } + ); + } +} diff --git a/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/app/DummyApp.java b/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/app/DummyApp.java new file mode 100644 index 0000000000000..f6bd21361970a --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-keyvault-certificate/src/test/java/com/azure/spring/test/keyvault/app/DummyApp.java @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.test.keyvault.app; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@SpringBootApplication +public class DummyApp { + + @GetMapping("/") + public String helloWorld() { + return "Hello World"; + } + +} diff --git a/sdk/spring/azure-spring-boot-test-keyvault-certificate/test-resources.json b/sdk/spring/azure-spring-boot-test-keyvault-certificate/test-resources.json new file mode 100644 index 0000000000000..ed27053c28670 --- /dev/null +++ b/sdk/spring/azure-spring-boot-test-keyvault-certificate/test-resources.json @@ -0,0 +1,316 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "baseName": { + "type": "String" + }, + "tenantId": { + "type": "String", + "defaultValue": "[subscription().tenantId]" + }, + "testApplicationOid": { + "type": "String" + }, + "endpointSuffix": { + "type": "String", + "defaultValue": "vault.azure.net" + }, + "testApplicationId": { + "type": "String" + }, + "testApplicationSecret": { + "type": "String" + }, + "enabledForDeployment": { + "type": "bool", + "defaultValue": false, + "allowedValues": [ + true, + false + ] + }, + "enabledForDiskEncryption": { + "type": "bool", + "defaultValue": false, + "allowedValues": [ + true, + false + ] + }, + "enabledForTemplateDeployment": { + "type": "bool", + "defaultValue": false, + "allowedValues": [ + true, + false + ] + }, + "skuName": { + "type": "string", + "defaultValue": "Standard", + "allowedValues": [ + "Standard", + "Premium" + ] + }, + "identityName": { + "type": "string", + "defaultValue": "identityForKeyVault" + }, + "certificateName": { + "type": "string", + "defaultValue": "myalias" + }, + "subjectName": { + "type": "string", + "defaultValue": "CN=contoso.com" + }, + "utcValue": { + "type": "string", + "defaultValue": "[utcNow()]" + } + }, + "variables": { + "keyVaultName": "[parameters('baseName')]", + "azureKeyVaultUrl": "[format('https://{0}.{1}/', parameters('baseName'), parameters('endpointSuffix'))]", + "bootstrapRoleAssignmentId": "[guid(concat(resourceGroup().id, 'contributor'))]", + "contributorRoleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]" + }, + "resources": [ + { + "type": "Microsoft.ManagedIdentity/userAssignedIdentities", + "apiVersion": "2018-11-30", + "name": "[parameters('identityName')]", + "location": "[resourceGroup().location]" + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2018-09-01-preview", + "name": "[variables('bootstrapRoleAssignmentId')]", + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identityName'))]" + ], + "properties": { + "roleDefinitionId": "[variables('contributorRoleDefinitionId')]", + "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identityName')), '2018-11-30').principalId]", + "scope": "[resourceGroup().id]", + "principalType": "ServicePrincipal" + } + }, + { + "type": "Microsoft.KeyVault/vaults", + "apiVersion": "2018-02-14", + "name": "[parameters('baseName')]", + "location": "[resourceGroup().location]", + "properties": { + "sku": { + "family": "A", + "name": "standard" + }, + "tenantId": "[parameters('tenantId')]", + "accessPolicies": [ + { + "tenantId": "[parameters('tenantId')]", + "objectId": "[parameters('testApplicationOid')]", + "permissions": { + "keys": [ + "backup", + "create", + "decrypt", + "delete", + "encrypt", + "get", + "import", + "list", + "purge", + "recover", + "restore", + "sign", + "unwrapKey", + "update", + "verify", + "wrapKey" + ], + "secrets": [ + "backup", + "delete", + "get", + "list", + "purge", + "recover", + "restore", + "set" + ], + "certificates": [ + "backup", + "create", + "delete", + "deleteissuers", + "get", + "getissuers", + "import", + "list", + "listissuers", + "managecontacts", + "manageissuers", + "purge", + "recover", + "restore", + "setissuers", + "update" + ] + } + }, + { + "objectId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identityName')), '2018-11-30').principalId]", + "tenantId": "[parameters('tenantId')]", + "permissions": { + "keys": [ + "backup", + "create", + "decrypt", + "delete", + "encrypt", + "get", + "import", + "list", + "purge", + "recover", + "restore", + "sign", + "unwrapKey", + "update", + "verify", + "wrapKey" + ], + "secrets": [ + "backup", + "delete", + "get", + "list", + "purge", + "recover", + "restore", + "set" + ], + "certificates": [ + "backup", + "create", + "delete", + "deleteissuers", + "get", + "getissuers", + "import", + "list", + "listissuers", + "managecontacts", + "manageissuers", + "purge", + "recover", + "restore", + "setissuers", + "update" + ] + } + } + ], + "enabledForDeployment": "[parameters('enabledForDeployment')]", + "enabledForDiskEncryption": "[parameters('enabledForDiskEncryption')]", + "enabledForTemplateDeployment": "[parameters('enabledForTemplateDeployment')]", + "enableSoftDelete": true, + "networkAcls": { + "defaultAction": "Allow", + "bypass": "AzureServices" + } + } + }, + { + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "createAddCertificate", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName'))]", + "[resourceId('Microsoft.Authorization/roleAssignments', variables('bootstrapRoleAssignmentId'))]" + ], + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identityName'))]": { + } + } + }, + "kind": "AzurePowerShell", + "properties": { + "forceUpdateTag": "[parameters('utcValue')]", + "azPowerShellVersion": "5.0", + "timeout": "PT30M", + "arguments": "[format(' -vaultName {0} -certificateName {1} -subjectName {2}', variables('keyVaultName'), parameters('certificateName'), parameters('subjectName'))]", + "scriptContent": " + param( + [string] [Parameter(Mandatory=$true)] $vaultName, + [string] [Parameter(Mandatory=$true)] $certificateName, + [string] [Parameter(Mandatory=$true)] $subjectName + ) + + $ErrorActionPreference = 'Stop' + $DeploymentScriptOutputs = @{} + + $policy = New-AzKeyVaultCertificatePolicy -SubjectName $subjectName -IssuerName Self -ValidityInMonths 12 -Verbose + + Add-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName -CertificatePolicy $policy -Verbose + + $newCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName + + $tries = 0 + do { + Write-Host 'Waiting for certificate creation completion...' + Start-Sleep -Seconds 10 + $operation = Get-AzKeyVaultCertificateOperation -VaultName $vaultName -Name $certificateName + $tries++ + + if ($operation.Status -eq 'failed') { + throw 'Creating certificate $certificateName in vault $vaultName failed with error $($operation.ErrorMessage)' + } + + if ($tries -gt 120) { + throw 'Timed out waiting for creation of certificate $certificateName in vault $vaultName' + } + } while ($operation.Status -ne 'completed') + + $DeploymentScriptOutputs['certThumbprint'] = $newCert.Thumbprint + $newCert | Out-String + ", + "cleanupPreference": "OnSuccess", + "retentionInterval": "P1D" + } + } + ], + "outputs": { + "CERTIFICATE_AZURE_KEYVAULT_ENDPOINT": { + "type": "string", + "value": "[variables('azureKeyVaultUrl')]" + }, + "CERTIFICATE_AZURE_KEYVAULT_URI": { + "type": "string", + "value": "[variables('azureKeyVaultUrl')]" + }, + "CERTIFICATE_AZURE_KEYVAULT_TENANT_ID": { + "type": "string", + "value": "[parameters('tenantId')]" + }, + "CERTIFICATE_AZURE_KEYVAULT_CLIENT_ID": { + "type": "string", + "value": "[parameters('testApplicationId')]" + }, + "CERTIFICATE_AZURE_KEYVAULT_CLIENT_SECRET": { + "type": "string", + "value": "[parameters('testApplicationSecret')]" + }, + "CERTIFICATE_AZURE_KEYVAULT_CERTIFICATE_NAME": { + "type": "string", + "value": "[parameters('certificateName')]" + } + } +} diff --git a/sdk/spring/pom.xml b/sdk/spring/pom.xml index 8e00410904444..be28c0c71e36b 100644 --- a/sdk/spring/pom.xml +++ b/sdk/spring/pom.xml @@ -136,33 +136,32 @@ azure-identity-spring + azure-spring-boot + azure-spring-boot-samples/azure-appconfiguration-conversion-sample-complete + azure-spring-boot-samples/azure-appconfiguration-conversion-sample-initial + azure-spring-boot-samples/azure-appconfiguration-sample azure-spring-boot-samples/azure-cloud-foundry-service-sample azure-spring-boot-samples/azure-spring-boot-sample-active-directory-b2c-oidc - azure-spring-boot-samples/azure-spring-boot-sample-active-directory-resource-server-by-filter-stateless + azure-spring-boot-samples/azure-spring-boot-sample-active-directory-resource-server azure-spring-boot-samples/azure-spring-boot-sample-active-directory-resource-server-by-filter + azure-spring-boot-samples/azure-spring-boot-sample-active-directory-resource-server-by-filter-stateless azure-spring-boot-samples/azure-spring-boot-sample-active-directory-resource-server-obo - azure-spring-boot-samples/azure-spring-boot-sample-active-directory-resource-server azure-spring-boot-samples/azure-spring-boot-sample-active-directory-webapp azure-spring-boot-samples/azure-spring-boot-sample-cosmos - azure-spring-boot-samples/azure-spring-boot-sample-keyvault-certificates-server-side + azure-spring-boot-samples/azure-spring-boot-sample-cosmos-multi-database-multi-account + azure-spring-boot-samples/azure-spring-boot-sample-cosmos-multi-database-single-account azure-spring-boot-samples/azure-spring-boot-sample-keyvault-certificates-client-side + azure-spring-boot-samples/azure-spring-boot-sample-keyvault-certificates-server-side azure-spring-boot-samples/azure-spring-boot-sample-keyvault-secrets azure-spring-boot-samples/azure-spring-boot-sample-mediaservices + azure-spring-boot-samples/azure-spring-boot-sample-servicebus azure-spring-boot-samples/azure-spring-boot-sample-servicebus-jms-queue azure-spring-boot-samples/azure-spring-boot-sample-servicebus-jms-topic - azure-spring-boot-samples/azure-spring-boot-sample-servicebus azure-spring-boot-samples/azure-spring-boot-sample-storage-resource azure-spring-boot-samples/azure-spring-cloud-sample-cache - azure-spring-boot-samples/azure-appconfiguration-conversion-sample-complete - azure-spring-boot-samples/azure-appconfiguration-conversion-sample-initial - azure-spring-boot-samples/azure-appconfiguration-sample azure-spring-boot-samples/azure-spring-cloud-sample-eventhubs-binder - azure-spring-boot-samples/azure-spring-boot-sample-cosmos-multi-database-multi-account - azure-spring-boot-samples/azure-spring-boot-sample-cosmos-multi-database-single-account azure-spring-boot-samples/azure-spring-cloud-sample-eventhubs-kafka azure-spring-boot-samples/azure-spring-cloud-sample-eventhubs-multibinders - azure-spring-boot-samples/feature-management-web-sample - azure-spring-boot-samples/feature-management-sample azure-spring-boot-samples/azure-spring-cloud-sample-eventhubs-operation azure-spring-boot-samples/azure-spring-cloud-sample-messaging-eventhubs azure-spring-boot-samples/azure-spring-cloud-sample-messaging-servicebus @@ -174,35 +173,37 @@ azure-spring-boot-samples/azure-spring-integration-sample-eventhubs azure-spring-boot-samples/azure-spring-integration-sample-servicebus azure-spring-boot-samples/azure-spring-integration-sample-storage-queue - azure-spring-boot-starter-active-directory-b2c + azure-spring-boot-samples/feature-management-sample + azure-spring-boot-samples/feature-management-web-sample + azure-spring-boot-starter azure-spring-boot-starter-active-directory + azure-spring-boot-starter-active-directory-b2c azure-spring-boot-starter-cosmos azure-spring-boot-starter-keyvault-certificates azure-spring-boot-starter-keyvault-secrets azure-spring-boot-starter-servicebus-jms azure-spring-boot-starter-storage - azure-spring-boot-starter + azure-spring-boot-test-aad + azure-spring-boot-test-aad-b2c azure-spring-boot-test-aad-obo - azure-spring-boot-test-aad-resource-server-by-filter azure-spring-boot-test-aad-resource-server - azure-spring-boot-test-aad + azure-spring-boot-test-aad-resource-server-by-filter azure-spring-boot-test-application - azure-spring-boot-test-aad-b2c - azure-spring-boot-test-selenium-common azure-spring-boot-test-core azure-spring-boot-test-cosmos - azure-spring-boot-test-keyvault/pom.xml + azure-spring-boot-test-keyvault-certificate azure-spring-boot-test-keyvault/pom-reactive.xml + azure-spring-boot-test-keyvault/pom.xml azure-spring-boot-test-parent + azure-spring-boot-test-selenium-common azure-spring-boot-test-servicebus-jms azure-spring-boot-test-storage - azure-spring-boot azure-spring-cloud-autoconfigure azure-spring-cloud-context azure-spring-cloud-messaging azure-spring-cloud-starter-cache - azure-spring-cloud-starter-eventhubs-kafka azure-spring-cloud-starter-eventhubs + azure-spring-cloud-starter-eventhubs-kafka azure-spring-cloud-starter-servicebus azure-spring-cloud-starter-storage-queue azure-spring-cloud-storage diff --git a/sdk/spring/spring-test-template.yml b/sdk/spring/spring-test-template.yml index 486ea71bef354..2a2889a226e12 100644 --- a/sdk/spring/spring-test-template.yml +++ b/sdk/spring/spring-test-template.yml @@ -5,6 +5,7 @@ parameters: TestResourceDirectories: - spring/azure-spring-boot-test-cosmos - spring/azure-spring-boot-test-keyvault + - spring/azure-spring-boot-test-keyvault-certificate - spring/azure-spring-boot-test-servicebus-jms - spring/azure-spring-boot-test-storage - spring/azure-spring-cloud-test-eventhubs @@ -39,6 +40,9 @@ parameters: - name: azure-spring-boot-test-keyvault groupId: com.azure.spring safeName: azurespringboottestkeyvault + - name: azure-spring-boot-test-keyvault-certificate + groupId: com.azure.spring + safeName: azurespringboottestkeyvaultcertificate - name: azure-spring-boot-test-keyvault-reactive groupId: com.azure.spring safeName: azurespringboottestkeyvaultreactive