Files
azuredatastudio/extensions/asde-deployment/notebooks/edge/deploy-sql-edge-local.ipynb
2022-11-03 13:12:07 -07:00

291 lines
12 KiB
Plaintext

{
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3 (ipykernel)",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.8.10",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
}
},
"nbformat_minor": 2,
"nbformat": 4,
"cells": [
{
"cell_type": "markdown",
"source": [
"![Microsoft](https://raw.githubusercontent.com/microsoft/azuredatastudio/main/extensions/resource-deployment/images/microsoft-small-logo.png)\n",
"## Deploy Azure SQL Edge container instance locally with Docker\n",
"This notebook will use Docker to pull and run the Azure SQL Edge image and connect to it in Azure Data Studio\n",
"\n",
"### Dependencies\n",
"- Docker Engine. For more information, see [Install Docker](https://docs.docker.com/engine/installation/).\n",
"\n",
"<span style=\"color:red\"><font size=\"3\">Please press the \"Run all\" button to run the notebook</font></span>"
],
"metadata": {
"azdata_cell_guid": "565693e5-39d7-46cf-b0a1-3aa9945c3eed"
}
},
{
"cell_type": "markdown",
"source": [
"### Check dependencies"
],
"metadata": {
"azdata_cell_guid": "b9e09157-54b4-4358-90a2-1a54419bd2cc"
}
},
{
"cell_type": "code",
"source": [
"import sys,os,getpass,json,html,time\n",
"from string import Template\n",
"\n",
"def run_command(displayCommand = \"\"):\n",
" print(\"Executing: \" + (displayCommand if displayCommand != \"\" else cmd))\n",
" !{cmd}\n",
" if _exit_code != 0:\n",
" sys.exit(f'Command execution failed with exit code: {str(_exit_code)}.\\n')\n",
" print(f'Command successfully executed')\n",
"\n",
"cmd = 'docker version'\n",
"run_command()"
],
"metadata": {
"azdata_cell_guid": "a0a8cd9b-ab0f-4ba2-b568-0c68d950c8bf",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### List existing containers\n",
"You can view the ports that have been used by existing containers"
],
"metadata": {
"azdata_cell_guid": "b5a3c41c-a2c3-44a7-94cc-9f1f61d0151d"
}
},
{
"cell_type": "code",
"source": [
"cmd = f'docker ps -a'\n",
"run_command()"
],
"metadata": {
"azdata_cell_guid": "5a253372-1a98-4b07-a3e0-9ae5f47cb0a5",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### Setting variables"
],
"metadata": {
"azdata_cell_guid": "7c476b13-05f7-4975-bcb0-8c596bc01e6c"
}
},
{
"cell_type": "code",
"source": [
"env_var_flag = \"AZDATA_NB_VAR_SA_PASSWORD\" in os.environ\n",
"password_name = 'SQL Server sa account password'\n",
"if env_var_flag:\n",
" container_name = os.environ[\"AZDATA_NB_VAR_DOCKER_CONTAINER_NAME\"]\n",
" sql_password = os.environ[\"AZDATA_NB_VAR_SA_PASSWORD\"]\n",
" sql_port = os.environ[\"AZDATA_NB_VAR_DOCKER_PORT\"]\n",
" docker_registry = os.environ[\"AZDATA_NB_VAR_DOCKER_REGISTRY\"]\n",
" docker_repository = os.environ[\"AZDATA_NB_VAR_DOCKER_REPOSITORY\"]\n",
" docker_imagetag = os.environ[\"AZDATA_NB_VAR_DOCKER_IMAGETAG\"]\n",
" docker_username = os.environ[\"AZDATA_NB_VAR_DOCKER_USERNAME\"]\n",
" docker_password = os.environ[\"AZDATA_NB_VAR_DOCKER_PASSWORD\"]\n",
"else:\n",
" container_name = 'SQLEDGE-' + time.strftime(\"%Y%m%d%H%M%S\", time.localtime())\n",
" docker_registry = 'mcr.microsoft.com'\n",
" docker_repository = 'azure-sql-edge-developer'\n",
" docker_imagetag = 'latest'\n",
" docker_username = ''\n",
" docker_password = ''\n",
" sql_password = getpass.getpass(prompt = password_name)\n",
" password_confirm = getpass.getpass(prompt = f'Confirm {password_name}')\n",
" if sql_password != password_confirm:\n",
" sys.exit(f'{password_name} does not match the confirmation password.')\n",
" sql_port = input('SQL Server port, default value is 1433')\n",
" if len(sql_port) == 0:\n",
" sql_port = '1433'\n",
"print(f'{password_name}: ******')\n",
"print(f'Container name: {container_name}')\n",
"print(f'Port: {sql_port}')\n",
"print(f'Docker registry: {docker_registry}')\n",
"print(f'Docker repository: {docker_repository}')\n",
"print(f'Image tag: {docker_imagetag}')"
],
"metadata": {
"azdata_cell_guid": "c0af4e4e-4232-4a67-9a21-05a4d54fd0f4",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### Pull the container image"
],
"metadata": {
"azdata_cell_guid": "92acb1bf-590d-426e-a9ee-2643c56dcdbe"
}
},
{
"cell_type": "code",
"source": [
"if docker_username != '':\n",
" cmd = f'docker login {docker_registry} -u {docker_username} -p {docker_password}'\n",
" run_command(False)\n",
"cmd = f'docker pull {docker_registry}/{docker_repository}:{docker_imagetag}'\n",
"run_command()"
],
"metadata": {
"azdata_cell_guid": "58b2156b-da0c-47d5-9706-4bd9f630d28b",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### Start a new container"
],
"metadata": {
"azdata_cell_guid": "442e71cd-551b-4b37-8b5a-b814efd27908"
}
},
{
"cell_type": "code",
"source": [
"template = Template(f'docker run -e ACCEPT_EULA=Y -e \"SA_PASSWORD=$password\" -e \"MSSQL_PID=Developer\" -p {sql_port}:1433 --name {container_name} -d {docker_registry}/{docker_repository}:{docker_imagetag}')\n",
"cmd = template.substitute(password=sql_password)\n",
"run_command(template.substitute(password='******'))"
],
"metadata": {
"azdata_cell_guid": "4cdcf011-06fd-4df4-bd20-3024d0a5ab9d",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### List all the containers"
],
"metadata": {
"azdata_cell_guid": "072a9d13-4fb1-4114-9637-5255be9fcc81"
}
},
{
"cell_type": "code",
"source": [
"cmd = f'docker ps -a'\n",
"run_command()"
],
"metadata": {
"azdata_cell_guid": "345dc24f-0028-47b4-b35b-aaac047b7a62",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### Connect to Azure SQL Edge instance in Azure Data Studio\n",
"It might take a couple minutes for the service to launch"
],
"metadata": {
"azdata_cell_guid": "c84bc075-f8b2-48a3-bfc7-f07a5b8be7a0"
}
},
{
"cell_type": "code",
"source": [
"from IPython.display import *\n",
"connectionParameter = '{\"serverName\":\"localhost,' + sql_port + '\",\"providerName\":\"MSSQL\",\"authenticationType\":\"SqlLogin\",\"userName\":\"sa\",\"password\":' + json.dumps(sql_password) + ',\"options\": {\"trustServerCertificate\":true}}'\n",
"display(HTML('<br/><a href=\"command:azdata.connect?' + html.escape(connectionParameter)+'\"><font size=\"3\">Click here to connect to the Azure SQL Edge instance</font></a><br/>'))\n",
"display(HTML('<br/><span style=\"color:red\"><font size=\"2\">NOTE: The Azure SQL Edge instance password is included in this link, you may want to clear the results of this code cell before saving the notebook.</font></span>'))"
],
"metadata": {
"azdata_cell_guid": "187a0067-a04c-4afb-a684-3103bb4522ae",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### Stop and remove the container"
],
"metadata": {
"azdata_cell_guid": "94322968-02f5-49e5-8ff1-47a9af3c5e83"
}
},
{
"cell_type": "code",
"source": [
"stop_container_command = f'docker stop {container_name}'\n",
"remove_container_command = f'docker rm {container_name}'\n",
"display(HTML(\"Use this link to: <a href=\\\"command:workbench.action.terminal.focus\\\">open the terminal window in Azure Data Studio</a> and use the links below to paste the command to the terminal.\"))\n",
"display(HTML(\"Stop the container: <a href=\\\"command:workbench.action.terminal.sendSequence?%7B%22text%22%3A%22\"+stop_container_command.replace(\" \",\"%20\")+\"%22%7D\\\">\" + stop_container_command + \"</a>\"))\n",
"display(HTML(\"Remove the container: <a href=\\\"command:workbench.action.terminal.sendSequence?%7B%22text%22%3A%22\"+remove_container_command.replace(\" \",\"%20\")+\"%22%7D\\\">\" + remove_container_command + \"</a>\"))"
],
"metadata": {
"azdata_cell_guid": "9b6c34c2-7a47-43f5-971d-ce9768fec587",
"tags": [
"hide_input"
],
"language": "python"
},
"outputs": [],
"execution_count": null
}
]
}