diff --git a/eng/versioning/external_dependencies.txt b/eng/versioning/external_dependencies.txt index 68ed062a2934..d5cf92ede1a0 100644 --- a/eng/versioning/external_dependencies.txt +++ b/eng/versioning/external_dependencies.txt @@ -2,7 +2,7 @@ # make sure the version is same to sdk/spring/scripts/spring_boot_2.7.18_managed_external_dependencies.txt # If your version is different from sdk/spring/scripts/spring_boot_2.7.18_managed_external_dependencies.txt, # please discuss with Spring Integration team members: -# @rujche (rujche), @saragluna (xiada), @yiliuTo (yiliu6), @backwind1233 (zhihaoguo). +# @rujche (rujche), @saragluna (xiada). # Thanks. # Format; @@ -505,6 +505,7 @@ springboot3_org.springframework.boot:spring-boot-autoconfigure;3.3.3 springboot3_org.springframework.boot:spring-boot-configuration-metadata;3.3.3 springboot3_org.springframework.boot:spring-boot-configuration-processor;3.3.3 springboot3_org.springframework.boot:spring-boot-dependencies;3.3.3 +springboot3_org.springframework.boot:spring-boot-docker-compose;3.3.3 springboot3_org.springframework.boot:spring-boot-starter-actuator;3.3.3 springboot3_org.springframework.boot:spring-boot-starter-integration;3.3.3 springboot3_org.springframework.boot:spring-boot-starter-parent;3.3.3 diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 1db80605f0e6..487a61de9add 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -228,6 +228,7 @@ com.azure.spring:spring-cloud-azure-core;5.15.0;5.16.0-beta.1 com.azure.spring:spring-cloud-azure-actuator-autoconfigure;5.15.0;5.16.0-beta.1 com.azure.spring:spring-cloud-azure-actuator;5.15.0;5.16.0-beta.1 com.azure.spring:spring-cloud-azure-autoconfigure;5.15.0;5.16.0-beta.1 +com.azure.spring:spring-cloud-azure-docker-compose;5.16.0-beta.1;5.16.0-beta.1 com.azure.spring:spring-cloud-azure-resourcemanager;5.15.0;5.16.0-beta.1 com.azure.spring:spring-cloud-azure-service;5.15.0;5.16.0-beta.1 com.azure.spring:spring-cloud-azure-starter-active-directory;5.15.0;5.16.0-beta.1 diff --git a/sdk/boms/spring-cloud-azure-dependencies/pom.xml b/sdk/boms/spring-cloud-azure-dependencies/pom.xml index bcdff7af8390..e15ef26cb87f 100644 --- a/sdk/boms/spring-cloud-azure-dependencies/pom.xml +++ b/sdk/boms/spring-cloud-azure-dependencies/pom.xml @@ -321,6 +321,11 @@ spring-cloud-azure-starter-jdbc-postgresql ${project.version} + + com.azure.spring + spring-cloud-azure-docker-compose + ${project.version} + com.azure.spring spring-cloud-azure-testcontainers diff --git a/sdk/spring/CHANGELOG.md b/sdk/spring/CHANGELOG.md index 1bc4e48e28fe..1c402003e725 100644 --- a/sdk/spring/CHANGELOG.md +++ b/sdk/spring/CHANGELOG.md @@ -11,6 +11,7 @@ Upgrade Spring Boot dependencies version to 3.3.3 and Spring Cloud dependencies #### Dependency Updates - Upgrade `azure-sdk-bom` to 1.2.26. - Added a new dependency: `spring-cloud-azure-testcontainers`. +- Added a new dependency: `spring-cloud-azure-docker-compose`. ### Spring Cloud Azure Autoconfigure This section includes changes in `spring-cloud-azure-autoconfigure` module. diff --git a/sdk/spring/pom.xml b/sdk/spring/pom.xml index 918cd246b624..c04281714cde 100644 --- a/sdk/spring/pom.xml +++ b/sdk/spring/pom.xml @@ -60,6 +60,7 @@ spring-cloud-azure-starter-jdbc-mysql spring-cloud-azure-starter-jdbc-postgresql spring-cloud-azure-testcontainers + spring-cloud-azure-docker-compose spring-cloud-azure-integration-tests spring-cloud-azure-integration-test-appconfiguration-config spring-cloud-azure-appconfiguration-config @@ -123,6 +124,7 @@ spring-cloud-azure-starter-jdbc-mysql spring-cloud-azure-starter-jdbc-postgresql spring-cloud-azure-testcontainers + spring-cloud-azure-docker-compose spring-cloud-azure-integration-test-appconfiguration-config spring-cloud-azure-appconfiguration-config spring-cloud-azure-appconfiguration-config-web diff --git a/sdk/spring/spring-cloud-azure-docker-compose/CHANGELOG.md b/sdk/spring/spring-cloud-azure-docker-compose/CHANGELOG.md new file mode 100644 index 000000000000..ada153dfb495 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/CHANGELOG.md @@ -0,0 +1,11 @@ +# Release History + +## 5.15.0-beta.1 (Unreleased) + +### Features Added + +### Breaking Changes + +### Bugs Fixed + +### Other Changes diff --git a/sdk/spring/spring-cloud-azure-docker-compose/README.md b/sdk/spring/spring-cloud-azure-docker-compose/README.md new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml new file mode 100644 index 000000000000..8307de727d04 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml @@ -0,0 +1,194 @@ + + + + com.azure + azure-client-sdk-parent + 1.7.0 + ../../parents/azure-client-sdk-parent + + 4.0.0 + + com.azure.spring + spring-cloud-azure-docker-compose + 5.16.0-beta.1 + + Spring Cloud Azure Docker Compose + Spring Cloud Azure Docker Compose + https://microsoft.github.io/spring-cloud-azure + + + Spring Cloud Azure + SpringIntegSupport@microsoft.com + + + + scm:git:git@github.com:Azure/azure-sdk-for-java.git + scm:git:ssh://git@github.com:Azure/azure-sdk-for-java.git + https://github.com/Azure/azure-sdk-for-java + + + GitHub + https://github.com/Azure/azure-sdk-for-java/issues + + + + + true + + + + com.azure.spring + spring-cloud-azure-autoconfigure + 5.16.0-beta.1 + true + + + com.azure + azure-storage-blob + 12.27.1 + true + + + com.azure + azure-storage-queue + 12.22.1 + true + + + + org.springframework.boot + spring-boot-docker-compose + 3.3.3 + + + + com.google.code.findbugs + jsr305 + 3.0.2 + provided + + + + org.springframework.boot + spring-boot-test + 3.3.3 + test + + + org.springframework + spring-test + 6.1.12 + test + + + org.junit.jupiter + junit-jupiter + 5.10.3 + test + + + org.assertj + assertj-core + 3.25.3 + test + + + + + + + com.github.spotbugs + spotbugs-maven-plugin + 4.8.2.0 + + true + + + + com.diffplug.spotless + spotless-maven-plugin + 2.30.0 + + true + + + + org.revapi + revapi-maven-plugin + 0.14.6 + + true + + + + com.azure.tools + codesnippet-maven-plugin + 1.0.0-beta.10 + + true + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + + base-modules-compile + none + + + + base-compile + none + + + + base-testCompile + none + + + + + compile + + + 17 + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + + + org.springframework.boot:spring-boot-docker-compose:[3.3.3] + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + + com.azure.spring.cloud.docker.compose + + + + + + + diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactory.java new file mode 100644 index 000000000000..47033724a117 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactory.java @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.docker.compose.implementation.service.connection.storage; + +import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.properties.AzureStorageBlobConnectionDetails; +import org.springframework.boot.docker.compose.core.RunningService; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; + +class StorageBlobDockerComposeConnectionDetailsFactory + extends DockerComposeConnectionDetailsFactory { + + private static final int STORAGE_BLOB_PORT = 10_000; + + protected StorageBlobDockerComposeConnectionDetailsFactory() { + super("azure-storage/azurite"); + } + + @Override + protected AzureStorageBlobConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { + return new StorageBlobContainerConnectionDetails(source.getRunningService()); + } + + /** + * {@link AzureStorageBlobConnectionDetails} backed by a {@code Storage Blob} + * {@link RunningService}. + */ + private static class StorageBlobContainerConnectionDetails extends DockerComposeConnectionDetails + implements AzureStorageBlobConnectionDetails { + + private final String host; + + private final int port; + + StorageBlobContainerConnectionDetails(RunningService service) { + super(service); + this.host = service.host(); + this.port = service.ports().get(STORAGE_BLOB_PORT); + } + + @Override + public String getConnectionString() { + return "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://%s:%d/devstoreaccount1;" + .formatted(this.host, this.port); + } + } +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactory.java new file mode 100644 index 000000000000..a06cf0783db4 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactory.java @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.docker.compose.implementation.service.connection.storage; + +import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.properties.AzureStorageBlobConnectionDetails; +import com.azure.spring.cloud.autoconfigure.implementation.storage.queue.properties.AzureStorageQueueConnectionDetails; +import org.springframework.boot.docker.compose.core.RunningService; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; + +class StorageQueueDockerComposeConnectionDetailsFactory + extends DockerComposeConnectionDetailsFactory { + + private static final int STORAGE_QUEUE_PORT = 10_001; + + protected StorageQueueDockerComposeConnectionDetailsFactory() { + super("azure-storage/azurite"); + } + + @Override + protected AzureStorageQueueConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { + return new StorageQueueContainerConnectionDetails(source.getRunningService()); + } + + /** + * {@link AzureStorageBlobConnectionDetails} backed by a {@code Storage Queue} + * {@link RunningService}. + */ + private static class StorageQueueContainerConnectionDetails extends DockerComposeConnectionDetails + implements AzureStorageQueueConnectionDetails { + + private final String host; + + private final int port; + + StorageQueueContainerConnectionDetails(RunningService service) { + super(service); + this.host = service.host(); + this.port = service.ports().get(STORAGE_QUEUE_PORT); + } + + @Override + public String getConnectionString() { + return "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;QueueEndpoint=http://%s:%d/devstoreaccount1;" + .formatted(this.host, this.port); + } + + @Override + public String getEndpoint() { + return "http://%s:%d".formatted(this.host, this.port); + } + } +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories b/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000000..17b7623a3151 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ +com.azure.spring.cloud.docker.compose.implementation.service.connection.storage.StorageBlobDockerComposeConnectionDetailsFactory,\ +com.azure.spring.cloud.docker.compose.implementation.service.connection.storage.StorageQueueDockerComposeConnectionDetailsFactory diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactoryTests.java new file mode 100644 index 000000000000..6ffcea861b39 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageBlobDockerComposeConnectionDetailsFactoryTests.java @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.docker.compose.implementation.service.connection.storage; + +import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.AzureStorageBlobAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.storage.blob.AzureStorageBlobResourceAutoConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.Resource; +import org.springframework.core.io.WritableResource; +import org.springframework.util.StreamUtils; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.Charset; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(properties = { + "spring.docker.compose.skip.in-tests=false", + "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/storage-compose.yaml", + "spring.docker.compose.stop.command=down" +}) +class StorageBlobDockerComposeConnectionDetailsFactoryTests { + + @Value("azure-blob://testcontainers/message.txt") + private Resource blobFile; + + @Test + void test() throws IOException { + String originalContent = "Hello World!"; + try (OutputStream os = ((WritableResource) this.blobFile).getOutputStream()) { + os.write(originalContent.getBytes()); + } + String resultContent = StreamUtils.copyToString(this.blobFile.getInputStream(), Charset.defaultCharset()); + assertThat(resultContent).isEqualTo(originalContent); + } + + @Configuration(proxyBeanMethods = false) + @ImportAutoConfiguration(classes = { + AzureGlobalPropertiesAutoConfiguration.class, + AzureStorageBlobAutoConfiguration.class, + AzureStorageBlobResourceAutoConfiguration.class}) + static class Config { + } +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactoryTests.java new file mode 100644 index 000000000000..688a8b7a55fc --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/StorageQueueDockerComposeConnectionDetailsFactoryTests.java @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.docker.compose.implementation.service.connection.storage; + +import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.storage.queue.AzureStorageQueueAutoConfiguration; +import com.azure.storage.queue.QueueClient; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(properties = { + "spring.docker.compose.skip.in-tests=false", + "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/storage-compose.yaml", + "spring.docker.compose.stop.command=down", + "spring.cloud.azure.storage.queue.queue-name=devstoreaccount1/tc-queue" +}) +class StorageQueueDockerComposeConnectionDetailsFactoryTests { + + @Autowired + private QueueClient queueClient; + + @Test + void test() { + String message = "Hello World!"; + this.queueClient.create(); + this.queueClient.sendMessage(message); + var messageItem = this.queueClient.receiveMessage(); + assertThat(messageItem.getBody().toString()).isEqualTo(message); + } + + @Configuration + @ImportAutoConfiguration(classes = { + AzureGlobalPropertiesAutoConfiguration.class, + AzureStorageQueueAutoConfiguration.class}) + static class Config { + } + +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/storage-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/storage-compose.yaml new file mode 100644 index 000000000000..576244a197ef --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/storage/storage-compose.yaml @@ -0,0 +1,7 @@ +services: + storage: + image: mcr.microsoft.com/azure-storage/azurite:latest + ports: + - '10000' + - '10001' + command: azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactory.java index 3b84eb44d176..c16f86894541 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactory.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageBlobContainerConnectionDetailsFactory.java @@ -11,7 +11,7 @@ class StorageBlobContainerConnectionDetailsFactory extends ContainerConnectionDetailsFactory, AzureStorageBlobConnectionDetails> { - private static final int STORAGE_BLOB_PORT = 10000; + private static final int STORAGE_BLOB_PORT = 10_000; StorageBlobContainerConnectionDetailsFactory() { super("azure-storage/azurite"); diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactory.java index 1030e3910755..f0e764dc1da8 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactory.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/storage/StorageQueueContainerConnectionDetailsFactory.java @@ -12,7 +12,7 @@ class StorageQueueContainerConnectionDetailsFactory extends ContainerConnectionDetailsFactory, AzureStorageQueueConnectionDetails> { - private static final int STORAGE_QUEUE_PORT = 10001; + private static final int STORAGE_QUEUE_PORT = 10_001; StorageQueueContainerConnectionDetailsFactory() { super("azure-storage/azurite");