From c2874ed360975ec0eedc2f86bfd8bae5dd95d291 Mon Sep 17 00:00:00 2001 From: Caihua Rui Date: Thu, 10 Jun 2021 10:47:54 +0800 Subject: [PATCH] Add byoc samples in Azure Spring Cloud Samples --- .../Dockerfile | 6 +++ .../README.md | 50 ++++++++++++++++++ .../identity.js | 37 ++++++++++++++ .../package.json | 17 +++++++ .../server.js | 33 ++++++++++++ .../Dockerfile | 10 ++++ .../README.md | 50 ++++++++++++++++++ .../identity.py | 26 ++++++++++ .../indentityconfig.py | 4 ++ .../requirements.txt | 4 ++ .../server.py | 20 ++++++++ .../Dockerfile | 5 ++ .../README.md | 38 ++++++++++++++ .../mongo.js | 34 +++++++++++++ .../package.json | 16 ++++++ .../server.js | 29 +++++++++++ .../Dockerfile | 5 ++ .../README.md | 38 ++++++++++++++ .../cosmosSql.js | 35 +++++++++++++ .../package.json | 16 ++++++ .../server.js | 29 +++++++++++ .../Dockerfile | 5 ++ .../byoc-service-binding-mysql-node/README.md | 38 ++++++++++++++ .../byoc-service-binding-mysql-node/mysql.js | 51 +++++++++++++++++++ .../package.json | 16 ++++++ .../byoc-service-binding-mysql-node/server.js | 29 +++++++++++ .../Dockerfile | 5 ++ .../byoc-service-binding-redis-node/README.md | 38 ++++++++++++++ .../package.json | 17 +++++++ .../byoc-service-binding-redis-node/redis.js | 33 ++++++++++++ .../byoc-service-binding-redis-node/server.js | 23 +++++++++ .../Dockerfile | 10 ++++ .../README.md | 38 ++++++++++++++ .../mongo.py | 14 +++++ .../requirements.txt | 3 ++ .../server.py | 23 +++++++++ .../Dockerfile | 10 ++++ .../README.md | 38 ++++++++++++++ .../cosmosSql.py | 44 ++++++++++++++++ .../requirements.txt | 3 ++ .../server.py | 23 +++++++++ .../Dockerfile | 10 ++++ .../README.md | 38 ++++++++++++++ .../mysqlConnector.py | 43 ++++++++++++++++ .../requirements.txt | 3 ++ .../server.py | 23 +++++++++ .../Dockerfile | 10 ++++ .../README.md | 40 +++++++++++++++ .../redisTemplate.py | 12 +++++ .../requirements.txt | 3 ++ .../server.py | 16 ++++++ 51 files changed, 1161 insertions(+) create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/Dockerfile create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/README.md create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/identity.js create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/package.json create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/server.js create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/Dockerfile create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/README.md create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/identity.py create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/indentityconfig.py create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/requirements.txt create mode 100644 byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/server.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/mongo.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/package.json create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/server.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/cosmosSql.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/package.json create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/server.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/mysql.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/package.json create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/server.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/package.json create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/redis.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/server.js create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/mongo.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/requirements.txt create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/server.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/cosmosSql.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/requirements.txt create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/server.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/mysqlConnector.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/requirements.txt create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/server.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/Dockerfile create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/README.md create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/redisTemplate.py create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/requirements.txt create mode 100644 byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/server.py diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/Dockerfile b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/Dockerfile new file mode 100644 index 0000000..1c8caab --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/Dockerfile @@ -0,0 +1,6 @@ +FROM node:15-alpine +ENV AZURE_KEYVAULT_URI https://.vault.azure.net/ + +COPY . /src +RUN cd /src && npm install +CMD ["node", "/src/server.js"] diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/README.md b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/README.md new file mode 100644 index 0000000..37b4c53 --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/README.md @@ -0,0 +1,50 @@ +# Access Key Vault with managed identity in a Node.js app container + +This sample shows how to access Key Vault with managed identity in `Azure Spring Cloud`'s apps written in Node.js and deployed with custom container. + +You need to import [ManagedIdentityCredential](https://docs.microsoft.com/en-us/javascript/api/@azure/identity/managedidentitycredential?view=azure-node-latest) and [SecretClient](https://docs.microsoft.com/en-us/javascript/api/@azure/keyvault-secrets/secretclient?view=azure-node-latest) in your code. In this sample project, you could refer to [identity.js](identity.js). + +## Prerequisite + +* [Docker](https://www.docker.com/products/container-runtime) +* [Nodejs](https://nodejs.org/en/) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) +* An existing Key Vault. If you need to create a Key Vault, you can use the [Azure Portal](https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-portal) or [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/keyvault?view=azure-cli-latest#az-keyvault-create) + +## How to run + +1. Specify the URI of your Key Vault in [Dockerfile](Dockerfile). +2. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +3. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +4. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +5. Enable system-assigned managed identity for your app and take note of the principal id from the command output. + ``` + az spring-cloud app identity assign -n -s -g + ``` +6. Grant permission of Key Vault to the system-assigned managed identity. + ``` + az keyvault set-policy -n keyvault_name -g resource_group_of_keyvault --secret-permissions get set --object-id + ``` +7. Deploy the app written in Node.js with your custom container. + +8. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` +9. Verify sample is working. The url is fetched from previous step. + ``` + # Create a secret in Key Vault + curl -X PUT {url}/secrets/{secret-name}?value={value} + + # Get the value of secret-name you just created before + curl {url}/secrets/{secret-name} + ``` \ No newline at end of file diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/identity.js b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/identity.js new file mode 100644 index 0000000..fddf647 --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/identity.js @@ -0,0 +1,37 @@ +const { SecretClient } = require("@azure/keyvault-secrets"); +const { ManagedIdentityCredential } = require("@azure/identity"); +const util = require('util'); + +const credential = new ManagedIdentityCredential() + +const url = process.env.AZURE_KEYVAULT_URI; +console.log("About to connect to: ", url); +const client = new SecretClient(url, credential); + +async function getSecret(name) { + console.log("About to get secret: " + name); + try { + var secret = await client.getSecret(name); + return util.format("Successfully got the value of secret %s from Key Vault %s: %s", + name, url, secret.value); + } catch (err) { + console.log(err) + return util.format("Failed to get secret %s from Key Vault %s due to %s", name, + url, err.message); + } +} + +async function setSecret(name, value) { + console.log(util.format("About to set secret: (%s, %s)"), name, value); + + try { + await client.setSecret(name, value); + return util.format("Successfully set secret %s in Key Vault %s", name, url); + } catch (err) { + console.log(err) + return util.format("Failed to set secret %s in Key Vault %s due to %s", name, + url, err.message); + } +} + +module.exports = {getSecret, setSecret}; \ No newline at end of file diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/package.json b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/package.json new file mode 100644 index 0000000..5522002 --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/package.json @@ -0,0 +1,17 @@ +{ + "name": "byoc-managed-identity-keyvault-node-sample", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "@azure/identity": "^1.3.0", + "@azure/keyvault-secrets": "^4.1.0", + "express": "^4.17.1" + } +} diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/server.js b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/server.js new file mode 100644 index 0000000..585f8e9 --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-node/server.js @@ -0,0 +1,33 @@ +var identity = require('./identity.js') + +const http = require('http') +const port = 1025 + +const express = require('express'); +var app = express(); + +app.get('/secrets/:name', async (req, res) => { + try { + const result = await identity.getSecret(req.params.name).then((value) => { + res.send(value); + }) + } catch (err) { + console.log(err) + } +}) + +app.put('/secrets/:name', async (req, res) => { + try { + const result = await identity.setSecret(req.params.name, req.query.value).then((value) => { + res.send(value); + }) + } catch (err) { + console.log(err) + } +}) + +var server = app.listen(port, function () { + var host = server.address().address + var port = server.address().port + console.log("Example app listening at http://%s:%s", host, port) +}) diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/Dockerfile b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/Dockerfile new file mode 100644 index 0000000..67ea831 --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.8 + +WORKDIR /code + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . + +CMD [ "gunicorn", "--bind", "0.0.0.0:1025", "server:app" ] \ No newline at end of file diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/README.md b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/README.md new file mode 100644 index 0000000..fed31fd --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/README.md @@ -0,0 +1,50 @@ +# Access Key Vault with managed identity in a Python app container + +This sample shows how to access Key Vault with managed identity in `Azure Spring Cloud`'s apps written in Python and deployed with custom container. + +You need to import [ManagedIdentityCredential](https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.managedidentitycredential?view=azure-python) and [SecretClient](https://docs.microsoft.com/en-us/python/api/azure-keyvault-secrets/azure.keyvault.secrets.secretclient?view=azure-python) in your code. In this sample project, you could refer to [identity.py](identity.py). + +## Prerequisite + +* Python & [Python extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python) +* [Docker](https://www.docker.com/products/container-runtime) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) +* An existing Key Vault. If you need to create a Key Vault, you can use the [Azure Portal](https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-portal) or [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/keyvault?view=azure-cli-latest#az-keyvault-create) + +## How to run + +1. Specify the URI of your Key Vault in [identityconfg.py](indentityconfig.py). +2. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +3. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +4. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +5. Enable system-assigned managed identity for your app and take note of the principal id from the command output. + ``` + az spring-cloud app identity assign -n -s -g + ``` +6. Grant permission of Key Vault to the system-assigned managed identity. + ``` + az keyvault set-policy -n keyvault_name -g resource_group_of_keyvault --secret-permissions get set --object-id + ``` +7. Deploy the app written in Python with your custom container. + +8. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` +9. Verify sample is working. The url is fetched from previous step. + ``` + # Create a secret in Key Vault + curl -X PUT {url}/secrets/{secret-name}?value={value} + + # Get the value of secret-name you just created before + curl {url}/secrets/{secret-name} + ``` \ No newline at end of file diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/identity.py b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/identity.py new file mode 100644 index 0000000..32e43ac --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/identity.py @@ -0,0 +1,26 @@ +from azure.identity import ManagedIdentityCredential +from azure.keyvault.secrets import SecretClient +import indentityconfig as cfg + +credential = ManagedIdentityCredential() +keyVaultUrl = cfg.key_vault["vault_url"] +print("About to connect to: ", keyVaultUrl) +client = SecretClient(keyVaultUrl, credential, logging_enable=True) + +def getSecret(name): + try: + print("About to get secret: " + name) + secret = client.get_secret(name) + return "Successfully got the value of secret {} from Key Vault {}: {}".format(name, keyVaultUrl, secret.value) + except Exception as e: + print(e) + return "Failed to get secret {} from Key Vault {} due to {}".format(name, keyVaultUrl, e.__str__()) + +def setSecret(name, value): + try: + print("About to set secret: ({}, {})".format(name, value)) + secret = client.set_secret(name, value) + return "Successfully got the value of secret {} from Key Vault {}: {}".format(name, keyVaultUrl, secret.value) + except Exception as e: + print(e) + return "Failed to set secret {} in Key Vault {} due to {}".format(name, keyVaultUrl, e.__str__()) \ No newline at end of file diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/indentityconfig.py b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/indentityconfig.py new file mode 100644 index 0000000..bdffe25 --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/indentityconfig.py @@ -0,0 +1,4 @@ +key_vault = { + # Specify the URI of your Key Vault (e.g.: https://name.vault.azure.net/) + "vault_url": "https://.vault.azure.net/" +} \ No newline at end of file diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/requirements.txt b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/requirements.txt new file mode 100644 index 0000000..2af084d --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/requirements.txt @@ -0,0 +1,4 @@ +Flask==1.1.1 +azure-keyvault-secrets +azure-identity +gunicorn \ No newline at end of file diff --git a/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/server.py b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/server.py new file mode 100644 index 0000000..401b15d --- /dev/null +++ b/byoc-samples/byoc-managed-identity-keyvault/byoc-managed-identity-keyvault-python/server.py @@ -0,0 +1,20 @@ +from flask import Flask, request +import identity as identity + +app = Flask(__name__) + +@app.route("/secrets/", methods = ['PUT', 'GET']) +def secret(name): + try: + if request.method == 'GET': + return identity.getSecret(name) + else : + value = request.args['value'] + return identity.setSecret(name, value) + except Exception as e: + print(e) + return e.__str__() + + +if __name__ == "__main__": + app.run(port = 1025) \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/Dockerfile new file mode 100644 index 0000000..3a6cc27 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/Dockerfile @@ -0,0 +1,5 @@ +FROM node:15-alpine + +COPY . /src +RUN cd /src && npm install +CMD ["node", "/src/server.js"] diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/README.md new file mode 100644 index 0000000..20e526c --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/README.md @@ -0,0 +1,38 @@ +# Binding your app with Azure COSMOS Mongo API + +This sample shows how to run Node.js apps with Azure Cosmos DB(Mongo) in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* [Docker](https://www.docker.com/products/container-runtime) +* [Nodejs](https://nodejs.org/en/) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Node.js with your custom container. + +1. Add a binding of Azure Cosmos for this app. + ``` + az spring-cloud app binding cosmos add --api-type mongo --app -s -g -n cosmos --resource-id --database-name + ``` +1. Restart the app. + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/mongo.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/mongo.js new file mode 100644 index 0000000..fbce320 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/mongo.js @@ -0,0 +1,34 @@ +const mongoose = require('mongoose'); + +mongoose.connect(process.env.SPRING_DATA_MONGODB_URI, {useNewUrlParser: true}) + +mongoose.connection.on("error", function(error) { + console.log(error) +}) + +mongoose.connection.on("open", function() { + console.log("Connected to MongoDB database.") +}) + +const userSchema = new mongoose.Schema({ + name: String +}); +const User = mongoose.model('User', userSchema); + +function all(res){ + User.find(function (err, users) { + if (err) return console.error(err); + console.log(users); + res.send(users) + }) +} + +function add(name){ + var myObj = new User({ name: name }); + console.log(myObj); + myObj.save(function (err) { + if (err) return console.error(err); + }); +} + +module.exports = { all, add } \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/package.json b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/package.json new file mode 100644 index 0000000..0bef387 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/package.json @@ -0,0 +1,16 @@ +{ + "name": "byoc-service-binding-cosmosdb-mongo-node-sample", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "express": "^4.17.1", + "mongoose": "^5.12.14" + } +} diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/server.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/server.js new file mode 100644 index 0000000..de10037 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-mongo-node/server.js @@ -0,0 +1,29 @@ +const data = require('./mongo.js') + +const http = require('http') +const port = 1025 + +const express = require('express'); +var app = express(); + +app.get('/all', (req, res) => { + try { + data.all(res); + } catch (err) { + console.log(err) + } +}) + +app.post('/add', (req, res) => { + try { + res.send(data.add(req.query.name)) + } catch (err) { + console.log(err) + } +}) + +var server = app.listen(port, function () { + var host = server.address().address + var port = server.address().port + console.log("Example app listening at http://%s:%s", host, port) +}) diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/Dockerfile new file mode 100644 index 0000000..3a6cc27 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/Dockerfile @@ -0,0 +1,5 @@ +FROM node:15-alpine + +COPY . /src +RUN cd /src && npm install +CMD ["node", "/src/server.js"] diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/README.md new file mode 100644 index 0000000..3643fdd --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/README.md @@ -0,0 +1,38 @@ +# Bind your app with Azure COSMOS SQL API + +This sample shows how to run Node.js apps with Azure Cosmos DB(SQL) in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* [Docker](https://www.docker.com/products/container-runtime) +* [Nodejs](https://nodejs.org/en/) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Node.js with your custom container. + +1. Add a binding for this app + ``` + az spring-cloud app binding cosmos add --api-type sql --app -s -g -n cosmos --resource-id --database-name + ``` +1. Restart the app + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/cosmosSql.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/cosmosSql.js new file mode 100644 index 0000000..9b3c5b4 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/cosmosSql.js @@ -0,0 +1,35 @@ +const CosmosClient = require("@azure/cosmos").CosmosClient; + +endpoint = process.env.AZURE_COSMOSDB_URI +key = process.env.AZURE_COSMOSDB_KEY +databaseId = process.env.AZURE_COSMOSDB_DATABASE + +containerId = 'mycollection' + +const client = new CosmosClient({ endpoint, key }); +// Make sure Tasks database is already setup. If not, create it. +const database = client.database(databaseId); +const container = database.container(containerId); + +// query to return all items +const querySpec = { + query: "SELECT * from c" +}; + +async function all(res){ + // read all items in the Items container + const { resources: items } = await container.items.query(querySpec).fetchAll(); + console.log(items); + res.send(items) +}; + +async function add(name){ + const newItem = { + id: console.timeStamp(), + name: name + }; + + await container.items.create(newItem); +} + +module.exports = { all, add } \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/package.json b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/package.json new file mode 100644 index 0000000..6c32da5 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/package.json @@ -0,0 +1,16 @@ +{ + "name": "byoc-service-binding-cosmosdb-sql-node-sample", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "@azure/cosmos": "^3.11.5", + "express": "^4.17.1" + } +} diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/server.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/server.js new file mode 100644 index 0000000..e2b2136 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-cosmosdb-sql-node/server.js @@ -0,0 +1,29 @@ +const data = require('./cosmosSql.js') + +const http = require('http') +const port = 1025 + +const express = require('express'); +var app = express(); + +app.get('/all', (req, res) => { + try { + data.all(res); + } catch (err) { + console.log(err) + } +}) + +app.post('/add', (req, res) => { + try { + res.send(data.add(req.query.name)) + } catch (err) { + console.log(err) + } +}) + +var server = app.listen(port, function () { + var host = server.address().address + var port = server.address().port + console.log("Example app listening at http://%s:%s", host, port) +}) diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/Dockerfile new file mode 100644 index 0000000..3a6cc27 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/Dockerfile @@ -0,0 +1,5 @@ +FROM node:15-alpine + +COPY . /src +RUN cd /src && npm install +CMD ["node", "/src/server.js"] diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/README.md new file mode 100644 index 0000000..fd7504d --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/README.md @@ -0,0 +1,38 @@ +### Service Binding Sample + +This sample shows how to run Node.js apps with Azure Database for MySQL in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* [Docker](https://www.docker.com/products/container-runtime) +* [Nodejs](https://nodejs.org/en/) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Node.js with your custom container. + +1. Add a binding for this app + ``` + az spring-cloud app binding mysql add --app -s -g -n mysql --resource-id --username --key --database-name + ``` +1. Restart the app + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/mysql.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/mysql.js new file mode 100644 index 0000000..2df720d --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/mysql.js @@ -0,0 +1,51 @@ +const mysql = require('mysql'); + +var config = +{ + host: process.env.SPRING_DATASOURCE_HOST, + user: process.env.SPRING_DATASOURCE_USERNAME, + password: process.env.SPRING_DATASOURCE_PASSWORD, + database: process.env.SPRING_DATASOURCE_DATABASE, + port: 3306, + ssl: true +} + +const conn = new mysql.createConnection(config) + +conn.connect( + function (err) { + if (err) { + console.log("!!! Cannot connect !!! Error:"); + throw err; + } + else + { + console.log("Connection established.") + } +}) + +/* + Pre create table in your database + DROP TABLE IF EXISTS user; + CREATE TABLE user (id serial PRIMARY KEY, name VARCHAR(50), email VARCHAR(50)); + */ + +function all(res){ + conn.query('SELECT * FROM user', + function (err, results, fields) { + if (err) throw err; + else console.log('Selected ' + results.length + ' row(s).'); + console.log(results); + res.send(results) + }) +} + +function add(name, email){ + conn.query('INSERT INTO user (name, email) VALUES (?, ?);', [name, email], + function (err, results, fields) { + if (err) throw err; + console.log('Inserted ' + results.affectedRows + ' row(s).'); + }) +} + +module.exports = { all, add } \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/package.json b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/package.json new file mode 100644 index 0000000..61e61ff --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/package.json @@ -0,0 +1,16 @@ +{ + "name": "byoc-service-binding-mysql-node-sample", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "express": "^4.17.1", + "mysql": "^2.18.1" + } +} diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/server.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/server.js new file mode 100644 index 0000000..e0d2d1e --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-mysql-node/server.js @@ -0,0 +1,29 @@ +const data = require('./mysql.js') + +const http = require('http') +const port = 1025 + +const express = require('express'); +var app = express(); + +app.get('/all', (req, res) => { + try { + data.all(res); + } catch (err) { + console.log(err) + } +}) + +app.post('/add', (req, res) => { + try { + res.send(data.add(req.query.name, req.query.email)) + } catch (err) { + console.log(err) + } +}) + +var server = app.listen(port, function () { + var host = server.address().address + var port = server.address().port + console.log("Example app listening at http://%s:%s", host, port) +}) diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/Dockerfile new file mode 100644 index 0000000..3a6cc27 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/Dockerfile @@ -0,0 +1,5 @@ +FROM node:15-alpine + +COPY . /src +RUN cd /src && npm install +CMD ["node", "/src/server.js"] diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/README.md new file mode 100644 index 0000000..82f1787 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/README.md @@ -0,0 +1,38 @@ +### Bind your Node.js app with Azure Cache for Redis in your custom container + +This sample shows how to run Node.js app with Azure Cache for Redis in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* [Docker](https://www.docker.com/products/container-runtime) +* [Nodejs](https://nodejs.org/en/) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Node.js with your custom container. + +1. Add a binding for this app + ``` + az spring-cloud app binding redis add --app -s -g -n redis --resource-id + ``` +1. Restart the app + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/package.json b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/package.json new file mode 100644 index 0000000..5971ef6 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/package.json @@ -0,0 +1,17 @@ +{ + "name": "byoc-service-binding-redis-node-sample", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "express": "^4.17.1", + "redis": "^3.1.2" + } +} diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/redis.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/redis.js new file mode 100644 index 0000000..5b58a25 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/redis.js @@ -0,0 +1,33 @@ +const redis = require("redis"); +const bluebird = require("bluebird"); + +// Convert Redis client API to use promises, to make it usable with async/await syntax +bluebird.promisifyAll(redis.RedisClient.prototype); +bluebird.promisifyAll(redis.Multi.prototype); + +const configuration = { + host: process.env.SPRING_REDIS_HOST, + port: process.env.SPRING_REDIS_PORT, + auth_pass: process.env.SPRING_REDIS_PASSWORD, + tls: { + servername: process.env.SPRING_REDIS_HOST + } +} + +const client = redis.createClient(configuration); + +client.on('error', err => { + console.log(err) +}); + +async function setAndGetFoo() { + client.set('foo', 'bar', (err, reply) => { + if (err) throw err + console.log(reply) + }) + + const result = await client.getAsync('foo') + return result +} + +module.exports = { setAndGetFoo } \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/server.js b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/server.js new file mode 100644 index 0000000..bcd8dee --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-node/byoc-service-binding-redis-node/server.js @@ -0,0 +1,23 @@ +const redis = require('./redis.js') + +const http = require('http') +const port = 1025 + +const express = require('express'); +var app = express(); + +app.get('/setAndGetFoo', async (req, res) => { + try { + const result = await redis.setAndGetFoo().then((value) => { + res.send(value) + }) + } catch (err) { + console.log(err) + } +}) + +var server = app.listen(port, function () { + var host = server.address().address + var port = server.address().port + console.log("Example app listening at http://%s:%s", host, port) +}) diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/Dockerfile new file mode 100644 index 0000000..67ea831 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.8 + +WORKDIR /code + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . + +CMD [ "gunicorn", "--bind", "0.0.0.0:1025", "server:app" ] \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/README.md new file mode 100644 index 0000000..74d51ed --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/README.md @@ -0,0 +1,38 @@ +# Binding your app with Azure COSMOS Mongo API + +This sample shows how to run Python apps with Azure Cosmos DB(Mongo) in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* Python & [Python extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python) +* [Docker](https://www.docker.com/products/container-runtime) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Python with your custom container. + +1. Add a binding of Azure Cosmos for this app. + ``` + az spring-cloud app binding cosmos add --api-type mongo --app -s -g -n cosmos --resource-id --database-name + ``` +1. Restart the app. + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/mongo.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/mongo.py new file mode 100644 index 0000000..633b540 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/mongo.py @@ -0,0 +1,14 @@ +import os +from pymongo import MongoClient + +client = MongoClient(os.environ['SPRING_DATA_MONGODB_URI']) + +def all(): + cursor = client.get_database().users.find() + results = list(cursor) + return ''.join([str(x) for x in results]) + +def add(name): + mydict = { "name": name } + x = client.get_database().users.insert_one(mydict) + return "OK" \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/requirements.txt b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/requirements.txt new file mode 100644 index 0000000..11585ae --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/requirements.txt @@ -0,0 +1,3 @@ +Flask==1.1.1 +pymongo +gunicorn \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/server.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/server.py new file mode 100644 index 0000000..a4defb8 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-mongo-python/server.py @@ -0,0 +1,23 @@ +from flask import Flask, request +import mongo as mongoConn + +app = Flask(__name__) + +@app.route("/all", methods = ['GET']) +def all(): + try: + return mongoConn.all() + except Exception as e: + print(e) + return e.__str__() + +@app.route("/add", methods = ['POST']) +def add(): + try: + return mongoConn.add(request.args['name']) + except Exception as e: + print(e) + return e.__str__() + +if __name__ == "__main__": + app.run(port = 1025) \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/Dockerfile new file mode 100644 index 0000000..67ea831 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.8 + +WORKDIR /code + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . + +CMD [ "gunicorn", "--bind", "0.0.0.0:1025", "server:app" ] \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/README.md new file mode 100644 index 0000000..e3fb14e --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/README.md @@ -0,0 +1,38 @@ +# Bind your app with Azure COSMOS SQL API + +This sample shows how to run Python apps with Azure Cosmos DB(SQL) in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* Python & [Python extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python) +* [Docker](https://www.docker.com/products/container-runtime) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Python with your custom container. + +1. Add a binding for this app + ``` + az spring-cloud app binding cosmos add --api-type sql --app -s -g -n cosmos --resource-id --database-name + ``` +1. Restart the app + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/cosmosSql.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/cosmosSql.py new file mode 100644 index 0000000..df99cb4 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/cosmosSql.py @@ -0,0 +1,44 @@ +import os +import uuid +import azure.cosmos.cosmos_client as cosmos_client + +HOST = os.environ['AZURE_COSMOSDB_URI'] +MASTER_KEY = os.environ['AZURE_COSMOSDB_KEY'] +DATABASE_ID = os.environ['AZURE_COSMOSDB_DATABASE'] + +client = cosmos_client.CosmosClient(HOST, {'masterKey': MASTER_KEY} ) + +# Pre create your own database and container in your Cosmosdb for sql +db = client.get_database_client(DATABASE_ID) +container_id = 'mycollection' +container = db.get_container_client(container=container_id) + +def all(): + item_list = read_items(container) + return ''.join([str(x) for x in item_list]) + +def add(name): + create_items(container, name) + return "OK" + +def read_items(container): + # NOTE: Use MaxItemCount on Options to control how many items come back per trip to the server + # Important to handle throttles whenever you are doing operations such as this that might + # result in a 429 (throttled request) + item_list = list(container.read_all_items(max_item_count=10)) + return item_list + +def create_items(container, name): + print('Creating Items') + + # Create a User object. + # This can be saved as JSON as is without converting into rows/columns. + user_obj = get_user(str(uuid.uuid1()), name) + container.create_item(body=user_obj) + +def get_user(item_id, name): + user1 = { + 'id' : item_id, + 'name' : name, + } + return user1 \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/requirements.txt b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/requirements.txt new file mode 100644 index 0000000..0349872 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/requirements.txt @@ -0,0 +1,3 @@ +Flask==1.1.1 +azure-cosmos +gunicorn \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/server.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/server.py new file mode 100644 index 0000000..f857daa --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-cosmosdb-sql-python/server.py @@ -0,0 +1,23 @@ +from flask import Flask, request +import cosmosSql as cosmos + +app = Flask(__name__) + +@app.route("/all", methods = ['GET']) +def all(): + try: + return cosmos.all() + except Exception as e: + print(e) + return e.__str__() + +@app.route("/add", methods = ['POST']) +def add(): + try: + return cosmos.add(request.args['name']) + except Exception as e: + print(e) + return e.__str__() + +if __name__ == "__main__": + app.run(port = 1025) \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/Dockerfile new file mode 100644 index 0000000..67ea831 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.8 + +WORKDIR /code + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . + +CMD [ "gunicorn", "--bind", "0.0.0.0:1025", "server:app" ] \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/README.md new file mode 100644 index 0000000..56e0ee4 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/README.md @@ -0,0 +1,38 @@ +### Service Binding Sample + +This sample shows how to run Python apps with Azure Database for MySQL in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* Python & [Python extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python) +* [Docker](https://www.docker.com/products/container-runtime) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Python with your custom container. + +1. Add a binding for this app + ``` + az spring-cloud app binding mysql add --app -s -g -n mysql --resource-id --username --key --database-name + ``` +1. Restart the app + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/mysqlConnector.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/mysqlConnector.py new file mode 100644 index 0000000..e583479 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/mysqlConnector.py @@ -0,0 +1,43 @@ +import mysql.connector +from mysql.connector import errorcode +import os + +# Obtain connection string information from the portal +config = { + 'host': os.environ['SPRING_DATASOURCE_HOST'], + 'user': os.environ['SPRING_DATASOURCE_USERNAME'], + 'password':os.environ['SPRING_DATASOURCE_PASSWORD'], + 'database': os.environ['SPRING_DATASOURCE_DATABASE'], + 'client_flags': [mysql.connector.ClientFlag.SSL] +} + +# Construct connection string +try: + conn = mysql.connector.connect(**config) + print("Connection established") +except mysql.connector.Error as err: + if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: + print("Something is wrong with the user name or password") + elif err.errno == errorcode.ER_BAD_DB_ERROR: + print("Database does not exist") + else: + print(err) +else: + cursor = conn.cursor() + +# Pre create table in your database +# DROP TABLE IF EXISTS user; +# CREATE TABLE user (id serial PRIMARY KEY, name VARCHAR(50), email VARCHAR(50)); + +def all(): + cursor.execute("SELECT * FROM user;") + rows = cursor.fetchall() + print("Read", cursor.rowcount,"row(s) of data.") + return str(rows) + +def add(name, email): + print(name, email) + cursor.execute("INSERT INTO user (name, email) VALUES (%s, %s);", (name, email)) + conn.commit() + print("Inserted", cursor.rowcount,"row(s) of data.") + return "OK" \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/requirements.txt b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/requirements.txt new file mode 100644 index 0000000..b449d65 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/requirements.txt @@ -0,0 +1,3 @@ +Flask==1.1.1 +mysql-connector-python +gunicorn \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/server.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/server.py new file mode 100644 index 0000000..5015bd0 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-mysql-python/server.py @@ -0,0 +1,23 @@ +from flask import Flask, request +import mysqlConnector as mysqlConn + +app = Flask(__name__) + +@app.route("/all", methods = ['GET']) +def all(): + try: + return mysqlConn.all() + except Exception as e: + print(e) + return e.__str__() + +@app.route("/add", methods = ['POST']) +def add(): + try: + return mysqlConn.add(request.args['name'], request.args['email']) + except Exception as e: + print(e) + return e.__str__() + +if __name__ == "__main__": + app.run(port = 1025) \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/Dockerfile b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/Dockerfile new file mode 100644 index 0000000..67ea831 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.8 + +WORKDIR /code + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . + +CMD [ "gunicorn", "--bind", "0.0.0.0:1025", "server:app" ] \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/README.md b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/README.md new file mode 100644 index 0000000..2ffdff2 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/README.md @@ -0,0 +1,40 @@ +### Bind your Python app with Azure Cache for Redis in your custom container + +This sample shows how to run Python app with Azure Cache for Redis in `Azure Spring Cloud` with your custom container. + +### Prerequisite + +* Python & [Python extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python) +* [Docker](https://www.docker.com/products/container-runtime) +* [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/overview) + +### How to run + +1. Install Azure CLI extension for Azure Spring Cloud by running below command. + ``` + az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl + ``` +1. Create an instance of Azure Spring Cloud. + ``` + az spring-cloud create -n -g + ``` +1. Create an app with public domain assigned. + ``` + az spring-cloud app create -n -s -g --is-public true + ``` +1. Deploy the app written in Python with your custom container. + ``` + az spring-cloud app deploy -n -s -g --jar-path ./target/asc-service-binding-redis-sample-0.1.0.jar + ``` +1. Add a binding for this app + ``` + az spring-cloud app binding redis add --app -s -g -n redis --resource-id + ``` +1. Restart the app + ``` + az spring-cloud app restart -n -s -g + ``` +1. Verify app is running. Instances should have status `RUNNING` and discoveryStatus `UP`. + ``` + az spring-cloud app show -n -s -g + ``` diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/redisTemplate.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/redisTemplate.py new file mode 100644 index 0000000..840d773 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/redisTemplate.py @@ -0,0 +1,12 @@ +import redis +import os + +r = redis.Redis(host = os.environ['SPRING_REDIS_HOST'], + port = os.environ['SPRING_REDIS_PORT'], + password = os.environ['SPRING_REDIS_PASSWORD'], + ssl = os.environ['SPRING_REDIS_SSL']) + +def setAndGetFoo(): + r.set("foo", "bar") + return r.get("foo") + \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/requirements.txt b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/requirements.txt new file mode 100644 index 0000000..12aa60e --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/requirements.txt @@ -0,0 +1,3 @@ +Flask==1.1.1 +gunicorn +redis \ No newline at end of file diff --git a/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/server.py b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/server.py new file mode 100644 index 0000000..e064470 --- /dev/null +++ b/byoc-samples/byoc-service-bindings/byoc-service-bindings-python/byoc-service-binding-redis-python/server.py @@ -0,0 +1,16 @@ +from flask import Flask, request +import redisTemplate as redis + +app = Flask(__name__) + +@app.route("/setAndGetFoo") +def setAndGetFoo(): + try: + return redis.setAndGetFoo() + except Exception as e: + print(e) + return e.__str__() + + +if __name__ == "__main__": + app.run(port = 1025) \ No newline at end of file