== Azure Functions with Blob Trigger

IMPORTANT: For a general information about building and deploying `Azure Functions` with Spring Cloud Function, consult the https://docs.spring.io/spring-cloud-function/docs/current/reference/html/azure.html[Azure Adapter] documentation.

The Blob storage trigger starts a function when a new or updated blob is detected. The blob contents are provided as https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-input?tabs=in-process%2Cextensionv5&pivots=programming-language-java[input] to the function.

The Blob storage binding is part of an https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-register#extension-bundles[extension bundle], specified in your https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob?tabs=in-process%2Cextensionv5%2Cextensionv3&pivots=programming-language-java#install-bundle[host.json] file.


=== Usage

For local Azure Storage development you need https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio[Azurite emulator].
For the emulator you can run a docker container (see below) or use the https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio-code[Visual-Studio-Code extension].

Here is how to start the `Azure emulator` as docker container:

[source,shell]
----
docker run --name azurite --rm -p 10000:10000 -p 10001:10001 -p 10002:10002 mcr.microsoft.com/azure-storage/azurite
----

==== Package Staging folder

Use the script below to package your staging folder:

[source,shell]
----
./mvnw clean package
----

==== Run Azure Functions locally

Use the script below to run the function locally.

[source,shell]
----
./mvnw azure-functions:run
----

Use the https://azure.microsoft.com/en-us/products/storage/storage-explorer/[Azure Storage Explorer] to access the Emulator Storage Account.

Under the `Blob Containers` create 3 new containers: `test-trigger`, `test-input`, `test-output`.
Then upload the `src/test/resource/sample.txt` file into the `test-input` and the `test-trigger` folders in this order.

The appearance of the `sample.txt` file in the `test-trigger` folder triggers the `blobTest` function handler, that would look up for a file with the same name (because we used the `{name}` convention in the @BlobInput path) from the `test-input` folder.
Later is passed through the auto-wired `uppercase` service and the result is saved in the `test-output` folder.
Verify that the newly created file in `test-output` is in capitalized letters.


==== Deploy Azure Functions to Azure Cloud

Make sure you are logged in your Azure account.

[source,shell]
----
az login
----

then build and deploy

[source,shell]
----
./mvnw clean package
./mvnw azure-functions:deploy
----


==== Debug locally

Run the function in debug mode.

[source,shell]
----
./mvnw azure-functions:run -DenableDebug
----

Alternatively and the `JAVA_OPTS` value to your `local.settings.json` like this:

[source,json]
----
{
	"IsEncrypted": false,
	"Values": {
		...
		"FUNCTIONS_WORKER_RUNTIME": "java",
		"JAVA_OPTS": "-Djava.net.preferIPv4Stack=true -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=127.0.0.1:5005"
	}
}
----


For VSCode remote debug use configuration like this:

[source,json]
----
{
	"version": "0.2.0",
	"configurations": [
		{
			"type": "java",
			"name": "Attach to Remote Program",
			"request": "attach",
			"hostName": "localhost",
			"port": "5005"
		},
	    ...
	]
}
----