From 4da8ff87e2cb7e00830e7151fbccf23045abc1ab Mon Sep 17 00:00:00 2001 From: Mahdi Date: Sun, 15 Dec 2024 12:09:47 +0800 Subject: [PATCH] added my new example --- contributing/README.md | 0 contributing/extra.css | 0 contributing/images/hashicorp-black.png | Bin contributing/images/hashicorp.png | Bin contributing/topics/building-the-provider.md | 0 contributing/topics/debugging-the-provider.md | 0 .../topics/frequently-asked-questions.md | 0 contributing/topics/guide-new-data-source.md | 0 .../topics/guide-new-fields-to-data-source.md | 0 .../topics/guide-new-fields-to-resource.md | 0 .../topics/guide-new-resource-vs-inline.md | 0 contributing/topics/guide-new-resource.md | 0 .../topics/guide-new-service-package.md | 0 contributing/topics/guide-opening-a-pr.md | 0 contributing/topics/high-level-overview.md | 0 contributing/topics/maintainer-changelog.md | 0 .../topics/reference-acceptance-testing.md | 0 contributing/topics/reference-errors.md | 0 contributing/topics/reference-glossary.md | 0 contributing/topics/reference-naming.md | 0 contributing/topics/running-the-tests.md | 0 .../topics/schema-design-considerations.md | 0 .../api-integration-function-app/.funcignore | 1 + .../api-integration-function-app/.gitignore | 2 + .../api-integration-function-app/README.md | 92 ++++ .../function_code/.funcignore | 10 + .../function_code/.gitignore | 48 ++ .../function_code/host.json | 15 + .../function_code/local.settings.json | 7 + .../function_code/package-lock.json | 437 +++++++++++++++ .../function_code/package.json | 16 + .../function_code/src/functions/op1.js | 23 + .../terraform_configs/.gitignore | 6 + .../terraform_configs/main.tf | 99 ++++ .../terraform_configs/outputs.tf | 15 + .../terraform_configs/policy.xml | 15 + .../terraform_configs/providers.tf | 18 + .../terraform_configs/variables.tf | 24 + examples/arckubernetes/README.md | 48 +- .../arckubernetes/testdata/install_agent.py | 496 +++++++++--------- examples/arckubernetes/testdata/kind.yaml | 40 +- examples/arckubernetes/variables.tf | 50 +- .../shared-self-hosted/variables.tf | 14 +- examples/mssql/mssqlvm/variables.tf | 14 +- .../nfsv3_volume_cmk_userassigned/main.tf | 0 .../variables.tf | 0 .../nfsv3_volume_with_backup_policy/main.tf | 200 +++---- .../variables.tf | 0 .../README.md | 8 +- .../nfsv3_volume_with_snapshot_policy/main.tf | 208 ++++---- .../variables.tf | 0 examples/netapp/volume_crr/README.md | 8 +- examples/netapp/volume_crr/main.tf | 286 +++++----- .../netapp/volume_from_snapshot/README.md | 8 +- examples/netapp/volume_from_snapshot/main.tf | 192 +++---- .../sql-azure/failover_group/variables.tf | 22 +- .../sql_auditing_eventhub/variables.tf | 14 +- .../variables.tf | 14 +- .../2-vms-loadbalancer-lbrules/deploy.ci.sh | 0 .../2-vms-loadbalancer-lbrules/deploy.mac.sh | 0 .../encrypt-running-linux-vm/deploy.ci.sh | 0 .../encrypt-running-linux-vm/deploy.mac.sh | 0 .../openshift-origin/deploy.ci.sh | 0 .../openshift-origin/deploy.mac.sh | 0 .../deploy.ci.sh | 0 .../deploy.mac.sh | 0 .../deploy.ci.sh | 0 .../deploy.mac.sh | 0 .../testdata/api_management_api_openapi.yaml | 64 +-- .../testdata/api_management_api_test.cer | 0 .../testdata/api_management_testdata.sh | 0 internal/services/appservice/testdata/run.csx | 46 +- .../arckubernetes/testdata/install_agent.py | 496 +++++++++--------- .../services/arckubernetes/testdata/kind.yaml | 40 +- .../automation_certificate_testdata.sh | 0 .../batch/testdata/batch_certificate.cer | 40 +- .../testdata/application_gateway_test.cer | 40 +- .../testdata/application_gateway_test.cer | 40 +- .../iothub/testdata/batch_certificate.cer | 40 +- .../services/iothub/testdata/iothub_test.cer | 0 internal/services/logic/testdata/log4net.dll | Bin 270336 -> 0 bytes .../testdata/application_gateway_test.cer | 40 +- internal/services/springcloud/testdata/cer | 34 +- internal/tools/document-lint/README.md | 44 +- mkdocs.yml | 0 scripts/check-test-package.sh | 0 scripts/gofmtcheck.sh | 0 scripts/gogetcookie.sh | 0 scripts/goimport-file.sh | 0 scripts/plugin-sdk-fixerupper.sh | 0 scripts/release.sh | 0 scripts/run-breaking-change-detection.sh | 0 scripts/run-gradually-deprecated.sh | 0 scripts/run-lint.sh | 0 scripts/run-static-analysis.sh | 0 scripts/run-test.sh | 0 scripts/run-tflint.sh | 0 scripts/scaffold-website.sh | 0 scripts/stats-pandora-sdks.sh | 0 scripts/terrafmt-acctests.sh | 0 scripts/terrafmt-website.sh | 0 scripts/timeouts.sh | 0 scripts/track2-check.sh | 0 scripts/update-deps.sh | 0 scripts/validate-examples.sh | 0 ...vedetectionconfigurationruledefinitions.go | 15 - .../mobilenetwork/2022-11-01/site/README.md | 86 --- .../mobilenetwork/2022-11-01/site/client.go | 26 - .../2022-11-01/site/constants.go | 66 --- .../mobilenetwork/2022-11-01/site/id_site.go | 139 ----- .../2022-11-01/site/method_createorupdate.go | 75 --- .../2022-11-01/site/method_delete.go | 71 --- .../2022-11-01/site/method_get.go | 53 -- .../2022-11-01/site/method_updatetags.go | 57 -- .../2022-11-01/site/model_site.go | 18 - .../site/model_sitepropertiesformat.go | 9 - .../2022-11-01/site/model_subresource.go | 8 - .../2022-11-01/site/model_tagsobject.go | 8 - .../mobilenetwork/2022-11-01/site/version.go | 10 - 119 files changed, 2101 insertions(+), 1914 deletions(-) mode change 100755 => 100644 contributing/README.md mode change 100755 => 100644 contributing/extra.css mode change 100755 => 100644 contributing/images/hashicorp-black.png mode change 100755 => 100644 contributing/images/hashicorp.png mode change 100755 => 100644 contributing/topics/building-the-provider.md mode change 100755 => 100644 contributing/topics/debugging-the-provider.md mode change 100755 => 100644 contributing/topics/frequently-asked-questions.md mode change 100755 => 100644 contributing/topics/guide-new-data-source.md mode change 100755 => 100644 contributing/topics/guide-new-fields-to-data-source.md mode change 100755 => 100644 contributing/topics/guide-new-fields-to-resource.md mode change 100755 => 100644 contributing/topics/guide-new-resource-vs-inline.md mode change 100755 => 100644 contributing/topics/guide-new-resource.md mode change 100755 => 100644 contributing/topics/guide-new-service-package.md mode change 100755 => 100644 contributing/topics/guide-opening-a-pr.md mode change 100755 => 100644 contributing/topics/high-level-overview.md mode change 100755 => 100644 contributing/topics/maintainer-changelog.md mode change 100755 => 100644 contributing/topics/reference-acceptance-testing.md mode change 100755 => 100644 contributing/topics/reference-errors.md mode change 100755 => 100644 contributing/topics/reference-glossary.md mode change 100755 => 100644 contributing/topics/reference-naming.md mode change 100755 => 100644 contributing/topics/running-the-tests.md mode change 100755 => 100644 contributing/topics/schema-design-considerations.md create mode 100644 examples/api-management/api-integration-function-app/.funcignore create mode 100644 examples/api-management/api-integration-function-app/.gitignore create mode 100644 examples/api-management/api-integration-function-app/README.md create mode 100644 examples/api-management/api-integration-function-app/function_code/.funcignore create mode 100644 examples/api-management/api-integration-function-app/function_code/.gitignore create mode 100644 examples/api-management/api-integration-function-app/function_code/host.json create mode 100644 examples/api-management/api-integration-function-app/function_code/local.settings.json create mode 100644 examples/api-management/api-integration-function-app/function_code/package-lock.json create mode 100644 examples/api-management/api-integration-function-app/function_code/package.json create mode 100644 examples/api-management/api-integration-function-app/function_code/src/functions/op1.js create mode 100644 examples/api-management/api-integration-function-app/terraform_configs/.gitignore create mode 100644 examples/api-management/api-integration-function-app/terraform_configs/main.tf create mode 100644 examples/api-management/api-integration-function-app/terraform_configs/outputs.tf create mode 100644 examples/api-management/api-integration-function-app/terraform_configs/policy.xml create mode 100644 examples/api-management/api-integration-function-app/terraform_configs/providers.tf create mode 100644 examples/api-management/api-integration-function-app/terraform_configs/variables.tf mode change 100755 => 100644 examples/netapp/nfsv3_volume_cmk_userassigned/main.tf mode change 100755 => 100644 examples/netapp/nfsv3_volume_cmk_userassigned/variables.tf mode change 100755 => 100644 examples/netapp/nfsv3_volume_with_backup_policy/main.tf mode change 100755 => 100644 examples/netapp/nfsv3_volume_with_backup_policy/variables.tf mode change 100755 => 100644 examples/netapp/nfsv3_volume_with_snapshot_policy/main.tf mode change 100755 => 100644 examples/netapp/nfsv3_volume_with_snapshot_policy/variables.tf mode change 100755 => 100644 examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/deploy.ci.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/deploy.mac.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/deploy.ci.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/deploy.mac.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/openshift-origin/deploy.ci.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/openshift-origin/deploy.mac.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/deploy.ci.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/deploy.mac.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/deploy.ci.sh mode change 100755 => 100644 examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/deploy.mac.sh mode change 100755 => 100644 internal/services/apimanagement/testdata/api_management_api_test.cer mode change 100755 => 100644 internal/services/apimanagement/testdata/api_management_testdata.sh mode change 100755 => 100644 internal/services/automation/testdata/automation_certificate_testdata.sh mode change 100755 => 100644 internal/services/iothub/testdata/iothub_test.cer delete mode 100644 internal/services/logic/testdata/log4net.dll mode change 100755 => 100644 mkdocs.yml mode change 100755 => 100644 scripts/check-test-package.sh mode change 100755 => 100644 scripts/gofmtcheck.sh mode change 100755 => 100644 scripts/gogetcookie.sh mode change 100755 => 100644 scripts/goimport-file.sh mode change 100755 => 100644 scripts/plugin-sdk-fixerupper.sh mode change 100755 => 100644 scripts/release.sh mode change 100755 => 100644 scripts/run-breaking-change-detection.sh mode change 100755 => 100644 scripts/run-gradually-deprecated.sh mode change 100755 => 100644 scripts/run-lint.sh mode change 100755 => 100644 scripts/run-static-analysis.sh mode change 100755 => 100644 scripts/run-test.sh mode change 100755 => 100644 scripts/run-tflint.sh mode change 100755 => 100644 scripts/scaffold-website.sh mode change 100755 => 100644 scripts/stats-pandora-sdks.sh mode change 100755 => 100644 scripts/terrafmt-acctests.sh mode change 100755 => 100644 scripts/terrafmt-website.sh mode change 100755 => 100644 scripts/timeouts.sh mode change 100755 => 100644 scripts/track2-check.sh mode change 100755 => 100644 scripts/update-deps.sh mode change 100755 => 100644 scripts/validate-examples.sh delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/applicationinsights/2015-05-01/componentproactivedetectionapis/model_applicationinsightscomponentproactivedetectionconfigurationruledefinitions.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/README.md delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/client.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/constants.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/id_site.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_createorupdate.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_delete.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_get.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_updatetags.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_site.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_sitepropertiesformat.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_subresource.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_tagsobject.go delete mode 100644 vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/version.go diff --git a/contributing/README.md b/contributing/README.md old mode 100755 new mode 100644 diff --git a/contributing/extra.css b/contributing/extra.css old mode 100755 new mode 100644 diff --git a/contributing/images/hashicorp-black.png b/contributing/images/hashicorp-black.png old mode 100755 new mode 100644 diff --git a/contributing/images/hashicorp.png b/contributing/images/hashicorp.png old mode 100755 new mode 100644 diff --git a/contributing/topics/building-the-provider.md b/contributing/topics/building-the-provider.md old mode 100755 new mode 100644 diff --git a/contributing/topics/debugging-the-provider.md b/contributing/topics/debugging-the-provider.md old mode 100755 new mode 100644 diff --git a/contributing/topics/frequently-asked-questions.md b/contributing/topics/frequently-asked-questions.md old mode 100755 new mode 100644 diff --git a/contributing/topics/guide-new-data-source.md b/contributing/topics/guide-new-data-source.md old mode 100755 new mode 100644 diff --git a/contributing/topics/guide-new-fields-to-data-source.md b/contributing/topics/guide-new-fields-to-data-source.md old mode 100755 new mode 100644 diff --git a/contributing/topics/guide-new-fields-to-resource.md b/contributing/topics/guide-new-fields-to-resource.md old mode 100755 new mode 100644 diff --git a/contributing/topics/guide-new-resource-vs-inline.md b/contributing/topics/guide-new-resource-vs-inline.md old mode 100755 new mode 100644 diff --git a/contributing/topics/guide-new-resource.md b/contributing/topics/guide-new-resource.md old mode 100755 new mode 100644 diff --git a/contributing/topics/guide-new-service-package.md b/contributing/topics/guide-new-service-package.md old mode 100755 new mode 100644 diff --git a/contributing/topics/guide-opening-a-pr.md b/contributing/topics/guide-opening-a-pr.md old mode 100755 new mode 100644 diff --git a/contributing/topics/high-level-overview.md b/contributing/topics/high-level-overview.md old mode 100755 new mode 100644 diff --git a/contributing/topics/maintainer-changelog.md b/contributing/topics/maintainer-changelog.md old mode 100755 new mode 100644 diff --git a/contributing/topics/reference-acceptance-testing.md b/contributing/topics/reference-acceptance-testing.md old mode 100755 new mode 100644 diff --git a/contributing/topics/reference-errors.md b/contributing/topics/reference-errors.md old mode 100755 new mode 100644 diff --git a/contributing/topics/reference-glossary.md b/contributing/topics/reference-glossary.md old mode 100755 new mode 100644 diff --git a/contributing/topics/reference-naming.md b/contributing/topics/reference-naming.md old mode 100755 new mode 100644 diff --git a/contributing/topics/running-the-tests.md b/contributing/topics/running-the-tests.md old mode 100755 new mode 100644 diff --git a/contributing/topics/schema-design-considerations.md b/contributing/topics/schema-design-considerations.md old mode 100755 new mode 100644 diff --git a/examples/api-management/api-integration-function-app/.funcignore b/examples/api-management/api-integration-function-app/.funcignore new file mode 100644 index 000000000000..ca6d4bb09d6b --- /dev/null +++ b/examples/api-management/api-integration-function-app/.funcignore @@ -0,0 +1 @@ +terraform_configs/* diff --git a/examples/api-management/api-integration-function-app/.gitignore b/examples/api-management/api-integration-function-app/.gitignore new file mode 100644 index 000000000000..687f8724d60c --- /dev/null +++ b/examples/api-management/api-integration-function-app/.gitignore @@ -0,0 +1,2 @@ +.vscode/ + diff --git a/examples/api-management/api-integration-function-app/README.md b/examples/api-management/api-integration-function-app/README.md new file mode 100644 index 000000000000..9194f4a82f83 --- /dev/null +++ b/examples/api-management/api-integration-function-app/README.md @@ -0,0 +1,92 @@ +# Sample Serverless Application on Azure: Integration Between Function App and API Management with Terraform + +This example demonstrates how to integrate Azure API Management with an Azure Linux Function App. + +# Requirements + +The following versions were used and confirmed to work. While other versions may also work, they have not been tested with this setup: + +- **Azure CLI**: Version 2.65.0 +- **Terraform CLI**: Version 1.9.7 +- **Terraform AzureRM Provider**: Version 4.0 or later +- **Azure Functions Core Tools**: Version 4.0.6543 +- **Node.js**: Version 22.9.0 +- **Node Package Manager (NPM)**: Version 10.8.3 + +# How to Run + +## Deploy Infrastructure + +1. Log in to your Azure account: + ``` + az login + ``` + +2. Retrieve the subscription ID and resource group name from your Azure environment. Update the `subscription_id` and `resource_group_name` values in the `terraform_configs/variables.tf` file accordingly. To obtain the subscription ID and resource group name, you can use: + ``` + az group list + ``` + +3. Navigate to the `terraform_configs` folder: + ``` + cd terraform_configs + ``` + +4. Initialize and deploy the Terraform configuration: + ``` + terraform init + terraform plan -out main.tfplan + terraform apply main.tfplan + ``` + + **Note:** Deploying the Azure API Management instance can take up to 90 minutes. Please be patient. + +5. Take note of the following outputs: + - **`function_app_name`**: The name of your Function App, such as `myfuncappsbigwbgyzdync`, which you will need to deploy your function code. + - **`frontend_url`**: The frontend URL of your API Management instance. + +## Deploy the Code to the Function App + +Azure Functions Core Tools has been used to package and deploy the Function App code. While other tools can be used, Terraform currently does not fully integrate with such deployment tools, requiring the functions to be deployed separately after each Terraform deployment. Automation can simplify this process using scripts. + +1. Navigate to the `function_code` folder: + ``` + cd ../function_code + ``` + +2. Install the code dependencies: + ``` + npm install + ``` + +3. Deploy the code: + ``` + func azure functionapp publish your_function_app_name + ``` + Replace `your_function_app_name` with the `function_app_name` from the Terraform outputs. + + **Note:** The `func` CLI may occasionally encounter errors, even if it reports `Deployment completed successfully`. If the `func azure functionapp publish` command does not return the `Invoke URL`, rerun the command. + +4. Verify the deployment: + - **Backend URL (`Invoke URL`)**: Send a GET request to this URL. The response should return a 200 status code with the following message: + ``` + "Hello world, this is coming from Function App!" + ``` + + - **Frontend URL (`frontend_url`)**: Send a GET request to this URL. If everything is correctly configured, the frontend should return the same 200 status code and message. + +5. Remember: After each Terraform deployment, you may need to redeploy the Function App code. + +> [!NOTE] +> For easier development and debugging, CORS restrictions have been disabled by setting `Access-Control-Allow-Origin: *` within the function code. Once the application is running successfully, ensure CORS is re-enabled and properly configured to secure the application. + +# Additional Notes + +Integration between Azure Function App and Azure API Management can be challenging and prone to various issues. Due to the limited documentation, I have automated variables to reduce potential errors. If you plan to modify the code, keep the following considerations in mind: + +- Ensure the `url_template` property in the `azurerm_api_management_api_operation` resource aligns with the function name specified in the `Invoke URL`. Avoid appending slashes to the `url_template` value. +- Ensure that `https://your-function-app-name.azurewebsites.net/api` is consistently used in both the policy and the `Service URL` in the backend configuration, and ensure it overrides any existing value in the backend. + +--- + +This sample aims to bridge gaps in existing documentation and provide a working, reproducible example of Azure Function App and API Management integration. Contributions and feedback are welcome! diff --git a/examples/api-management/api-integration-function-app/function_code/.funcignore b/examples/api-management/api-integration-function-app/function_code/.funcignore new file mode 100644 index 000000000000..df5ed316cc3b --- /dev/null +++ b/examples/api-management/api-integration-function-app/function_code/.funcignore @@ -0,0 +1,10 @@ +*.js.map +*.ts +.git* +.vscode + +test +getting_started.md +node_modules/@types/ +node_modules/azure-functions-core-tools/ +node_modules/typescript/ \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/function_code/.gitignore b/examples/api-management/api-integration-function-app/function_code/.gitignore new file mode 100644 index 000000000000..8a9f3bd84c74 --- /dev/null +++ b/examples/api-management/api-integration-function-app/function_code/.gitignore @@ -0,0 +1,48 @@ +bin +obj +csx +.vs +edge +Publish + +*.user +*.suo +*.cscfg +*.Cache +project.lock.json + +/packages +/TestResults + +/tools/NuGet.exe +/App_Data +/secrets +/data +.secrets +appsettings.json + + +node_modules +dist + +# Local python packages +.python_packages/ + +# Python Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Azurite artifacts +__blobstorage__ +__queuestorage__ +__azurite_db*__.json \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/function_code/host.json b/examples/api-management/api-integration-function-app/function_code/host.json new file mode 100644 index 000000000000..9df913614d99 --- /dev/null +++ b/examples/api-management/api-integration-function-app/function_code/host.json @@ -0,0 +1,15 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + } + } + }, + "extensionBundle": { + "id": "Microsoft.Azure.Functions.ExtensionBundle", + "version": "[4.*, 5.0.0)" + } +} \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/function_code/local.settings.json b/examples/api-management/api-integration-function-app/function_code/local.settings.json new file mode 100644 index 000000000000..76b99eed8f9b --- /dev/null +++ b/examples/api-management/api-integration-function-app/function_code/local.settings.json @@ -0,0 +1,7 @@ +{ + "IsEncrypted": false, + "Values": { + "FUNCTIONS_WORKER_RUNTIME": "node" + } + } + \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/function_code/package-lock.json b/examples/api-management/api-integration-function-app/function_code/package-lock.json new file mode 100644 index 000000000000..0d3b776df1f4 --- /dev/null +++ b/examples/api-management/api-integration-function-app/function_code/package-lock.json @@ -0,0 +1,437 @@ +{ + "name": "function_code", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "version": "1.0.0", + "dependencies": { + "@azure/functions": "^4.0.0" + }, + "devDependencies": { + "azure-functions-core-tools": "^4.x" + } + }, + "node_modules/@azure/functions": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@azure/functions/-/functions-4.6.0.tgz", + "integrity": "sha512-vGq9jXlgrJ3KaI8bepgfpk26zVY8vFZsQukF85qjjKTAR90eFOOBNaa+mc/0ViDY2lcdrU2fL/o1pQyZUtTDsw==", + "license": "MIT", + "dependencies": { + "cookie": "^0.7.0", + "long": "^4.0.0", + "undici": "^5.13.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/azure-functions-core-tools": { + "version": "4.0.6280", + "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.6280.tgz", + "integrity": "sha512-DVSgYNnT4POLbj/YV3FKtNdo9KT/M5Dl//slWEmVwZo1y4aJEsUApn6DtkZswut76I3S9eKGC5IaC84j5OGNaA==", + "dev": true, + "hasInstallScript": true, + "hasShrinkwrap": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "chalk": "3.0.0", + "extract-zip": "^2.0.1", + "https-proxy-agent": "5.0.0", + "progress": "2.0.3", + "rimraf": "4.4.1" + }, + "bin": { + "azfun": "lib/main.js", + "azurefunctions": "lib/main.js", + "func": "lib/main.js" + }, + "engines": { + "node": ">=6.9.1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true, + "optional": true + }, + "node_modules/azure-functions-core-tools/node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/azure-functions-core-tools/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/ansi-styles": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", + "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/azure-functions-core-tools/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/azure-functions-core-tools/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/azure-functions-core-tools/node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/azure-functions-core-tools/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/azure-functions-core-tools/node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "license": "Apache-2.0" + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + } + } +} diff --git a/examples/api-management/api-integration-function-app/function_code/package.json b/examples/api-management/api-integration-function-app/function_code/package.json new file mode 100644 index 000000000000..8ba10afa64a4 --- /dev/null +++ b/examples/api-management/api-integration-function-app/function_code/package.json @@ -0,0 +1,16 @@ +{ + "name": "", + "version": "1.0.0", + "description": "", + "main": "src/functions/*.js", + "scripts": { + "start": "func start", + "test": "echo \"No tests yet...\"" + }, + "dependencies": { + "@azure/functions": "^4.0.0" + }, + "devDependencies": { + "azure-functions-core-tools": "^4.x" + } +} \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/function_code/src/functions/op1.js b/examples/api-management/api-integration-function-app/function_code/src/functions/op1.js new file mode 100644 index 000000000000..39d2caee2a29 --- /dev/null +++ b/examples/api-management/api-integration-function-app/function_code/src/functions/op1.js @@ -0,0 +1,23 @@ +const { app } = require('@azure/functions'); + +app.http('FuncFromCli', { + methods: ['GET', 'POST'], + authLevel: 'anonymous', + handler: async (request, context) => { + context.log(`Http function processed request for url "${request.url}"`); + + const name = request.query.get('name') || await request.text() || 'world'; + +/* For easier development and debugging, CORS restrictions have been disabled by setting Access-Control-Allow-Origin: *. +Once the application is running successfully, ensure CORS is re-enabled and properly configured to secure the application. */ + return { + body: `Hello ${name}, this is coming from Function App!`, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, POST, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", + } + } + } +}); diff --git a/examples/api-management/api-integration-function-app/terraform_configs/.gitignore b/examples/api-management/api-integration-function-app/terraform_configs/.gitignore new file mode 100644 index 000000000000..436d5c6083db --- /dev/null +++ b/examples/api-management/api-integration-function-app/terraform_configs/.gitignore @@ -0,0 +1,6 @@ +.terraform/ +*.tfstate +*.tfstate.backup +*.tfplan + +functionapp.zip \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/terraform_configs/main.tf b/examples/api-management/api-integration-function-app/terraform_configs/main.tf new file mode 100644 index 000000000000..b72b2242bc8d --- /dev/null +++ b/examples/api-management/api-integration-function-app/terraform_configs/main.tf @@ -0,0 +1,99 @@ +data "azurerm_resource_group" "rg" { + name = var.resource_group_name +} + +resource "random_string" "random_name" { + length = 13 + lower = true + numeric = false + special = false + upper = false +} + +resource "azurerm_api_management" "example" { + name = "myapi${random_string.random_name.result}" + location = data.azurerm_resource_group.rg.location + resource_group_name = data.azurerm_resource_group.rg.name + publisher_email = "test@contoso.com" + publisher_name = "example publisher" + sku_name = "Developer_1" + +} + +resource "azurerm_api_management_api" "example" { + name = "example-api" + resource_group_name = data.azurerm_resource_group.rg.name + api_management_name = azurerm_api_management.example.name + revision = "1" + display_name = "Example API" + api_type = "http" + protocols = ["https"] + subscription_required = false +} + +resource "azurerm_api_management_api_operation" "example" { + operation_id = "op1" + api_name = azurerm_api_management_api.example.name + api_management_name = azurerm_api_management.example.name + resource_group_name = data.azurerm_resource_group.rg.name + display_name = "GET Resource" + method = "GET" + url_template = "funcfromcli" # Ensure this value matches the Azure Function's name exactly as it appears in the invoke URL. + response { + status_code = 200 + description = "Successful GET request" + } +} + +resource "azurerm_api_management_api_policy" "example" { + api_name = azurerm_api_management_api.example.name + resource_group_name = data.azurerm_resource_group.rg.name + api_management_name = azurerm_api_management.example.name + xml_content = templatefile("policy.xml", { + base-url = "https://${azurerm_linux_function_app.example.default_hostname}/api" + }) +} + + +resource "azurerm_api_management_backend" "example" { + name = "example-backend" + resource_group_name = data.azurerm_resource_group.rg.name + api_management_name = azurerm_api_management.example.name + protocol = "http" + url = "https://${azurerm_linux_function_app.example.default_hostname}/api" #make sure this ends exactly like this. just "api" without slash +} + +resource "azurerm_storage_account" "example" { + name = random_string.random_name.result + resource_group_name = data.azurerm_resource_group.rg.name + location = data.azurerm_resource_group.rg.location + account_tier = "Standard" + account_replication_type = "LRS" + +} + +resource "azurerm_service_plan" "example" { + name = "example-app-service-plan" + resource_group_name = data.azurerm_resource_group.rg.name + location = data.azurerm_resource_group.rg.location + os_type = "Linux" + sku_name = "B1" + +} + +resource "azurerm_linux_function_app" "example" { + name = "myfuncapp${random_string.random_name.result}" + resource_group_name = data.azurerm_resource_group.rg.name + location = data.azurerm_resource_group.rg.location + service_plan_id = azurerm_service_plan.example.id + + storage_account_name = azurerm_storage_account.example.name + storage_account_access_key = azurerm_storage_account.example.primary_access_key + site_config { + + application_stack { + node_version = "20" + + } + } +} \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/terraform_configs/outputs.tf b/examples/api-management/api-integration-function-app/terraform_configs/outputs.tf new file mode 100644 index 000000000000..35dbfa69e0be --- /dev/null +++ b/examples/api-management/api-integration-function-app/terraform_configs/outputs.tf @@ -0,0 +1,15 @@ +output "resource_group_name" { + value = data.azurerm_resource_group.rg.name +} + +output "resource_group_location" { + value = data.azurerm_resource_group.rg.location +} + +output "function_app_name" { + value = azurerm_linux_function_app.example.name +} + +output "frontend_url" { + value = "${azurerm_api_management.example.gateway_url}/${azurerm_api_management_api.example.path}${azurerm_api_management_api_operation.example.url_template}" +} diff --git a/examples/api-management/api-integration-function-app/terraform_configs/policy.xml b/examples/api-management/api-integration-function-app/terraform_configs/policy.xml new file mode 100644 index 000000000000..001b2131120f --- /dev/null +++ b/examples/api-management/api-integration-function-app/terraform_configs/policy.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/terraform_configs/providers.tf b/examples/api-management/api-integration-function-app/terraform_configs/providers.tf new file mode 100644 index 000000000000..d9ee568b136b --- /dev/null +++ b/examples/api-management/api-integration-function-app/terraform_configs/providers.tf @@ -0,0 +1,18 @@ +terraform { + required_version = ">=1.0" + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~>4.0" + } + random = { + source = "hashicorp/random" + version = "~>3.0" + } + } +} +provider "azurerm" { + features {} + resource_provider_registrations = "none" + subscription_id = var.subscription_id +} \ No newline at end of file diff --git a/examples/api-management/api-integration-function-app/terraform_configs/variables.tf b/examples/api-management/api-integration-function-app/terraform_configs/variables.tf new file mode 100644 index 000000000000..014c9c12c529 --- /dev/null +++ b/examples/api-management/api-integration-function-app/terraform_configs/variables.tf @@ -0,0 +1,24 @@ + + +# these are sandbox credentials so dear hackers, don't bother ;) +variable "subscription_id" { + default = "YOUR-SUBSCRIPTION-ID" + type = string +} + +variable "resource_group_name" { + default = "YOUR-RESOURCEGROUP-NAME" + type = string +} + + +variable "sku" { + description = "The pricing tier of this API Management service" + default = "Developer" + type = string + validation { + condition = contains(["Developer", "Standard", "Premium"], var.sku) + error_message = "The sku must be one of the following: Developer, Standard, Premium." + } +} + diff --git a/examples/arckubernetes/README.md b/examples/arckubernetes/README.md index 17b079fcb2d9..3e53942a73e1 100644 --- a/examples/arckubernetes/README.md +++ b/examples/arckubernetes/README.md @@ -1,24 +1,24 @@ -## Example: Azure Arc Kubernetes - -This example provisions the following Resources: - -## Creates - -1. A [Resource Group](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group) -2. A [Virtual Network](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network) -3. A [Subnet](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/subnet) -4. A [Linux Virtual Machine](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/linux_virtual_machine) -5. An [Arc Kubernetes Cluster](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/arc_kubernetes_cluster) -6. A [Kind Cluster](https://kind.sigs.k8s.io/) in [Linux Virtual Machine](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/linux_virtual_machine) by [remote-exec Provisioner](https://developer.hashicorp.com/terraform/language/resources/provisioners/remote-exec) -7. [Azure Arc agents](https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/conceptual-agent-overview) in [Kind Cluster](https://kind.sigs.k8s.io/) by [remote-exec Provisioner](https://developer.hashicorp.com/terraform/language/resources/provisioners/remote-exec) - -~> **NOTE:** To connect an existing Kubernetes cluster to Azure Arc, the following conditions must be met: - -* An [Arc Kubernetes Cluster](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/arc_kubernetes_cluster) must be created in Azure -* [Azure Arc agents](https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/conceptual-agent-overview) must be installed in the Kubernetes cluster which is connected to Azure - -## Usage - -- Provide values to all variables -- Create with `terraform apply` -- Destroy all with `terraform destroy` +## Example: Azure Arc Kubernetes + +This example provisions the following Resources: + +## Creates + +1. A [Resource Group](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group) +2. A [Virtual Network](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network) +3. A [Subnet](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/subnet) +4. A [Linux Virtual Machine](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/linux_virtual_machine) +5. An [Arc Kubernetes Cluster](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/arc_kubernetes_cluster) +6. A [Kind Cluster](https://kind.sigs.k8s.io/) in [Linux Virtual Machine](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/linux_virtual_machine) by [remote-exec Provisioner](https://developer.hashicorp.com/terraform/language/resources/provisioners/remote-exec) +7. [Azure Arc agents](https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/conceptual-agent-overview) in [Kind Cluster](https://kind.sigs.k8s.io/) by [remote-exec Provisioner](https://developer.hashicorp.com/terraform/language/resources/provisioners/remote-exec) + +~> **NOTE:** To connect an existing Kubernetes cluster to Azure Arc, the following conditions must be met: + +* An [Arc Kubernetes Cluster](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/arc_kubernetes_cluster) must be created in Azure +* [Azure Arc agents](https://learn.microsoft.com/en-us/azure/azure-arc/kubernetes/conceptual-agent-overview) must be installed in the Kubernetes cluster which is connected to Azure + +## Usage + +- Provide values to all variables +- Create with `terraform apply` +- Destroy all with `terraform destroy` diff --git a/examples/arckubernetes/testdata/install_agent.py b/examples/arckubernetes/testdata/install_agent.py index feb2dccc40e7..05cb657bf4b4 100644 --- a/examples/arckubernetes/testdata/install_agent.py +++ b/examples/arckubernetes/testdata/install_agent.py @@ -1,251 +1,251 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -import argparse -import json -import logging as logger -import os -import platform -import shutil -import stat -import subprocess -import time -import urllib -from subprocess import PIPE, Popen -from urllib import request - -HELM_VERSION = 'v3.6.3' -HELM_STORAGE_URL = "https://k8connecthelm.azureedge.net" -Pre_Onboarding_Helm_Charts_Folder_Name = 'PreOnboardingChecksCharts' - - -def get_helm_registry(config_dp_endpoint): - # Setting uri - get_chart_location_url = "{}/{}/GetLatestHelmPackagePath?api-version=2019-11-01-preview".format( - config_dp_endpoint, 'azure-arc-k8sagents') - - try: - response = urllib.request.urlopen( - request.Request(get_chart_location_url, method="POST")) - except Exception as e: - raise Exception("Failed to get helm registry." + str(e)) - - try: - return json.load(response).get('repositoryPath') - except Exception as e: - raise Exception( - "Error while fetching helm chart registry path from JSON response: " + str(e)) - - -def pull_helm_chart(registry_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents', retry_count=5, retry_delay=3): - cmd_helm_chart_pull = [helm_client_location, - "chart", "pull", registry_path] - if kube_config: - cmd_helm_chart_pull.extend(["--kubeconfig", kube_config]) - if kube_context: - cmd_helm_chart_pull.extend(["--kube-context", kube_context]) - for i in range(retry_count): - response_helm_chart_pull = subprocess.Popen( - cmd_helm_chart_pull, stdout=PIPE, stderr=PIPE) - _, error_helm_chart_pull = response_helm_chart_pull.communicate() - if response_helm_chart_pull.returncode != 0: - if i == retry_count - 1: - raise Exception("Unable to pull {} helm chart from the registry '{}': ".format( - chart_name, registry_path) + error_helm_chart_pull.decode("ascii")) - time.sleep(retry_delay) - else: - break - - -def export_helm_chart(registry_path, chart_export_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents'): - cmd_helm_chart_export = [helm_client_location, "chart", - "export", registry_path, "--destination", chart_export_path] - if kube_config: - cmd_helm_chart_export.extend(["--kubeconfig", kube_config]) - if kube_context: - cmd_helm_chart_export.extend(["--kube-context", kube_context]) - response_helm_chart_export = subprocess.Popen( - cmd_helm_chart_export, stdout=PIPE, stderr=PIPE) - _, error_helm_chart_export = response_helm_chart_export.communicate() - if response_helm_chart_export.returncode != 0: - raise Exception("Unable to export {} helm chart from the registry '{}': ".format( - chart_name, registry_path) + error_helm_chart_export.decode("ascii")) - - -def get_chart_path(registry_path, kube_config, kube_context, helm_client_location, chart_folder_name='AzureArcCharts', chart_name='azure-arc-k8sagents'): - # Pulling helm chart from registry - os.environ['HELM_EXPERIMENTAL_OCI'] = '1' - pull_helm_chart(registry_path, kube_config, kube_context, - helm_client_location, chart_name) - - # Exporting helm chart after cleanup - chart_export_path = os.path.join( - os.path.expanduser('~'), '.azure', chart_folder_name) - try: - if os.path.isdir(chart_export_path): - shutil.rmtree(chart_export_path) - except: - logger.warning("Unable to cleanup the {} already present on the machine. In case of failure, please cleanup the directory '{}' and try again.".format( - chart_folder_name, chart_export_path)) - - export_helm_chart(registry_path, chart_export_path, kube_config, - kube_context, helm_client_location, chart_name) - - # Returning helm chart path - helm_chart_path = os.path.join(chart_export_path, chart_name) - if chart_folder_name == Pre_Onboarding_Helm_Charts_Folder_Name: - chart_path = helm_chart_path - else: - chart_path = os.getenv('HELMCHART') if os.getenv( - 'HELMCHART') else helm_chart_path - - return chart_path - - -def install_helm_client(): - # Fetch system related info - operating_system = platform.system().lower() - platform.machine() - - # Set helm binary download & install locations - if (operating_system == 'windows'): - download_location_string = f'.azure\\helm\\{HELM_VERSION}\\helm-{HELM_VERSION}-{operating_system}-amd64.zip' - install_location_string = f'.azure\\helm\\{HELM_VERSION}\\{operating_system}-amd64\\helm.exe' - requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.zip' - elif (operating_system == 'linux' or operating_system == 'darwin'): - download_location_string = f'.azure/helm/{HELM_VERSION}/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' - install_location_string = f'.azure/helm/{HELM_VERSION}/{operating_system}-amd64/helm' - requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' - else: - raise Exception( - f'The {operating_system} platform is not currently supported for installing helm client.') - - download_location = os.path.expanduser( - os.path.join('~', download_location_string)) - download_dir = os.path.dirname(download_location) - install_location = os.path.expanduser( - os.path.join('~', install_location_string)) - - # Download compressed halm binary if not already present - if not os.path.isfile(download_location): - # Creating the helm folder if it doesnt exist - if not os.path.exists(download_dir): - try: - os.makedirs(download_dir) - except Exception as e: - raise Exception("Failed to create helm directory." + str(e)) - - # Downloading compressed helm client executable - logger.warning( - "Downloading helm client for first time. This can take few minutes...") - try: - response = urllib.request.urlopen(requestUri) - except Exception as e: - raise Exception("Failed to download helm client." + str(e)) - - responseContent = response.read() - response.close() - - # Creating the compressed helm binaries - try: - with open(download_location, 'wb') as f: - f.write(responseContent) - except Exception as e: - raise Exception("Failed to create helm executable." + str(e)) - - # Extract compressed helm binary - if not os.path.isfile(install_location): - try: - shutil.unpack_archive(download_location, download_dir) - os.chmod(install_location, os.stat( - install_location).st_mode | stat.S_IXUSR) - except Exception as e: - raise Exception("Failed to extract helm executable." + str(e)) - - return install_location - - -def helm_install_release(chart_path, subscription_id, kubernetes_distro, kubernetes_infra, resource_group_name, cluster_name, - location, onboarding_tenant_id, private_key_pem, - no_wait, cloud_name, helm_client_location, onboarding_timeout="600"): - cmd_helm_install = [helm_client_location, "upgrade", "--install", "azure-arc", chart_path, - "--set", "global.subscriptionId={}".format( - subscription_id), - "--set", "global.kubernetesDistro={}".format( - kubernetes_distro), - "--set", "global.kubernetesInfra={}".format( - kubernetes_infra), - "--set", "global.resourceGroupName={}".format( - resource_group_name), - "--set", "global.resourceName={}".format(cluster_name), - "--set", "global.location={}".format(location), - "--set", "global.tenantId={}".format( - onboarding_tenant_id), - "--set", "global.onboardingPrivateKey={}".format( - private_key_pem), - "--set", "systemDefaultValues.spnOnboarding=false", - "--set", "global.azureEnvironment={}".format( - cloud_name), - "--set", "systemDefaultValues.clusterconnect-agent.enabled=true", - "--namespace", "{}".format("azure-arc-release"), - "--create-namespace", - "--output", "json"] - - if not no_wait: - # Change --timeout format for helm client to understand - onboarding_timeout = onboarding_timeout + "s" - cmd_helm_install.extend( - ["--wait", "--timeout", "{}".format(onboarding_timeout)]) - response_helm_install = Popen(cmd_helm_install, stdout=PIPE, stderr=PIPE) - _, error_helm_install = response_helm_install.communicate() - if response_helm_install.returncode != 0: - raise Exception("Unable to install helm release" + error_helm_install.decode("ascii")) - - -def install_agent(): - parser = argparse.ArgumentParser( - description='Install Connected Cluster Agent') - parser.add_argument('--subscriptionId', type=str, required=True) - parser.add_argument('--resourceGroupName', type=str, required=True) - parser.add_argument('--clusterName', type=str, required=True) - parser.add_argument('--location', type=str, required=True) - parser.add_argument('--tenantId', type=str, required=True) - parser.add_argument('--privatePem', type=str, required=True) - - try: - args = parser.parse_args() - except Exception as e: - raise Exception("Failed to parse arguments." + str(e)) - - try: - with open(args.privatePem, "r") as f: - privateKey = f.read() - except Exception as e: - raise Exception("Failed to get private key." + str(e)) - - # Install helm client - helm_client_location = install_helm_client() - - # Retrieving Helm chart OCI Artifact location - registry_path = get_helm_registry("https://westeurope.dp.kubernetesconfiguration.azure.com") - - # Get helm chart path - chart_path = get_chart_path( - registry_path, None, None, helm_client_location) - - helm_install_release(chart_path, - args.subscriptionId, - "generic", - "generic", - args.resourceGroupName, - args.clusterName, - args.location, - args.tenantId, - privateKey, - False, - "AZUREPUBLICCLOUD", - helm_client_location) - - -if __name__ == "__main__": - install_agent() +import argparse +import json +import logging as logger +import os +import platform +import shutil +import stat +import subprocess +import time +import urllib +from subprocess import PIPE, Popen +from urllib import request + +HELM_VERSION = 'v3.6.3' +HELM_STORAGE_URL = "https://k8connecthelm.azureedge.net" +Pre_Onboarding_Helm_Charts_Folder_Name = 'PreOnboardingChecksCharts' + + +def get_helm_registry(config_dp_endpoint): + # Setting uri + get_chart_location_url = "{}/{}/GetLatestHelmPackagePath?api-version=2019-11-01-preview".format( + config_dp_endpoint, 'azure-arc-k8sagents') + + try: + response = urllib.request.urlopen( + request.Request(get_chart_location_url, method="POST")) + except Exception as e: + raise Exception("Failed to get helm registry." + str(e)) + + try: + return json.load(response).get('repositoryPath') + except Exception as e: + raise Exception( + "Error while fetching helm chart registry path from JSON response: " + str(e)) + + +def pull_helm_chart(registry_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents', retry_count=5, retry_delay=3): + cmd_helm_chart_pull = [helm_client_location, + "chart", "pull", registry_path] + if kube_config: + cmd_helm_chart_pull.extend(["--kubeconfig", kube_config]) + if kube_context: + cmd_helm_chart_pull.extend(["--kube-context", kube_context]) + for i in range(retry_count): + response_helm_chart_pull = subprocess.Popen( + cmd_helm_chart_pull, stdout=PIPE, stderr=PIPE) + _, error_helm_chart_pull = response_helm_chart_pull.communicate() + if response_helm_chart_pull.returncode != 0: + if i == retry_count - 1: + raise Exception("Unable to pull {} helm chart from the registry '{}': ".format( + chart_name, registry_path) + error_helm_chart_pull.decode("ascii")) + time.sleep(retry_delay) + else: + break + + +def export_helm_chart(registry_path, chart_export_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents'): + cmd_helm_chart_export = [helm_client_location, "chart", + "export", registry_path, "--destination", chart_export_path] + if kube_config: + cmd_helm_chart_export.extend(["--kubeconfig", kube_config]) + if kube_context: + cmd_helm_chart_export.extend(["--kube-context", kube_context]) + response_helm_chart_export = subprocess.Popen( + cmd_helm_chart_export, stdout=PIPE, stderr=PIPE) + _, error_helm_chart_export = response_helm_chart_export.communicate() + if response_helm_chart_export.returncode != 0: + raise Exception("Unable to export {} helm chart from the registry '{}': ".format( + chart_name, registry_path) + error_helm_chart_export.decode("ascii")) + + +def get_chart_path(registry_path, kube_config, kube_context, helm_client_location, chart_folder_name='AzureArcCharts', chart_name='azure-arc-k8sagents'): + # Pulling helm chart from registry + os.environ['HELM_EXPERIMENTAL_OCI'] = '1' + pull_helm_chart(registry_path, kube_config, kube_context, + helm_client_location, chart_name) + + # Exporting helm chart after cleanup + chart_export_path = os.path.join( + os.path.expanduser('~'), '.azure', chart_folder_name) + try: + if os.path.isdir(chart_export_path): + shutil.rmtree(chart_export_path) + except: + logger.warning("Unable to cleanup the {} already present on the machine. In case of failure, please cleanup the directory '{}' and try again.".format( + chart_folder_name, chart_export_path)) + + export_helm_chart(registry_path, chart_export_path, kube_config, + kube_context, helm_client_location, chart_name) + + # Returning helm chart path + helm_chart_path = os.path.join(chart_export_path, chart_name) + if chart_folder_name == Pre_Onboarding_Helm_Charts_Folder_Name: + chart_path = helm_chart_path + else: + chart_path = os.getenv('HELMCHART') if os.getenv( + 'HELMCHART') else helm_chart_path + + return chart_path + + +def install_helm_client(): + # Fetch system related info + operating_system = platform.system().lower() + platform.machine() + + # Set helm binary download & install locations + if (operating_system == 'windows'): + download_location_string = f'.azure\\helm\\{HELM_VERSION}\\helm-{HELM_VERSION}-{operating_system}-amd64.zip' + install_location_string = f'.azure\\helm\\{HELM_VERSION}\\{operating_system}-amd64\\helm.exe' + requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.zip' + elif (operating_system == 'linux' or operating_system == 'darwin'): + download_location_string = f'.azure/helm/{HELM_VERSION}/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' + install_location_string = f'.azure/helm/{HELM_VERSION}/{operating_system}-amd64/helm' + requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' + else: + raise Exception( + f'The {operating_system} platform is not currently supported for installing helm client.') + + download_location = os.path.expanduser( + os.path.join('~', download_location_string)) + download_dir = os.path.dirname(download_location) + install_location = os.path.expanduser( + os.path.join('~', install_location_string)) + + # Download compressed halm binary if not already present + if not os.path.isfile(download_location): + # Creating the helm folder if it doesnt exist + if not os.path.exists(download_dir): + try: + os.makedirs(download_dir) + except Exception as e: + raise Exception("Failed to create helm directory." + str(e)) + + # Downloading compressed helm client executable + logger.warning( + "Downloading helm client for first time. This can take few minutes...") + try: + response = urllib.request.urlopen(requestUri) + except Exception as e: + raise Exception("Failed to download helm client." + str(e)) + + responseContent = response.read() + response.close() + + # Creating the compressed helm binaries + try: + with open(download_location, 'wb') as f: + f.write(responseContent) + except Exception as e: + raise Exception("Failed to create helm executable." + str(e)) + + # Extract compressed helm binary + if not os.path.isfile(install_location): + try: + shutil.unpack_archive(download_location, download_dir) + os.chmod(install_location, os.stat( + install_location).st_mode | stat.S_IXUSR) + except Exception as e: + raise Exception("Failed to extract helm executable." + str(e)) + + return install_location + + +def helm_install_release(chart_path, subscription_id, kubernetes_distro, kubernetes_infra, resource_group_name, cluster_name, + location, onboarding_tenant_id, private_key_pem, + no_wait, cloud_name, helm_client_location, onboarding_timeout="600"): + cmd_helm_install = [helm_client_location, "upgrade", "--install", "azure-arc", chart_path, + "--set", "global.subscriptionId={}".format( + subscription_id), + "--set", "global.kubernetesDistro={}".format( + kubernetes_distro), + "--set", "global.kubernetesInfra={}".format( + kubernetes_infra), + "--set", "global.resourceGroupName={}".format( + resource_group_name), + "--set", "global.resourceName={}".format(cluster_name), + "--set", "global.location={}".format(location), + "--set", "global.tenantId={}".format( + onboarding_tenant_id), + "--set", "global.onboardingPrivateKey={}".format( + private_key_pem), + "--set", "systemDefaultValues.spnOnboarding=false", + "--set", "global.azureEnvironment={}".format( + cloud_name), + "--set", "systemDefaultValues.clusterconnect-agent.enabled=true", + "--namespace", "{}".format("azure-arc-release"), + "--create-namespace", + "--output", "json"] + + if not no_wait: + # Change --timeout format for helm client to understand + onboarding_timeout = onboarding_timeout + "s" + cmd_helm_install.extend( + ["--wait", "--timeout", "{}".format(onboarding_timeout)]) + response_helm_install = Popen(cmd_helm_install, stdout=PIPE, stderr=PIPE) + _, error_helm_install = response_helm_install.communicate() + if response_helm_install.returncode != 0: + raise Exception("Unable to install helm release" + error_helm_install.decode("ascii")) + + +def install_agent(): + parser = argparse.ArgumentParser( + description='Install Connected Cluster Agent') + parser.add_argument('--subscriptionId', type=str, required=True) + parser.add_argument('--resourceGroupName', type=str, required=True) + parser.add_argument('--clusterName', type=str, required=True) + parser.add_argument('--location', type=str, required=True) + parser.add_argument('--tenantId', type=str, required=True) + parser.add_argument('--privatePem', type=str, required=True) + + try: + args = parser.parse_args() + except Exception as e: + raise Exception("Failed to parse arguments." + str(e)) + + try: + with open(args.privatePem, "r") as f: + privateKey = f.read() + except Exception as e: + raise Exception("Failed to get private key." + str(e)) + + # Install helm client + helm_client_location = install_helm_client() + + # Retrieving Helm chart OCI Artifact location + registry_path = get_helm_registry("https://westeurope.dp.kubernetesconfiguration.azure.com") + + # Get helm chart path + chart_path = get_chart_path( + registry_path, None, None, helm_client_location) + + helm_install_release(chart_path, + args.subscriptionId, + "generic", + "generic", + args.resourceGroupName, + args.clusterName, + args.location, + args.tenantId, + privateKey, + False, + "AZUREPUBLICCLOUD", + helm_client_location) + + +if __name__ == "__main__": + install_agent() diff --git a/examples/arckubernetes/testdata/kind.yaml b/examples/arckubernetes/testdata/kind.yaml index 04b3342955c7..2de5b96fd039 100644 --- a/examples/arckubernetes/testdata/kind.yaml +++ b/examples/arckubernetes/testdata/kind.yaml @@ -1,23 +1,23 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -nodes: -- role: control-plane - kubeadmConfigPatches: - - | - kind: InitConfiguration - nodeRegistration: - kubeletExtraArgs: - node-labels: "ingress-ready=true" - # port forward 80 on the host to 80 on this node - extraPortMappings: - - containerPort: 81 - hostPort: 81 - listenAddress: "127.0.0.1" - protocol: TCP - - containerPort: 443 - hostPort: 443 - listenAddress: "127.0.0.1" - protocol: TCP +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: +- role: control-plane + kubeadmConfigPatches: + - | + kind: InitConfiguration + nodeRegistration: + kubeletExtraArgs: + node-labels: "ingress-ready=true" + # port forward 80 on the host to 80 on this node + extraPortMappings: + - containerPort: 81 + hostPort: 81 + listenAddress: "127.0.0.1" + protocol: TCP + - containerPort: 443 + hostPort: 443 + listenAddress: "127.0.0.1" + protocol: TCP diff --git a/examples/arckubernetes/variables.tf b/examples/arckubernetes/variables.tf index bada20a5a093..4cdadacc35ab 100644 --- a/examples/arckubernetes/variables.tf +++ b/examples/arckubernetes/variables.tf @@ -1,29 +1,29 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -variable "prefix" { - description = "The prefix used for all resources in this example" -} - -variable "location" { - description = "The Azure location where all resources in this example should be created" -} - -variable "user_name" { - description = "The user name of virtual machine" -} - -variable "password" { - description = "The password of virtual machine" - sensitive = true -} - -# Refer to https://github.com/Azure/azure-cli-extensions/blob/ed3f463e9ef7980eff196504a8bb29800c123eba/src/connectedk8s/azext_connectedk8s/custom.py#L365 to generate the private key -variable "private_pem" { - description = "The private certificate used by the agent" -} - -# Refer to https://github.com/Azure/azure-cli-extensions/blob/ed3f463e9ef7980eff196504a8bb29800c123eba/src/connectedk8s/azext_connectedk8s/custom.py#L359 to generate the public key -variable "public_key" { - description = "The base64-encoded public certificate used by the agent" +variable "prefix" { + description = "The prefix used for all resources in this example" +} + +variable "location" { + description = "The Azure location where all resources in this example should be created" +} + +variable "user_name" { + description = "The user name of virtual machine" +} + +variable "password" { + description = "The password of virtual machine" + sensitive = true +} + +# Refer to https://github.com/Azure/azure-cli-extensions/blob/ed3f463e9ef7980eff196504a8bb29800c123eba/src/connectedk8s/azext_connectedk8s/custom.py#L365 to generate the private key +variable "private_pem" { + description = "The private certificate used by the agent" +} + +# Refer to https://github.com/Azure/azure-cli-extensions/blob/ed3f463e9ef7980eff196504a8bb29800c123eba/src/connectedk8s/azext_connectedk8s/custom.py#L359 to generate the public key +variable "public_key" { + description = "The base64-encoded public certificate used by the agent" } \ No newline at end of file diff --git a/examples/data-factory/shared-self-hosted/variables.tf b/examples/data-factory/shared-self-hosted/variables.tf index 0a7254b9a8c2..44b9bae61662 100644 --- a/examples/data-factory/shared-self-hosted/variables.tf +++ b/examples/data-factory/shared-self-hosted/variables.tf @@ -1,10 +1,10 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -variable "location" { - description = "The Azure location where all resources in this example should be created." -} - -variable "prefix" { - description = "The prefix used for all resources used by this NetApp Account" -} +variable "location" { + description = "The Azure location where all resources in this example should be created." +} + +variable "prefix" { + description = "The prefix used for all resources used by this NetApp Account" +} diff --git a/examples/mssql/mssqlvm/variables.tf b/examples/mssql/mssqlvm/variables.tf index 0a7254b9a8c2..44b9bae61662 100644 --- a/examples/mssql/mssqlvm/variables.tf +++ b/examples/mssql/mssqlvm/variables.tf @@ -1,10 +1,10 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -variable "location" { - description = "The Azure location where all resources in this example should be created." -} - -variable "prefix" { - description = "The prefix used for all resources used by this NetApp Account" -} +variable "location" { + description = "The Azure location where all resources in this example should be created." +} + +variable "prefix" { + description = "The prefix used for all resources used by this NetApp Account" +} diff --git a/examples/netapp/nfsv3_volume_cmk_userassigned/main.tf b/examples/netapp/nfsv3_volume_cmk_userassigned/main.tf old mode 100755 new mode 100644 diff --git a/examples/netapp/nfsv3_volume_cmk_userassigned/variables.tf b/examples/netapp/nfsv3_volume_cmk_userassigned/variables.tf old mode 100755 new mode 100644 diff --git a/examples/netapp/nfsv3_volume_with_backup_policy/main.tf b/examples/netapp/nfsv3_volume_with_backup_policy/main.tf old mode 100755 new mode 100644 index bff4aadd06f3..6664f0e2f50d --- a/examples/netapp/nfsv3_volume_with_backup_policy/main.tf +++ b/examples/netapp/nfsv3_volume_with_backup_policy/main.tf @@ -1,103 +1,103 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -provider "azurerm" { - features { - netapp { - prevent_volume_destruction = false - delete_backups_on_backup_vault_destroy = true - } - } -} - -resource "azurerm_resource_group" "example" { - name = "${var.prefix}-resources" - location = var.location -} - -resource "azurerm_virtual_network" "example" { - name = "${var.prefix}-virtualnetwork" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - address_space = ["10.0.0.0/16"] -} - -resource "azurerm_subnet" "example" { - name = "${var.prefix}-subnet" - resource_group_name = azurerm_resource_group.example.name - virtual_network_name = azurerm_virtual_network.example.name - address_prefixes = ["10.0.2.0/24"] - - delegation { - name = "testdelegation" - - service_delegation { - name = "Microsoft.Netapp/volumes" - actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] - } - } -} - -resource "azurerm_netapp_account" "example" { - name = "${var.prefix}-netappaccount" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name -} - -resource "azurerm_netapp_backup_vault" "example" { - name = "${var.prefix}-netappbackupvault" - resource_group_name = azurerm_resource_group.example.name - location = azurerm_resource_group.example.location - account_name = azurerm_netapp_account.example.name -} - -resource "azurerm_netapp_backup_policy" "example" { - name = "${var.prefix}-netappbackuppolicy" - resource_group_name = azurerm_resource_group.example.name - location = azurerm_resource_group.example.location - account_name = azurerm_netapp_account.example.name - daily_backups_to_keep = 2 - weekly_backups_to_keep = 2 - monthly_backups_to_keep = 2 - enabled = true -} - -resource "azurerm_netapp_pool" "example" { - name = "${var.prefix}-netapppool" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - service_level = "Standard" - size_in_tb = 4 -} - -resource "azurerm_netapp_volume" "example" { - lifecycle { - prevent_destroy = true - } - - name = "${var.prefix}-netappvolume" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - pool_name = azurerm_netapp_pool.example.name - volume_path = "${var.prefix}-netappvolume" - service_level = "Standard" - protocols = ["NFSv3"] - network_features = "Basic" - subnet_id = azurerm_subnet.example.id - storage_quota_in_gb = 100 - - data_protection_backup_policy { - backup_vault_id = azurerm_netapp_backup_vault.example.id - backup_policy_id = azurerm_netapp_backup_policy.example.id - policy_enabled = true - } - - export_policy_rule { - rule_index = 1 - allowed_clients = ["0.0.0.0/0"] - protocols_enabled = ["NFSv3"] - unix_read_write = true - } -} +provider "azurerm" { + features { + netapp { + prevent_volume_destruction = false + delete_backups_on_backup_vault_destroy = true + } + } +} + +resource "azurerm_resource_group" "example" { + name = "${var.prefix}-resources" + location = var.location +} + +resource "azurerm_virtual_network" "example" { + name = "${var.prefix}-virtualnetwork" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + address_space = ["10.0.0.0/16"] +} + +resource "azurerm_subnet" "example" { + name = "${var.prefix}-subnet" + resource_group_name = azurerm_resource_group.example.name + virtual_network_name = azurerm_virtual_network.example.name + address_prefixes = ["10.0.2.0/24"] + + delegation { + name = "testdelegation" + + service_delegation { + name = "Microsoft.Netapp/volumes" + actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] + } + } +} + +resource "azurerm_netapp_account" "example" { + name = "${var.prefix}-netappaccount" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name +} + +resource "azurerm_netapp_backup_vault" "example" { + name = "${var.prefix}-netappbackupvault" + resource_group_name = azurerm_resource_group.example.name + location = azurerm_resource_group.example.location + account_name = azurerm_netapp_account.example.name +} + +resource "azurerm_netapp_backup_policy" "example" { + name = "${var.prefix}-netappbackuppolicy" + resource_group_name = azurerm_resource_group.example.name + location = azurerm_resource_group.example.location + account_name = azurerm_netapp_account.example.name + daily_backups_to_keep = 2 + weekly_backups_to_keep = 2 + monthly_backups_to_keep = 2 + enabled = true +} + +resource "azurerm_netapp_pool" "example" { + name = "${var.prefix}-netapppool" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + service_level = "Standard" + size_in_tb = 4 +} + +resource "azurerm_netapp_volume" "example" { + lifecycle { + prevent_destroy = true + } + + name = "${var.prefix}-netappvolume" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + pool_name = azurerm_netapp_pool.example.name + volume_path = "${var.prefix}-netappvolume" + service_level = "Standard" + protocols = ["NFSv3"] + network_features = "Basic" + subnet_id = azurerm_subnet.example.id + storage_quota_in_gb = 100 + + data_protection_backup_policy { + backup_vault_id = azurerm_netapp_backup_vault.example.id + backup_policy_id = azurerm_netapp_backup_policy.example.id + policy_enabled = true + } + + export_policy_rule { + rule_index = 1 + allowed_clients = ["0.0.0.0/0"] + protocols_enabled = ["NFSv3"] + unix_read_write = true + } +} diff --git a/examples/netapp/nfsv3_volume_with_backup_policy/variables.tf b/examples/netapp/nfsv3_volume_with_backup_policy/variables.tf old mode 100755 new mode 100644 diff --git a/examples/netapp/nfsv3_volume_with_snapshot_policy/README.md b/examples/netapp/nfsv3_volume_with_snapshot_policy/README.md index 9965f2660ca4..d917f1d92639 100644 --- a/examples/netapp/nfsv3_volume_with_snapshot_policy/README.md +++ b/examples/netapp/nfsv3_volume_with_snapshot_policy/README.md @@ -1,5 +1,5 @@ -## Example: NetApp Files Snapshot Policy - -This example shows how to create an Azure NetApp Snapshot Policy and how to apply it to a volume. - +## Example: NetApp Files Snapshot Policy + +This example shows how to create an Azure NetApp Snapshot Policy and how to apply it to a volume. + For more information, please refer to [How Azure NetApp Files snapshots work](https://docs.microsoft.com/en-us/azure/azure-netapp-files/snapshots-introduction) and [Manage snapshot policies in Azure NetApp Files](https://docs.microsoft.com/en-us/azure/azure-netapp-files/snapshots-manage-policy). \ No newline at end of file diff --git a/examples/netapp/nfsv3_volume_with_snapshot_policy/main.tf b/examples/netapp/nfsv3_volume_with_snapshot_policy/main.tf old mode 100755 new mode 100644 index dde004f5e13e..4d94907a3c32 --- a/examples/netapp/nfsv3_volume_with_snapshot_policy/main.tf +++ b/examples/netapp/nfsv3_volume_with_snapshot_policy/main.tf @@ -1,104 +1,104 @@ -# Copyright (c) HashiCorp, Inc. -# SPDX-License-Identifier: MPL-2.0 - -provider "azurerm" { - features {} -} - -resource "azurerm_resource_group" "example" { - name = "${var.prefix}-resources" - location = var.location -} - -resource "azurerm_virtual_network" "example" { - name = "${var.prefix}-virtualnetwork" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - address_space = ["10.0.0.0/16"] -} - -resource "azurerm_subnet" "example" { - name = "${var.prefix}-subnet" - resource_group_name = azurerm_resource_group.example.name - virtual_network_name = azurerm_virtual_network.example.name - address_prefixes = ["10.0.2.0/24"] - - delegation { - name = "testdelegation" - - service_delegation { - name = "Microsoft.Netapp/volumes" - actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] - } - } -} - -resource "azurerm_netapp_account" "example" { - name = "${var.prefix}-netappaccount" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name -} - -resource "azurerm_netapp_snapshot_policy" "example" { - name = "${var.prefix}-snapshotpolicy" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - enabled = true - - hourly_schedule { - snapshots_to_keep = 4 - minute = 15 - } - - daily_schedule { - snapshots_to_keep = 2 - hour = 20 - minute = 15 - } - - weekly_schedule { - snapshots_to_keep = 1 - days_of_week = ["Monday", "Friday"] - hour = 23 - minute = 0 - } - - monthly_schedule { - snapshots_to_keep = 1 - days_of_month = [1, 15, 20, 30] - hour = 5 - minute = 45 - } -} - -resource "azurerm_netapp_pool" "example" { - name = "${var.prefix}-netapppool" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - service_level = "Standard" - size_in_tb = 4 -} - -resource "azurerm_netapp_volume" "example" { - lifecycle { - prevent_destroy = true - } - - name = "${var.prefix}-netappvolume" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - pool_name = azurerm_netapp_pool.example.name - volume_path = "${var.prefix}-netappvolume" - service_level = "Standard" - protocols = ["NFSv3"] - subnet_id = azurerm_subnet.example.id - storage_quota_in_gb = 100 - security_style = "unix" - - data_protection_snapshot_policy { - snapshot_policy_id = azurerm_netapp_snapshot_policy.example.id - } -} +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: MPL-2.0 + +provider "azurerm" { + features {} +} + +resource "azurerm_resource_group" "example" { + name = "${var.prefix}-resources" + location = var.location +} + +resource "azurerm_virtual_network" "example" { + name = "${var.prefix}-virtualnetwork" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + address_space = ["10.0.0.0/16"] +} + +resource "azurerm_subnet" "example" { + name = "${var.prefix}-subnet" + resource_group_name = azurerm_resource_group.example.name + virtual_network_name = azurerm_virtual_network.example.name + address_prefixes = ["10.0.2.0/24"] + + delegation { + name = "testdelegation" + + service_delegation { + name = "Microsoft.Netapp/volumes" + actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] + } + } +} + +resource "azurerm_netapp_account" "example" { + name = "${var.prefix}-netappaccount" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name +} + +resource "azurerm_netapp_snapshot_policy" "example" { + name = "${var.prefix}-snapshotpolicy" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + enabled = true + + hourly_schedule { + snapshots_to_keep = 4 + minute = 15 + } + + daily_schedule { + snapshots_to_keep = 2 + hour = 20 + minute = 15 + } + + weekly_schedule { + snapshots_to_keep = 1 + days_of_week = ["Monday", "Friday"] + hour = 23 + minute = 0 + } + + monthly_schedule { + snapshots_to_keep = 1 + days_of_month = [1, 15, 20, 30] + hour = 5 + minute = 45 + } +} + +resource "azurerm_netapp_pool" "example" { + name = "${var.prefix}-netapppool" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + service_level = "Standard" + size_in_tb = 4 +} + +resource "azurerm_netapp_volume" "example" { + lifecycle { + prevent_destroy = true + } + + name = "${var.prefix}-netappvolume" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + pool_name = azurerm_netapp_pool.example.name + volume_path = "${var.prefix}-netappvolume" + service_level = "Standard" + protocols = ["NFSv3"] + subnet_id = azurerm_subnet.example.id + storage_quota_in_gb = 100 + security_style = "unix" + + data_protection_snapshot_policy { + snapshot_policy_id = azurerm_netapp_snapshot_policy.example.id + } +} diff --git a/examples/netapp/nfsv3_volume_with_snapshot_policy/variables.tf b/examples/netapp/nfsv3_volume_with_snapshot_policy/variables.tf old mode 100755 new mode 100644 diff --git a/examples/netapp/volume_crr/README.md b/examples/netapp/volume_crr/README.md index aa01f7c7f180..2607ce5db99a 100644 --- a/examples/netapp/volume_crr/README.md +++ b/examples/netapp/volume_crr/README.md @@ -1,5 +1,5 @@ -## Example: NetApp Files Volume with Cross-Region Replication data protection enabled - -This example shows how to create an Azure NetApp Files Volume with data protection enabled through cross-region replication feature. - +## Example: NetApp Files Volume with Cross-Region Replication data protection enabled + +This example shows how to create an Azure NetApp Files Volume with data protection enabled through cross-region replication feature. + For more information, please refer to [Cross-region replication of Azure NetApp Files volumes](https://docs.microsoft.com/en-us/azure/azure-netapp-files/cross-region-replication-introduction). \ No newline at end of file diff --git a/examples/netapp/volume_crr/main.tf b/examples/netapp/volume_crr/main.tf index b1ed77eb2fed..fda17fc41e32 100644 --- a/examples/netapp/volume_crr/main.tf +++ b/examples/netapp/volume_crr/main.tf @@ -1,146 +1,146 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -provider "azurerm" { - features {} -} - -resource "azurerm_resource_group" "example" { - name = "${var.prefix}-resources" - location = var.location -} - -resource "azurerm_virtual_network" "example_primary" { - name = "${var.prefix}-virtualnetwork-primary" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - address_space = ["10.0.0.0/16"] -} - -resource "azurerm_subnet" "example_primary" { - name = "${var.prefix}-subnet" - resource_group_name = azurerm_resource_group.example.name - virtual_network_name = azurerm_virtual_network.example_primary.name - address_prefixes = ["10.0.2.0/24"] - - delegation { - name = "testdelegation" - - service_delegation { - name = "Microsoft.Netapp/volumes" - actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] - } - } -} - -resource "azurerm_virtual_network" "example_secondary" { - name = "${var.prefix}-virtualnetwork-secondary" - location = var.alt_location - resource_group_name = azurerm_resource_group.example.name - address_space = ["10.1.0.0/16"] -} - -resource "azurerm_subnet" "example_secondary" { - name = "${var.prefix}-subnet" - resource_group_name = azurerm_resource_group.example.name - virtual_network_name = azurerm_virtual_network.example_secondary.name - address_prefixes = ["10.1.2.0/24"] - - delegation { - name = "testdelegation" - - service_delegation { - name = "Microsoft.Netapp/volumes" - actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] - } - } -} - -resource "azurerm_netapp_account" "example_primary" { - name = "${var.prefix}-netappaccount-primary" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name -} - -resource "azurerm_netapp_account" "example_secondary" { - name = "${var.prefix}-netappaccount-secondary" - location = var.alt_location - resource_group_name = azurerm_resource_group.example.name -} - -resource "azurerm_netapp_pool" "example_primary" { - name = "${var.prefix}-netapppool-primary" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example_primary.name - service_level = "Premium" - size_in_tb = 4 -} - -resource "azurerm_netapp_pool" "example_secondary" { - name = "${var.prefix}-netapppool-secondary" - location = var.alt_location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example_secondary.name - service_level = "Standard" - size_in_tb = 4 -} - -resource "azurerm_netapp_volume" "example_primary" { - lifecycle { - prevent_destroy = true - } - - name = "${var.prefix}-netappvolume-primary" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example_primary.name - pool_name = azurerm_netapp_pool.example_primary.name - volume_path = "${var.prefix}-netappvolume" - service_level = "Standard" - protocols = ["NFSv3"] - subnet_id = azurerm_subnet.example_primary.id - storage_quota_in_gb = 100 - - export_policy_rule { - rule_index = 1 - allowed_clients = ["0.0.0.0/0"] - protocols_enabled = ["NFSv3"] - unix_read_only = false - unix_read_write = true - } -} - -resource "azurerm_netapp_volume" "example_secondary" { - lifecycle { - prevent_destroy = true - } - - depends_on = [azurerm_netapp_volume.example_primary] - - name = "${var.prefix}-netappvolume-secondary" - location = var.alt_location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example_secondary.name - pool_name = azurerm_netapp_pool.example_secondary.name - volume_path = "${var.prefix}-netappvolume-secondary" - service_level = "Standard" - protocols = ["NFSv3"] - subnet_id = azurerm_subnet.example_secondary.id - storage_quota_in_gb = 100 - - export_policy_rule { - rule_index = 1 - allowed_clients = ["0.0.0.0/0"] - protocols_enabled = ["NFSv3"] - unix_read_only = false - unix_read_write = true - } - - data_protection_replication { - endpoint_type = "dst" - remote_volume_location = azurerm_resource_group.example.location - remote_volume_resource_id = azurerm_netapp_volume.example_primary.id - replication_frequency = "10minutes" - } -} +provider "azurerm" { + features {} +} + +resource "azurerm_resource_group" "example" { + name = "${var.prefix}-resources" + location = var.location +} + +resource "azurerm_virtual_network" "example_primary" { + name = "${var.prefix}-virtualnetwork-primary" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + address_space = ["10.0.0.0/16"] +} + +resource "azurerm_subnet" "example_primary" { + name = "${var.prefix}-subnet" + resource_group_name = azurerm_resource_group.example.name + virtual_network_name = azurerm_virtual_network.example_primary.name + address_prefixes = ["10.0.2.0/24"] + + delegation { + name = "testdelegation" + + service_delegation { + name = "Microsoft.Netapp/volumes" + actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] + } + } +} + +resource "azurerm_virtual_network" "example_secondary" { + name = "${var.prefix}-virtualnetwork-secondary" + location = var.alt_location + resource_group_name = azurerm_resource_group.example.name + address_space = ["10.1.0.0/16"] +} + +resource "azurerm_subnet" "example_secondary" { + name = "${var.prefix}-subnet" + resource_group_name = azurerm_resource_group.example.name + virtual_network_name = azurerm_virtual_network.example_secondary.name + address_prefixes = ["10.1.2.0/24"] + + delegation { + name = "testdelegation" + + service_delegation { + name = "Microsoft.Netapp/volumes" + actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] + } + } +} + +resource "azurerm_netapp_account" "example_primary" { + name = "${var.prefix}-netappaccount-primary" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name +} + +resource "azurerm_netapp_account" "example_secondary" { + name = "${var.prefix}-netappaccount-secondary" + location = var.alt_location + resource_group_name = azurerm_resource_group.example.name +} + +resource "azurerm_netapp_pool" "example_primary" { + name = "${var.prefix}-netapppool-primary" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example_primary.name + service_level = "Premium" + size_in_tb = 4 +} + +resource "azurerm_netapp_pool" "example_secondary" { + name = "${var.prefix}-netapppool-secondary" + location = var.alt_location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example_secondary.name + service_level = "Standard" + size_in_tb = 4 +} + +resource "azurerm_netapp_volume" "example_primary" { + lifecycle { + prevent_destroy = true + } + + name = "${var.prefix}-netappvolume-primary" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example_primary.name + pool_name = azurerm_netapp_pool.example_primary.name + volume_path = "${var.prefix}-netappvolume" + service_level = "Standard" + protocols = ["NFSv3"] + subnet_id = azurerm_subnet.example_primary.id + storage_quota_in_gb = 100 + + export_policy_rule { + rule_index = 1 + allowed_clients = ["0.0.0.0/0"] + protocols_enabled = ["NFSv3"] + unix_read_only = false + unix_read_write = true + } +} + +resource "azurerm_netapp_volume" "example_secondary" { + lifecycle { + prevent_destroy = true + } + + depends_on = [azurerm_netapp_volume.example_primary] + + name = "${var.prefix}-netappvolume-secondary" + location = var.alt_location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example_secondary.name + pool_name = azurerm_netapp_pool.example_secondary.name + volume_path = "${var.prefix}-netappvolume-secondary" + service_level = "Standard" + protocols = ["NFSv3"] + subnet_id = azurerm_subnet.example_secondary.id + storage_quota_in_gb = 100 + + export_policy_rule { + rule_index = 1 + allowed_clients = ["0.0.0.0/0"] + protocols_enabled = ["NFSv3"] + unix_read_only = false + unix_read_write = true + } + + data_protection_replication { + endpoint_type = "dst" + remote_volume_location = azurerm_resource_group.example.location + remote_volume_resource_id = azurerm_netapp_volume.example_primary.id + replication_frequency = "10minutes" + } +} diff --git a/examples/netapp/volume_from_snapshot/README.md b/examples/netapp/volume_from_snapshot/README.md index db917c29d693..a45b0525c725 100644 --- a/examples/netapp/volume_from_snapshot/README.md +++ b/examples/netapp/volume_from_snapshot/README.md @@ -1,5 +1,5 @@ -## Example: NetApp Files Volume creation from Snapshot - -This example shows how to create an Azure NetApp Files Volume from a Snapshot. - +## Example: NetApp Files Volume creation from Snapshot + +This example shows how to create an Azure NetApp Files Volume from a Snapshot. + For more information, please refer to [How Azure NetApp Files snapshots work](https://docs.microsoft.com/en-us/azure/azure-netapp-files/snapshots-introduction). \ No newline at end of file diff --git a/examples/netapp/volume_from_snapshot/main.tf b/examples/netapp/volume_from_snapshot/main.tf index 1121fd178aea..4c4556e35949 100644 --- a/examples/netapp/volume_from_snapshot/main.tf +++ b/examples/netapp/volume_from_snapshot/main.tf @@ -1,99 +1,99 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -provider "azurerm" { - features {} -} - -resource "azurerm_resource_group" "example" { - name = "${var.prefix}-resources" - location = var.location -} - -resource "azurerm_virtual_network" "example" { - name = "${var.prefix}-virtualnetwork" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - address_space = ["10.0.0.0/16"] -} - -resource "azurerm_subnet" "example" { - name = "${var.prefix}-subnet" - resource_group_name = azurerm_resource_group.example.name - virtual_network_name = azurerm_virtual_network.example.name - address_prefixes = ["10.0.2.0/24"] - - delegation { - name = "testdelegation" - - service_delegation { - name = "Microsoft.Netapp/volumes" - actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] - } - } -} - -resource "azurerm_netapp_account" "example" { - name = "${var.prefix}-netappaccount" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name -} - -resource "azurerm_netapp_pool" "example" { - name = "${var.prefix}-netapppool" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - service_level = "Standard" - size_in_tb = 4 -} - -resource "azurerm_netapp_volume" "example" { - name = "${var.prefix}-netappvolume" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - pool_name = azurerm_netapp_pool.example.name - volume_path = "${var.prefix}-netappvolume" - service_level = "Standard" - protocols = ["NFSv3"] - subnet_id = azurerm_subnet.example.id - storage_quota_in_gb = 100 - - export_policy_rule { - rule_index = 1 - allowed_clients = ["0.0.0.0/0"] - protocols_enabled = ["NFSv3"] - unix_read_write = true - } -} - -resource "azurerm_netapp_snapshot" "example" { - name = "${var.prefix}-netappsnapshot" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - pool_name = azurerm_netapp_pool.example.name - volume_name = azurerm_netapp_volume.example.name -} - -resource "azurerm_netapp_volume" "example-snapshot" { - name = "${var.prefix}-netappvolume-snapshot" - location = azurerm_resource_group.example.location - resource_group_name = azurerm_resource_group.example.name - account_name = azurerm_netapp_account.example.name - pool_name = azurerm_netapp_pool.example.name - volume_path = "${var.prefix}-netappvolume-snapshot" - service_level = "Standard" - protocols = ["NFSv3"] - subnet_id = azurerm_subnet.example.id - storage_quota_in_gb = 100 - create_from_snapshot_resource_id = azurerm_netapp_snapshot.example.id - - export_policy_rule { - rule_index = 1 - allowed_clients = ["0.0.0.0/0"] - protocols_enabled = ["NFSv3"] - unix_read_write = true - } -} +provider "azurerm" { + features {} +} + +resource "azurerm_resource_group" "example" { + name = "${var.prefix}-resources" + location = var.location +} + +resource "azurerm_virtual_network" "example" { + name = "${var.prefix}-virtualnetwork" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + address_space = ["10.0.0.0/16"] +} + +resource "azurerm_subnet" "example" { + name = "${var.prefix}-subnet" + resource_group_name = azurerm_resource_group.example.name + virtual_network_name = azurerm_virtual_network.example.name + address_prefixes = ["10.0.2.0/24"] + + delegation { + name = "testdelegation" + + service_delegation { + name = "Microsoft.Netapp/volumes" + actions = ["Microsoft.Network/networkinterfaces/*", "Microsoft.Network/virtualNetworks/subnets/join/action"] + } + } +} + +resource "azurerm_netapp_account" "example" { + name = "${var.prefix}-netappaccount" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name +} + +resource "azurerm_netapp_pool" "example" { + name = "${var.prefix}-netapppool" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + service_level = "Standard" + size_in_tb = 4 +} + +resource "azurerm_netapp_volume" "example" { + name = "${var.prefix}-netappvolume" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + pool_name = azurerm_netapp_pool.example.name + volume_path = "${var.prefix}-netappvolume" + service_level = "Standard" + protocols = ["NFSv3"] + subnet_id = azurerm_subnet.example.id + storage_quota_in_gb = 100 + + export_policy_rule { + rule_index = 1 + allowed_clients = ["0.0.0.0/0"] + protocols_enabled = ["NFSv3"] + unix_read_write = true + } +} + +resource "azurerm_netapp_snapshot" "example" { + name = "${var.prefix}-netappsnapshot" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + pool_name = azurerm_netapp_pool.example.name + volume_name = azurerm_netapp_volume.example.name +} + +resource "azurerm_netapp_volume" "example-snapshot" { + name = "${var.prefix}-netappvolume-snapshot" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + account_name = azurerm_netapp_account.example.name + pool_name = azurerm_netapp_pool.example.name + volume_path = "${var.prefix}-netappvolume-snapshot" + service_level = "Standard" + protocols = ["NFSv3"] + subnet_id = azurerm_subnet.example.id + storage_quota_in_gb = 100 + create_from_snapshot_resource_id = azurerm_netapp_snapshot.example.id + + export_policy_rule { + rule_index = 1 + allowed_clients = ["0.0.0.0/0"] + protocols_enabled = ["NFSv3"] + unix_read_write = true + } +} diff --git a/examples/sql-azure/failover_group/variables.tf b/examples/sql-azure/failover_group/variables.tf index 3e2beb12eed8..855129e44aad 100644 --- a/examples/sql-azure/failover_group/variables.tf +++ b/examples/sql-azure/failover_group/variables.tf @@ -1,14 +1,14 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -variable "location" { - description = "The Azure location where the primary resources in this example should be created." -} - -variable "location_alt" { - description = "The Azure location where the secondary resources in this example should be created." -} - -variable "prefix" { - description = "The prefix used for all resources created as a part of this example" -} +variable "location" { + description = "The Azure location where the primary resources in this example should be created." +} + +variable "location_alt" { + description = "The Azure location where the secondary resources in this example should be created." +} + +variable "prefix" { + description = "The prefix used for all resources created as a part of this example" +} diff --git a/examples/sql-azure/sql_auditing_eventhub/variables.tf b/examples/sql-azure/sql_auditing_eventhub/variables.tf index 4b04df9d18cd..ad85266de792 100644 --- a/examples/sql-azure/sql_auditing_eventhub/variables.tf +++ b/examples/sql-azure/sql_auditing_eventhub/variables.tf @@ -1,10 +1,10 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -variable "location" { - description = "The Azure location where the primary resources in this example should be created." -} - -variable "prefix" { - description = "The prefix used for all resources created as a part of this example" -} +variable "location" { + description = "The Azure location where the primary resources in this example should be created." +} + +variable "prefix" { + description = "The prefix used for all resources created as a part of this example" +} diff --git a/examples/sql-azure/sql_server_auditing_log_analytics/variables.tf b/examples/sql-azure/sql_server_auditing_log_analytics/variables.tf index 4b04df9d18cd..ad85266de792 100644 --- a/examples/sql-azure/sql_server_auditing_log_analytics/variables.tf +++ b/examples/sql-azure/sql_server_auditing_log_analytics/variables.tf @@ -1,10 +1,10 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -variable "location" { - description = "The Azure location where the primary resources in this example should be created." -} - -variable "prefix" { - description = "The prefix used for all resources created as a part of this example" -} +variable "location" { + description = "The Azure location where the primary resources in this example should be created." +} + +variable "prefix" { + description = "The prefix used for all resources created as a part of this example" +} diff --git a/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/deploy.ci.sh b/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/deploy.ci.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/deploy.mac.sh b/examples/virtual-machines/virtual_machine/2-vms-loadbalancer-lbrules/deploy.mac.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/deploy.ci.sh b/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/deploy.ci.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/deploy.mac.sh b/examples/virtual-machines/virtual_machine/encrypt-running-linux-vm/deploy.mac.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/openshift-origin/deploy.ci.sh b/examples/virtual-machines/virtual_machine/openshift-origin/deploy.ci.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/openshift-origin/deploy.mac.sh b/examples/virtual-machines/virtual_machine/openshift-origin/deploy.mac.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/deploy.ci.sh b/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/deploy.ci.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/deploy.mac.sh b/examples/virtual-machines/virtual_machine/spark-and-cassandra-on-centos/deploy.mac.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/deploy.ci.sh b/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/deploy.ci.sh old mode 100755 new mode 100644 diff --git a/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/deploy.mac.sh b/examples/virtual-machines/virtual_machine/unmanaged-disks/from-existing-storage-account/deploy.mac.sh old mode 100755 new mode 100644 diff --git a/internal/services/apimanagement/testdata/api_management_api_openapi.yaml b/internal/services/apimanagement/testdata/api_management_api_openapi.yaml index a1ad16311bfb..4c4a8919bf78 100644 --- a/internal/services/apimanagement/testdata/api_management_api_openapi.yaml +++ b/internal/services/apimanagement/testdata/api_management_api_openapi.yaml @@ -1,36 +1,36 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -openapi: 3.0.0 -info: - title: api1 - description: api - version: 1.0.0 -servers: - - url: "https://terraform.com/test/v1/api1" - description: test -paths: - /default: - post: - operationId: default - summary: Default - description: Default operation - responses: - "200": - description: Accepted - content: - application/json: - schema: - $ref: "#/components/schemas/response" -components: - schemas: - response: - type: object - properties: - status: - type: string - example: success - securitySchemes: - basicAuth: - type: http +openapi: 3.0.0 +info: + title: api1 + description: api + version: 1.0.0 +servers: + - url: "https://terraform.com/test/v1/api1" + description: test +paths: + /default: + post: + operationId: default + summary: Default + description: Default operation + responses: + "200": + description: Accepted + content: + application/json: + schema: + $ref: "#/components/schemas/response" +components: + schemas: + response: + type: object + properties: + status: + type: string + example: success + securitySchemes: + basicAuth: + type: http scheme: basic \ No newline at end of file diff --git a/internal/services/apimanagement/testdata/api_management_api_test.cer b/internal/services/apimanagement/testdata/api_management_api_test.cer old mode 100755 new mode 100644 diff --git a/internal/services/apimanagement/testdata/api_management_testdata.sh b/internal/services/apimanagement/testdata/api_management_testdata.sh old mode 100755 new mode 100644 diff --git a/internal/services/appservice/testdata/run.csx b/internal/services/appservice/testdata/run.csx index 7ad38c1c369d..b3ba58f7c5e8 100644 --- a/internal/services/appservice/testdata/run.csx +++ b/internal/services/appservice/testdata/run.csx @@ -1,23 +1,23 @@ -#r "Newtonsoft.Json" - -using System.Net; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; -using Newtonsoft.Json; - -public static async Task Run(HttpRequest req, ILogger log) -{ - log.LogInformation("C# HTTP trigger function processed a request."); - - string name = req.Query["name"]; - - string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); - dynamic data = JsonConvert.DeserializeObject(requestBody); - name = name ?? data?.name; - - string responseMessage = string.IsNullOrEmpty(name) - ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." - : $"Hello, {name}. This HTTP triggered function executed successfully."; - - return new OkObjectResult(responseMessage); -} +#r "Newtonsoft.Json" + +using System.Net; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Primitives; +using Newtonsoft.Json; + +public static async Task Run(HttpRequest req, ILogger log) +{ + log.LogInformation("C# HTTP trigger function processed a request."); + + string name = req.Query["name"]; + + string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); + dynamic data = JsonConvert.DeserializeObject(requestBody); + name = name ?? data?.name; + + string responseMessage = string.IsNullOrEmpty(name) + ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." + : $"Hello, {name}. This HTTP triggered function executed successfully."; + + return new OkObjectResult(responseMessage); +} diff --git a/internal/services/arckubernetes/testdata/install_agent.py b/internal/services/arckubernetes/testdata/install_agent.py index feb2dccc40e7..05cb657bf4b4 100644 --- a/internal/services/arckubernetes/testdata/install_agent.py +++ b/internal/services/arckubernetes/testdata/install_agent.py @@ -1,251 +1,251 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -import argparse -import json -import logging as logger -import os -import platform -import shutil -import stat -import subprocess -import time -import urllib -from subprocess import PIPE, Popen -from urllib import request - -HELM_VERSION = 'v3.6.3' -HELM_STORAGE_URL = "https://k8connecthelm.azureedge.net" -Pre_Onboarding_Helm_Charts_Folder_Name = 'PreOnboardingChecksCharts' - - -def get_helm_registry(config_dp_endpoint): - # Setting uri - get_chart_location_url = "{}/{}/GetLatestHelmPackagePath?api-version=2019-11-01-preview".format( - config_dp_endpoint, 'azure-arc-k8sagents') - - try: - response = urllib.request.urlopen( - request.Request(get_chart_location_url, method="POST")) - except Exception as e: - raise Exception("Failed to get helm registry." + str(e)) - - try: - return json.load(response).get('repositoryPath') - except Exception as e: - raise Exception( - "Error while fetching helm chart registry path from JSON response: " + str(e)) - - -def pull_helm_chart(registry_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents', retry_count=5, retry_delay=3): - cmd_helm_chart_pull = [helm_client_location, - "chart", "pull", registry_path] - if kube_config: - cmd_helm_chart_pull.extend(["--kubeconfig", kube_config]) - if kube_context: - cmd_helm_chart_pull.extend(["--kube-context", kube_context]) - for i in range(retry_count): - response_helm_chart_pull = subprocess.Popen( - cmd_helm_chart_pull, stdout=PIPE, stderr=PIPE) - _, error_helm_chart_pull = response_helm_chart_pull.communicate() - if response_helm_chart_pull.returncode != 0: - if i == retry_count - 1: - raise Exception("Unable to pull {} helm chart from the registry '{}': ".format( - chart_name, registry_path) + error_helm_chart_pull.decode("ascii")) - time.sleep(retry_delay) - else: - break - - -def export_helm_chart(registry_path, chart_export_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents'): - cmd_helm_chart_export = [helm_client_location, "chart", - "export", registry_path, "--destination", chart_export_path] - if kube_config: - cmd_helm_chart_export.extend(["--kubeconfig", kube_config]) - if kube_context: - cmd_helm_chart_export.extend(["--kube-context", kube_context]) - response_helm_chart_export = subprocess.Popen( - cmd_helm_chart_export, stdout=PIPE, stderr=PIPE) - _, error_helm_chart_export = response_helm_chart_export.communicate() - if response_helm_chart_export.returncode != 0: - raise Exception("Unable to export {} helm chart from the registry '{}': ".format( - chart_name, registry_path) + error_helm_chart_export.decode("ascii")) - - -def get_chart_path(registry_path, kube_config, kube_context, helm_client_location, chart_folder_name='AzureArcCharts', chart_name='azure-arc-k8sagents'): - # Pulling helm chart from registry - os.environ['HELM_EXPERIMENTAL_OCI'] = '1' - pull_helm_chart(registry_path, kube_config, kube_context, - helm_client_location, chart_name) - - # Exporting helm chart after cleanup - chart_export_path = os.path.join( - os.path.expanduser('~'), '.azure', chart_folder_name) - try: - if os.path.isdir(chart_export_path): - shutil.rmtree(chart_export_path) - except: - logger.warning("Unable to cleanup the {} already present on the machine. In case of failure, please cleanup the directory '{}' and try again.".format( - chart_folder_name, chart_export_path)) - - export_helm_chart(registry_path, chart_export_path, kube_config, - kube_context, helm_client_location, chart_name) - - # Returning helm chart path - helm_chart_path = os.path.join(chart_export_path, chart_name) - if chart_folder_name == Pre_Onboarding_Helm_Charts_Folder_Name: - chart_path = helm_chart_path - else: - chart_path = os.getenv('HELMCHART') if os.getenv( - 'HELMCHART') else helm_chart_path - - return chart_path - - -def install_helm_client(): - # Fetch system related info - operating_system = platform.system().lower() - platform.machine() - - # Set helm binary download & install locations - if (operating_system == 'windows'): - download_location_string = f'.azure\\helm\\{HELM_VERSION}\\helm-{HELM_VERSION}-{operating_system}-amd64.zip' - install_location_string = f'.azure\\helm\\{HELM_VERSION}\\{operating_system}-amd64\\helm.exe' - requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.zip' - elif (operating_system == 'linux' or operating_system == 'darwin'): - download_location_string = f'.azure/helm/{HELM_VERSION}/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' - install_location_string = f'.azure/helm/{HELM_VERSION}/{operating_system}-amd64/helm' - requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' - else: - raise Exception( - f'The {operating_system} platform is not currently supported for installing helm client.') - - download_location = os.path.expanduser( - os.path.join('~', download_location_string)) - download_dir = os.path.dirname(download_location) - install_location = os.path.expanduser( - os.path.join('~', install_location_string)) - - # Download compressed halm binary if not already present - if not os.path.isfile(download_location): - # Creating the helm folder if it doesnt exist - if not os.path.exists(download_dir): - try: - os.makedirs(download_dir) - except Exception as e: - raise Exception("Failed to create helm directory." + str(e)) - - # Downloading compressed helm client executable - logger.warning( - "Downloading helm client for first time. This can take few minutes...") - try: - response = urllib.request.urlopen(requestUri) - except Exception as e: - raise Exception("Failed to download helm client." + str(e)) - - responseContent = response.read() - response.close() - - # Creating the compressed helm binaries - try: - with open(download_location, 'wb') as f: - f.write(responseContent) - except Exception as e: - raise Exception("Failed to create helm executable." + str(e)) - - # Extract compressed helm binary - if not os.path.isfile(install_location): - try: - shutil.unpack_archive(download_location, download_dir) - os.chmod(install_location, os.stat( - install_location).st_mode | stat.S_IXUSR) - except Exception as e: - raise Exception("Failed to extract helm executable." + str(e)) - - return install_location - - -def helm_install_release(chart_path, subscription_id, kubernetes_distro, kubernetes_infra, resource_group_name, cluster_name, - location, onboarding_tenant_id, private_key_pem, - no_wait, cloud_name, helm_client_location, onboarding_timeout="600"): - cmd_helm_install = [helm_client_location, "upgrade", "--install", "azure-arc", chart_path, - "--set", "global.subscriptionId={}".format( - subscription_id), - "--set", "global.kubernetesDistro={}".format( - kubernetes_distro), - "--set", "global.kubernetesInfra={}".format( - kubernetes_infra), - "--set", "global.resourceGroupName={}".format( - resource_group_name), - "--set", "global.resourceName={}".format(cluster_name), - "--set", "global.location={}".format(location), - "--set", "global.tenantId={}".format( - onboarding_tenant_id), - "--set", "global.onboardingPrivateKey={}".format( - private_key_pem), - "--set", "systemDefaultValues.spnOnboarding=false", - "--set", "global.azureEnvironment={}".format( - cloud_name), - "--set", "systemDefaultValues.clusterconnect-agent.enabled=true", - "--namespace", "{}".format("azure-arc-release"), - "--create-namespace", - "--output", "json"] - - if not no_wait: - # Change --timeout format for helm client to understand - onboarding_timeout = onboarding_timeout + "s" - cmd_helm_install.extend( - ["--wait", "--timeout", "{}".format(onboarding_timeout)]) - response_helm_install = Popen(cmd_helm_install, stdout=PIPE, stderr=PIPE) - _, error_helm_install = response_helm_install.communicate() - if response_helm_install.returncode != 0: - raise Exception("Unable to install helm release" + error_helm_install.decode("ascii")) - - -def install_agent(): - parser = argparse.ArgumentParser( - description='Install Connected Cluster Agent') - parser.add_argument('--subscriptionId', type=str, required=True) - parser.add_argument('--resourceGroupName', type=str, required=True) - parser.add_argument('--clusterName', type=str, required=True) - parser.add_argument('--location', type=str, required=True) - parser.add_argument('--tenantId', type=str, required=True) - parser.add_argument('--privatePem', type=str, required=True) - - try: - args = parser.parse_args() - except Exception as e: - raise Exception("Failed to parse arguments." + str(e)) - - try: - with open(args.privatePem, "r") as f: - privateKey = f.read() - except Exception as e: - raise Exception("Failed to get private key." + str(e)) - - # Install helm client - helm_client_location = install_helm_client() - - # Retrieving Helm chart OCI Artifact location - registry_path = get_helm_registry("https://westeurope.dp.kubernetesconfiguration.azure.com") - - # Get helm chart path - chart_path = get_chart_path( - registry_path, None, None, helm_client_location) - - helm_install_release(chart_path, - args.subscriptionId, - "generic", - "generic", - args.resourceGroupName, - args.clusterName, - args.location, - args.tenantId, - privateKey, - False, - "AZUREPUBLICCLOUD", - helm_client_location) - - -if __name__ == "__main__": - install_agent() +import argparse +import json +import logging as logger +import os +import platform +import shutil +import stat +import subprocess +import time +import urllib +from subprocess import PIPE, Popen +from urllib import request + +HELM_VERSION = 'v3.6.3' +HELM_STORAGE_URL = "https://k8connecthelm.azureedge.net" +Pre_Onboarding_Helm_Charts_Folder_Name = 'PreOnboardingChecksCharts' + + +def get_helm_registry(config_dp_endpoint): + # Setting uri + get_chart_location_url = "{}/{}/GetLatestHelmPackagePath?api-version=2019-11-01-preview".format( + config_dp_endpoint, 'azure-arc-k8sagents') + + try: + response = urllib.request.urlopen( + request.Request(get_chart_location_url, method="POST")) + except Exception as e: + raise Exception("Failed to get helm registry." + str(e)) + + try: + return json.load(response).get('repositoryPath') + except Exception as e: + raise Exception( + "Error while fetching helm chart registry path from JSON response: " + str(e)) + + +def pull_helm_chart(registry_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents', retry_count=5, retry_delay=3): + cmd_helm_chart_pull = [helm_client_location, + "chart", "pull", registry_path] + if kube_config: + cmd_helm_chart_pull.extend(["--kubeconfig", kube_config]) + if kube_context: + cmd_helm_chart_pull.extend(["--kube-context", kube_context]) + for i in range(retry_count): + response_helm_chart_pull = subprocess.Popen( + cmd_helm_chart_pull, stdout=PIPE, stderr=PIPE) + _, error_helm_chart_pull = response_helm_chart_pull.communicate() + if response_helm_chart_pull.returncode != 0: + if i == retry_count - 1: + raise Exception("Unable to pull {} helm chart from the registry '{}': ".format( + chart_name, registry_path) + error_helm_chart_pull.decode("ascii")) + time.sleep(retry_delay) + else: + break + + +def export_helm_chart(registry_path, chart_export_path, kube_config, kube_context, helm_client_location, chart_name='azure-arc-k8sagents'): + cmd_helm_chart_export = [helm_client_location, "chart", + "export", registry_path, "--destination", chart_export_path] + if kube_config: + cmd_helm_chart_export.extend(["--kubeconfig", kube_config]) + if kube_context: + cmd_helm_chart_export.extend(["--kube-context", kube_context]) + response_helm_chart_export = subprocess.Popen( + cmd_helm_chart_export, stdout=PIPE, stderr=PIPE) + _, error_helm_chart_export = response_helm_chart_export.communicate() + if response_helm_chart_export.returncode != 0: + raise Exception("Unable to export {} helm chart from the registry '{}': ".format( + chart_name, registry_path) + error_helm_chart_export.decode("ascii")) + + +def get_chart_path(registry_path, kube_config, kube_context, helm_client_location, chart_folder_name='AzureArcCharts', chart_name='azure-arc-k8sagents'): + # Pulling helm chart from registry + os.environ['HELM_EXPERIMENTAL_OCI'] = '1' + pull_helm_chart(registry_path, kube_config, kube_context, + helm_client_location, chart_name) + + # Exporting helm chart after cleanup + chart_export_path = os.path.join( + os.path.expanduser('~'), '.azure', chart_folder_name) + try: + if os.path.isdir(chart_export_path): + shutil.rmtree(chart_export_path) + except: + logger.warning("Unable to cleanup the {} already present on the machine. In case of failure, please cleanup the directory '{}' and try again.".format( + chart_folder_name, chart_export_path)) + + export_helm_chart(registry_path, chart_export_path, kube_config, + kube_context, helm_client_location, chart_name) + + # Returning helm chart path + helm_chart_path = os.path.join(chart_export_path, chart_name) + if chart_folder_name == Pre_Onboarding_Helm_Charts_Folder_Name: + chart_path = helm_chart_path + else: + chart_path = os.getenv('HELMCHART') if os.getenv( + 'HELMCHART') else helm_chart_path + + return chart_path + + +def install_helm_client(): + # Fetch system related info + operating_system = platform.system().lower() + platform.machine() + + # Set helm binary download & install locations + if (operating_system == 'windows'): + download_location_string = f'.azure\\helm\\{HELM_VERSION}\\helm-{HELM_VERSION}-{operating_system}-amd64.zip' + install_location_string = f'.azure\\helm\\{HELM_VERSION}\\{operating_system}-amd64\\helm.exe' + requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.zip' + elif (operating_system == 'linux' or operating_system == 'darwin'): + download_location_string = f'.azure/helm/{HELM_VERSION}/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' + install_location_string = f'.azure/helm/{HELM_VERSION}/{operating_system}-amd64/helm' + requestUri = f'{HELM_STORAGE_URL}/helm/helm-{HELM_VERSION}-{operating_system}-amd64.tar.gz' + else: + raise Exception( + f'The {operating_system} platform is not currently supported for installing helm client.') + + download_location = os.path.expanduser( + os.path.join('~', download_location_string)) + download_dir = os.path.dirname(download_location) + install_location = os.path.expanduser( + os.path.join('~', install_location_string)) + + # Download compressed halm binary if not already present + if not os.path.isfile(download_location): + # Creating the helm folder if it doesnt exist + if not os.path.exists(download_dir): + try: + os.makedirs(download_dir) + except Exception as e: + raise Exception("Failed to create helm directory." + str(e)) + + # Downloading compressed helm client executable + logger.warning( + "Downloading helm client for first time. This can take few minutes...") + try: + response = urllib.request.urlopen(requestUri) + except Exception as e: + raise Exception("Failed to download helm client." + str(e)) + + responseContent = response.read() + response.close() + + # Creating the compressed helm binaries + try: + with open(download_location, 'wb') as f: + f.write(responseContent) + except Exception as e: + raise Exception("Failed to create helm executable." + str(e)) + + # Extract compressed helm binary + if not os.path.isfile(install_location): + try: + shutil.unpack_archive(download_location, download_dir) + os.chmod(install_location, os.stat( + install_location).st_mode | stat.S_IXUSR) + except Exception as e: + raise Exception("Failed to extract helm executable." + str(e)) + + return install_location + + +def helm_install_release(chart_path, subscription_id, kubernetes_distro, kubernetes_infra, resource_group_name, cluster_name, + location, onboarding_tenant_id, private_key_pem, + no_wait, cloud_name, helm_client_location, onboarding_timeout="600"): + cmd_helm_install = [helm_client_location, "upgrade", "--install", "azure-arc", chart_path, + "--set", "global.subscriptionId={}".format( + subscription_id), + "--set", "global.kubernetesDistro={}".format( + kubernetes_distro), + "--set", "global.kubernetesInfra={}".format( + kubernetes_infra), + "--set", "global.resourceGroupName={}".format( + resource_group_name), + "--set", "global.resourceName={}".format(cluster_name), + "--set", "global.location={}".format(location), + "--set", "global.tenantId={}".format( + onboarding_tenant_id), + "--set", "global.onboardingPrivateKey={}".format( + private_key_pem), + "--set", "systemDefaultValues.spnOnboarding=false", + "--set", "global.azureEnvironment={}".format( + cloud_name), + "--set", "systemDefaultValues.clusterconnect-agent.enabled=true", + "--namespace", "{}".format("azure-arc-release"), + "--create-namespace", + "--output", "json"] + + if not no_wait: + # Change --timeout format for helm client to understand + onboarding_timeout = onboarding_timeout + "s" + cmd_helm_install.extend( + ["--wait", "--timeout", "{}".format(onboarding_timeout)]) + response_helm_install = Popen(cmd_helm_install, stdout=PIPE, stderr=PIPE) + _, error_helm_install = response_helm_install.communicate() + if response_helm_install.returncode != 0: + raise Exception("Unable to install helm release" + error_helm_install.decode("ascii")) + + +def install_agent(): + parser = argparse.ArgumentParser( + description='Install Connected Cluster Agent') + parser.add_argument('--subscriptionId', type=str, required=True) + parser.add_argument('--resourceGroupName', type=str, required=True) + parser.add_argument('--clusterName', type=str, required=True) + parser.add_argument('--location', type=str, required=True) + parser.add_argument('--tenantId', type=str, required=True) + parser.add_argument('--privatePem', type=str, required=True) + + try: + args = parser.parse_args() + except Exception as e: + raise Exception("Failed to parse arguments." + str(e)) + + try: + with open(args.privatePem, "r") as f: + privateKey = f.read() + except Exception as e: + raise Exception("Failed to get private key." + str(e)) + + # Install helm client + helm_client_location = install_helm_client() + + # Retrieving Helm chart OCI Artifact location + registry_path = get_helm_registry("https://westeurope.dp.kubernetesconfiguration.azure.com") + + # Get helm chart path + chart_path = get_chart_path( + registry_path, None, None, helm_client_location) + + helm_install_release(chart_path, + args.subscriptionId, + "generic", + "generic", + args.resourceGroupName, + args.clusterName, + args.location, + args.tenantId, + privateKey, + False, + "AZUREPUBLICCLOUD", + helm_client_location) + + +if __name__ == "__main__": + install_agent() diff --git a/internal/services/arckubernetes/testdata/kind.yaml b/internal/services/arckubernetes/testdata/kind.yaml index 04b3342955c7..2de5b96fd039 100644 --- a/internal/services/arckubernetes/testdata/kind.yaml +++ b/internal/services/arckubernetes/testdata/kind.yaml @@ -1,23 +1,23 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -nodes: -- role: control-plane - kubeadmConfigPatches: - - | - kind: InitConfiguration - nodeRegistration: - kubeletExtraArgs: - node-labels: "ingress-ready=true" - # port forward 80 on the host to 80 on this node - extraPortMappings: - - containerPort: 81 - hostPort: 81 - listenAddress: "127.0.0.1" - protocol: TCP - - containerPort: 443 - hostPort: 443 - listenAddress: "127.0.0.1" - protocol: TCP +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: +- role: control-plane + kubeadmConfigPatches: + - | + kind: InitConfiguration + nodeRegistration: + kubeletExtraArgs: + node-labels: "ingress-ready=true" + # port forward 80 on the host to 80 on this node + extraPortMappings: + - containerPort: 81 + hostPort: 81 + listenAddress: "127.0.0.1" + protocol: TCP + - containerPort: 443 + hostPort: 443 + listenAddress: "127.0.0.1" + protocol: TCP diff --git a/internal/services/automation/testdata/automation_certificate_testdata.sh b/internal/services/automation/testdata/automation_certificate_testdata.sh old mode 100755 new mode 100644 diff --git a/internal/services/batch/testdata/batch_certificate.cer b/internal/services/batch/testdata/batch_certificate.cer index 577947b220d7..ff420aff3f9c 100644 --- a/internal/services/batch/testdata/batch_certificate.cer +++ b/internal/services/batch/testdata/batch_certificate.cer @@ -1,21 +1,21 @@ ------BEGIN CERTIFICATE----- -MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV -BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x -FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy -ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ -BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR -QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp -HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML -mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 -hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s -616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw -TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO -421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR -Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W -qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 -IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A -MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO -ZWkFvE7Y5lW0oVSAfin5TwTJMQ== +-----BEGIN CERTIFICATE----- +MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV +BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x +FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy +ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ +BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR +QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp +HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML +mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 +hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s +616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw +TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO +421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR +Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W +qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 +IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A +MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO +ZWkFvE7Y5lW0oVSAfin5TwTJMQ== -----END CERTIFICATE----- \ No newline at end of file diff --git a/internal/services/datashare/testdata/application_gateway_test.cer b/internal/services/datashare/testdata/application_gateway_test.cer index 577947b220d7..ff420aff3f9c 100644 --- a/internal/services/datashare/testdata/application_gateway_test.cer +++ b/internal/services/datashare/testdata/application_gateway_test.cer @@ -1,21 +1,21 @@ ------BEGIN CERTIFICATE----- -MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV -BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x -FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy -ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ -BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR -QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp -HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML -mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 -hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s -616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw -TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO -421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR -Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W -qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 -IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A -MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO -ZWkFvE7Y5lW0oVSAfin5TwTJMQ== +-----BEGIN CERTIFICATE----- +MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV +BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x +FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy +ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ +BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR +QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp +HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML +mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 +hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s +616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw +TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO +421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR +Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W +qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 +IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A +MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO +ZWkFvE7Y5lW0oVSAfin5TwTJMQ== -----END CERTIFICATE----- \ No newline at end of file diff --git a/internal/services/iothub/testdata/application_gateway_test.cer b/internal/services/iothub/testdata/application_gateway_test.cer index 577947b220d7..ff420aff3f9c 100644 --- a/internal/services/iothub/testdata/application_gateway_test.cer +++ b/internal/services/iothub/testdata/application_gateway_test.cer @@ -1,21 +1,21 @@ ------BEGIN CERTIFICATE----- -MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV -BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x -FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy -ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ -BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR -QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp -HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML -mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 -hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s -616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw -TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO -421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR -Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W -qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 -IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A -MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO -ZWkFvE7Y5lW0oVSAfin5TwTJMQ== +-----BEGIN CERTIFICATE----- +MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV +BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x +FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy +ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ +BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR +QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp +HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML +mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 +hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s +616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw +TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO +421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR +Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W +qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 +IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A +MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO +ZWkFvE7Y5lW0oVSAfin5TwTJMQ== -----END CERTIFICATE----- \ No newline at end of file diff --git a/internal/services/iothub/testdata/batch_certificate.cer b/internal/services/iothub/testdata/batch_certificate.cer index 577947b220d7..ff420aff3f9c 100644 --- a/internal/services/iothub/testdata/batch_certificate.cer +++ b/internal/services/iothub/testdata/batch_certificate.cer @@ -1,21 +1,21 @@ ------BEGIN CERTIFICATE----- -MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV -BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x -FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy -ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ -BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR -QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp -HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML -mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 -hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s -616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw -TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO -421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR -Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W -qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 -IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A -MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO -ZWkFvE7Y5lW0oVSAfin5TwTJMQ== +-----BEGIN CERTIFICATE----- +MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV +BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x +FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy +ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ +BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR +QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp +HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML +mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 +hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s +616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw +TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO +421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR +Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W +qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 +IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A +MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO +ZWkFvE7Y5lW0oVSAfin5TwTJMQ== -----END CERTIFICATE----- \ No newline at end of file diff --git a/internal/services/iothub/testdata/iothub_test.cer b/internal/services/iothub/testdata/iothub_test.cer old mode 100755 new mode 100644 diff --git a/internal/services/logic/testdata/log4net.dll b/internal/services/logic/testdata/log4net.dll deleted file mode 100644 index b926f6fc45dc45c240aead45fdef2e75e6c23565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270336 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

i=Mnuro}peEV`}UmXA?=wuz-4t$Bs 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 K|1UAn@&5v8gVwVE diff --git a/internal/services/network/testdata/application_gateway_test.cer b/internal/services/network/testdata/application_gateway_test.cer index 577947b220d7..ff420aff3f9c 100644 --- a/internal/services/network/testdata/application_gateway_test.cer +++ b/internal/services/network/testdata/application_gateway_test.cer @@ -1,21 +1,21 @@ ------BEGIN CERTIFICATE----- -MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV -BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x -FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy -ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ -BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR -QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp -HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML -mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 -hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s -616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw -TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO -421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR -Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W -qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 -IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A -MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO -ZWkFvE7Y5lW0oVSAfin5TwTJMQ== +-----BEGIN CERTIFICATE----- +MIIDbzCCAlegAwIBAgIJAIzjRD36sIbbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV +BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYDVQQKDAl0ZXJyYWZvcm0x +FTATBgNVBAMMDHRlcnJhZm9ybS5pbzAgFw0xNzA0MjEyMDA1MjdaGA8yMTE3MDMy +ODIwMDUyN1owTTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQ +BgNVBAoMCXRlcnJhZm9ybTEVMBMGA1UEAwwMdGVycmFmb3JtLmlvMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3L9L5szT4+FLykTFNyyPjy/k3BQTYAfR +QzP2dhnsuUKm3cdPC0NyZ+wEXIUGhoDO2YG6EYChOl8fsDqDOjloSUGKqYw++nlp +HIuUgJx8IxxG2XkALCjFU7EmF+w7kn76d0ezpEIYxnLP+KG2DVornoEt1aLhv1ML +mpgEZZPhDbMSLhSYWeTVRMayXLwqtfgnDumQSB+8d/1JuJqrSI4pD12JozVThzb6 +hsjfb6RMX4epPmrGn0PbTPEEA6awmsxBCXB0s13nNQt/O0hLM2agwvAyozilQV+s +616Ckgk6DJoUkqZhDy7vPYMIRSr98fBws6zkrV6tTLjmD8xAvobePQIDAQABo1Aw +TjAdBgNVHQ4EFgQUXIqO421zMMmbcRRX9wctZFCQuPIwHwYDVR0jBBgwFoAUXIqO +421zMMmbcRRX9wctZFCQuPIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAr82NeT3BYJOKLlUL6Om5LjUF66ewcJjG9ltdvyQwVneMcq7t5UAPxgChzqNR +Vk4da8PzkXpjBJyWezHupdJNX3XqeUk2kSxqQ6/gmhqvfI3y7djrwoO6jvMEY26W +qtkTNORWDP3THJJVimC3zV+KMU5UBVrEzhOVhHSU709lBP75o0BBn3xGsPqSq9k8 +IotIFfyAc6a+XP3+ZMpvh7wqAUml7vWa5wlcXExCx39h1balfDSLGNC4swWPCp9A +MnQR0p+vMay9hNP1Eh+9QYUai14d5KS3cFV+KxE1cJR5HD/iLltnnOEbpMsB0eVO +ZWkFvE7Y5lW0oVSAfin5TwTJMQ== -----END CERTIFICATE----- \ No newline at end of file diff --git a/internal/services/springcloud/testdata/cer b/internal/services/springcloud/testdata/cer index e2eb9a4dfdb9..64942a8aac7a 100644 --- a/internal/services/springcloud/testdata/cer +++ b/internal/services/springcloud/testdata/cer @@ -1,17 +1,17 @@ ------BEGIN CERTIFICATE----- -MIICsjCCAZoCCQCMdt7DvygPtDANBgkqhkiG9w0BAQsFADAbMRkwFwYDVQQDDBBh -cGkudGVycmFmb3JtLmlvMB4XDTE4MDcwNTEwMzMzMFoXDTI4MDcwMjEwMzMzMFow -GzEZMBcGA1UEAwwQYXBpLnRlcnJhZm9ybS5pbzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKQW332Ol28CsidAheD1aL9Ul8JWnKLdaVxKZ3ssl5CXjPDO -mM7IXk0SgbQnUC8lIlPFZiDGbQ1sB6OTMun6ZZ4ipLp80dtl0roCLtCnDQOBGzCN -ArCYAoXRurjkXEY7tpD0wwtU72+37h3HQ4g0VS6VItJCqJ9QADV+HO2ZWuZTez70 -MhoL6OLfZP7HGYdJDKgfEVNF5XlbVzNAGkDIJFdhjNxyGGu5Nfsm1pfQhAyunkk7 -JVamjUg5IojRdo63IS9wwzMOdeGSAbBcsJfYeCfVg2kupR8q0TmZ+x93RmmOlbSi -66kEYxRzZ9YCQeHJmn1YfJ92BpCUiy9A6Z1iaKUCAwEAATANBgkqhkiG9w0BAQsF -AAOCAQEAJ7JhlecP7J48wI2QHTMbAMkkWBv/iWq1/QIF4ugH3Zb5PorOv+NfhQ0L -lWiw/SzN8Ae95vUixAGYHMSa28oumM5K1OsqKEkVIo1AoBH8nBz+VcTpRD/mHXot -AHPAZt9j5LqeHX+enR6RbINAf3jn+YU3MdVe0MsADdFASVDfjmQP2R7o9aJb/QqO -g3bZBWsiBDEISfyaH2+pgUM7wtwEoFWmEMlgjLK1MRBs1cDZXqnHaCd/rs+NmWV9 -naEu7x5fyQOk4HozkpweR+Jx1sBlTRsa49/qSHt/6ULKfO01/cTs4iF71ykXPbh3 -Kj9cI2uo9aYtXkxkhKrGyUpA7FJqWw== ------END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICsjCCAZoCCQCMdt7DvygPtDANBgkqhkiG9w0BAQsFADAbMRkwFwYDVQQDDBBh +cGkudGVycmFmb3JtLmlvMB4XDTE4MDcwNTEwMzMzMFoXDTI4MDcwMjEwMzMzMFow +GzEZMBcGA1UEAwwQYXBpLnRlcnJhZm9ybS5pbzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKQW332Ol28CsidAheD1aL9Ul8JWnKLdaVxKZ3ssl5CXjPDO +mM7IXk0SgbQnUC8lIlPFZiDGbQ1sB6OTMun6ZZ4ipLp80dtl0roCLtCnDQOBGzCN +ArCYAoXRurjkXEY7tpD0wwtU72+37h3HQ4g0VS6VItJCqJ9QADV+HO2ZWuZTez70 +MhoL6OLfZP7HGYdJDKgfEVNF5XlbVzNAGkDIJFdhjNxyGGu5Nfsm1pfQhAyunkk7 +JVamjUg5IojRdo63IS9wwzMOdeGSAbBcsJfYeCfVg2kupR8q0TmZ+x93RmmOlbSi +66kEYxRzZ9YCQeHJmn1YfJ92BpCUiy9A6Z1iaKUCAwEAATANBgkqhkiG9w0BAQsF +AAOCAQEAJ7JhlecP7J48wI2QHTMbAMkkWBv/iWq1/QIF4ugH3Zb5PorOv+NfhQ0L +lWiw/SzN8Ae95vUixAGYHMSa28oumM5K1OsqKEkVIo1AoBH8nBz+VcTpRD/mHXot +AHPAZt9j5LqeHX+enR6RbINAf3jn+YU3MdVe0MsADdFASVDfjmQP2R7o9aJb/QqO +g3bZBWsiBDEISfyaH2+pgUM7wtwEoFWmEMlgjLK1MRBs1cDZXqnHaCd/rs+NmWV9 +naEu7x5fyQOk4HozkpweR+Jx1sBlTRsa49/qSHt/6ULKfO01/cTs4iF71ykXPbh3 +Kj9cI2uo9aYtXkxkhKrGyUpA7FJqWw== +-----END CERTIFICATE----- diff --git a/internal/tools/document-lint/README.md b/internal/tools/document-lint/README.md index 5d62a5a5a1c0..3362cac31ddb 100644 --- a/internal/tools/document-lint/README.md +++ b/internal/tools/document-lint/README.md @@ -1,23 +1,23 @@ -# Introduction -This tool detects and fixes inconsistencies in the AzureRM Terraform Provider resource documentation. - -## The following can be checked/fixed: -1. Formatting of documentation. -2. The Required/Optional value of properties. -3. The Default value of properties. -4. The ForceNew value of properties. -5. The TimeOut value of create/update/read/delete functions. -6. Properties that are present in the schema but missing in the documentation and vice versa. -7. The list of PossibleValues. - -# Getting Started -```bash -# print the usage -go run main.go -h - -# check documents and print the error information -go run main.go check - -# check and try to fix existing errors -go run main.go fix +# Introduction +This tool detects and fixes inconsistencies in the AzureRM Terraform Provider resource documentation. + +## The following can be checked/fixed: +1. Formatting of documentation. +2. The Required/Optional value of properties. +3. The Default value of properties. +4. The ForceNew value of properties. +5. The TimeOut value of create/update/read/delete functions. +6. Properties that are present in the schema but missing in the documentation and vice versa. +7. The list of PossibleValues. + +# Getting Started +```bash +# print the usage +go run main.go -h + +# check documents and print the error information +go run main.go check + +# check and try to fix existing errors +go run main.go fix ``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml old mode 100755 new mode 100644 diff --git a/scripts/check-test-package.sh b/scripts/check-test-package.sh old mode 100755 new mode 100644 diff --git a/scripts/gofmtcheck.sh b/scripts/gofmtcheck.sh old mode 100755 new mode 100644 diff --git a/scripts/gogetcookie.sh b/scripts/gogetcookie.sh old mode 100755 new mode 100644 diff --git a/scripts/goimport-file.sh b/scripts/goimport-file.sh old mode 100755 new mode 100644 diff --git a/scripts/plugin-sdk-fixerupper.sh b/scripts/plugin-sdk-fixerupper.sh old mode 100755 new mode 100644 diff --git a/scripts/release.sh b/scripts/release.sh old mode 100755 new mode 100644 diff --git a/scripts/run-breaking-change-detection.sh b/scripts/run-breaking-change-detection.sh old mode 100755 new mode 100644 diff --git a/scripts/run-gradually-deprecated.sh b/scripts/run-gradually-deprecated.sh old mode 100755 new mode 100644 diff --git a/scripts/run-lint.sh b/scripts/run-lint.sh old mode 100755 new mode 100644 diff --git a/scripts/run-static-analysis.sh b/scripts/run-static-analysis.sh old mode 100755 new mode 100644 diff --git a/scripts/run-test.sh b/scripts/run-test.sh old mode 100755 new mode 100644 diff --git a/scripts/run-tflint.sh b/scripts/run-tflint.sh old mode 100755 new mode 100644 diff --git a/scripts/scaffold-website.sh b/scripts/scaffold-website.sh old mode 100755 new mode 100644 diff --git a/scripts/stats-pandora-sdks.sh b/scripts/stats-pandora-sdks.sh old mode 100755 new mode 100644 diff --git a/scripts/terrafmt-acctests.sh b/scripts/terrafmt-acctests.sh old mode 100755 new mode 100644 diff --git a/scripts/terrafmt-website.sh b/scripts/terrafmt-website.sh old mode 100755 new mode 100644 diff --git a/scripts/timeouts.sh b/scripts/timeouts.sh old mode 100755 new mode 100644 diff --git a/scripts/track2-check.sh b/scripts/track2-check.sh old mode 100755 new mode 100644 diff --git a/scripts/update-deps.sh b/scripts/update-deps.sh old mode 100755 new mode 100644 diff --git a/scripts/validate-examples.sh b/scripts/validate-examples.sh old mode 100755 new mode 100644 diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/applicationinsights/2015-05-01/componentproactivedetectionapis/model_applicationinsightscomponentproactivedetectionconfigurationruledefinitions.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/applicationinsights/2015-05-01/componentproactivedetectionapis/model_applicationinsightscomponentproactivedetectionconfigurationruledefinitions.go deleted file mode 100644 index 134d46c2ac84..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/applicationinsights/2015-05-01/componentproactivedetectionapis/model_applicationinsightscomponentproactivedetectionconfigurationruledefinitions.go +++ /dev/null @@ -1,15 +0,0 @@ -package componentproactivedetectionapis - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type ApplicationInsightsComponentProactiveDetectionConfigurationRuleDefinitions struct { - Description *string `json:"Description,omitempty"` - DisplayName *string `json:"DisplayName,omitempty"` - HelpURL *string `json:"HelpUrl,omitempty"` - IsEnabledByDefault *bool `json:"IsEnabledByDefault,omitempty"` - IsHidden *bool `json:"IsHidden,omitempty"` - IsInPreview *bool `json:"IsInPreview,omitempty"` - Name *string `json:"Name,omitempty"` - SupportsEmailNotifications *bool `json:"SupportsEmailNotifications,omitempty"` -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/README.md b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/README.md deleted file mode 100644 index 0b18678cbba1..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/README.md +++ /dev/null @@ -1,86 +0,0 @@ - -## `github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site` Documentation - -The `site` SDK allows for interaction with Azure Resource Manager `mobilenetwork` (API Version `2022-11-01`). - -This readme covers example usages, but further information on [using this SDK can be found in the project root](https://github.com/hashicorp/go-azure-sdk/tree/main/docs). - -### Import Path - -```go -import "github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site" -``` - - -### Client Initialization - -```go -client := site.NewSiteClientWithBaseURI("https://management.azure.com") -client.Client.Authorizer = authorizer -``` - - -### Example Usage: `SiteClient.CreateOrUpdate` - -```go -ctx := context.TODO() -id := site.NewSiteID("12345678-1234-9876-4563-123456789012", "example-resource-group", "mobileNetworkName", "siteName") - -payload := site.Site{ - // ... -} - - -if err := client.CreateOrUpdateThenPoll(ctx, id, payload); err != nil { - // handle the error -} -``` - - -### Example Usage: `SiteClient.Delete` - -```go -ctx := context.TODO() -id := site.NewSiteID("12345678-1234-9876-4563-123456789012", "example-resource-group", "mobileNetworkName", "siteName") - -if err := client.DeleteThenPoll(ctx, id); err != nil { - // handle the error -} -``` - - -### Example Usage: `SiteClient.Get` - -```go -ctx := context.TODO() -id := site.NewSiteID("12345678-1234-9876-4563-123456789012", "example-resource-group", "mobileNetworkName", "siteName") - -read, err := client.Get(ctx, id) -if err != nil { - // handle the error -} -if model := read.Model; model != nil { - // do something with the model/response object -} -``` - - -### Example Usage: `SiteClient.UpdateTags` - -```go -ctx := context.TODO() -id := site.NewSiteID("12345678-1234-9876-4563-123456789012", "example-resource-group", "mobileNetworkName", "siteName") - -payload := site.TagsObject{ - // ... -} - - -read, err := client.UpdateTags(ctx, id, payload) -if err != nil { - // handle the error -} -if model := read.Model; model != nil { - // do something with the model/response object -} -``` diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/client.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/client.go deleted file mode 100644 index bab4d23cff87..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/client.go +++ /dev/null @@ -1,26 +0,0 @@ -package site - -import ( - "fmt" - - "github.com/hashicorp/go-azure-sdk/sdk/client/resourcemanager" - sdkEnv "github.com/hashicorp/go-azure-sdk/sdk/environments" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type SiteClient struct { - Client *resourcemanager.Client -} - -func NewSiteClientWithBaseURI(sdkApi sdkEnv.Api) (*SiteClient, error) { - client, err := resourcemanager.NewClient(sdkApi, "site", defaultApiVersion) - if err != nil { - return nil, fmt.Errorf("instantiating SiteClient: %+v", err) - } - - return &SiteClient{ - Client: client, - }, nil -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/constants.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/constants.go deleted file mode 100644 index c486645f2e3e..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/constants.go +++ /dev/null @@ -1,66 +0,0 @@ -package site - -import ( - "encoding/json" - "fmt" - "strings" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type ProvisioningState string - -const ( - ProvisioningStateAccepted ProvisioningState = "Accepted" - ProvisioningStateCanceled ProvisioningState = "Canceled" - ProvisioningStateDeleted ProvisioningState = "Deleted" - ProvisioningStateDeleting ProvisioningState = "Deleting" - ProvisioningStateFailed ProvisioningState = "Failed" - ProvisioningStateSucceeded ProvisioningState = "Succeeded" - ProvisioningStateUnknown ProvisioningState = "Unknown" -) - -func PossibleValuesForProvisioningState() []string { - return []string{ - string(ProvisioningStateAccepted), - string(ProvisioningStateCanceled), - string(ProvisioningStateDeleted), - string(ProvisioningStateDeleting), - string(ProvisioningStateFailed), - string(ProvisioningStateSucceeded), - string(ProvisioningStateUnknown), - } -} - -func (s *ProvisioningState) UnmarshalJSON(bytes []byte) error { - var decoded string - if err := json.Unmarshal(bytes, &decoded); err != nil { - return fmt.Errorf("unmarshaling: %+v", err) - } - out, err := parseProvisioningState(decoded) - if err != nil { - return fmt.Errorf("parsing %q: %+v", decoded, err) - } - *s = *out - return nil -} - -func parseProvisioningState(input string) (*ProvisioningState, error) { - vals := map[string]ProvisioningState{ - "accepted": ProvisioningStateAccepted, - "canceled": ProvisioningStateCanceled, - "deleted": ProvisioningStateDeleted, - "deleting": ProvisioningStateDeleting, - "failed": ProvisioningStateFailed, - "succeeded": ProvisioningStateSucceeded, - "unknown": ProvisioningStateUnknown, - } - if v, ok := vals[strings.ToLower(input)]; ok { - return &v, nil - } - - // otherwise presume it's an undefined value and best-effort it - out := ProvisioningState(input) - return &out, nil -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/id_site.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/id_site.go deleted file mode 100644 index b03097428577..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/id_site.go +++ /dev/null @@ -1,139 +0,0 @@ -package site - -import ( - "fmt" - "strings" - - "github.com/hashicorp/go-azure-helpers/resourcemanager/recaser" - "github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -func init() { - recaser.RegisterResourceId(&SiteId{}) -} - -var _ resourceids.ResourceId = &SiteId{} - -// SiteId is a struct representing the Resource ID for a Site -type SiteId struct { - SubscriptionId string - ResourceGroupName string - MobileNetworkName string - SiteName string -} - -// NewSiteID returns a new SiteId struct -func NewSiteID(subscriptionId string, resourceGroupName string, mobileNetworkName string, siteName string) SiteId { - return SiteId{ - SubscriptionId: subscriptionId, - ResourceGroupName: resourceGroupName, - MobileNetworkName: mobileNetworkName, - SiteName: siteName, - } -} - -// ParseSiteID parses 'input' into a SiteId -func ParseSiteID(input string) (*SiteId, error) { - parser := resourceids.NewParserFromResourceIdType(&SiteId{}) - parsed, err := parser.Parse(input, false) - if err != nil { - return nil, fmt.Errorf("parsing %q: %+v", input, err) - } - - id := SiteId{} - if err = id.FromParseResult(*parsed); err != nil { - return nil, err - } - - return &id, nil -} - -// ParseSiteIDInsensitively parses 'input' case-insensitively into a SiteId -// note: this method should only be used for API response data and not user input -func ParseSiteIDInsensitively(input string) (*SiteId, error) { - parser := resourceids.NewParserFromResourceIdType(&SiteId{}) - parsed, err := parser.Parse(input, true) - if err != nil { - return nil, fmt.Errorf("parsing %q: %+v", input, err) - } - - id := SiteId{} - if err = id.FromParseResult(*parsed); err != nil { - return nil, err - } - - return &id, nil -} - -func (id *SiteId) FromParseResult(input resourceids.ParseResult) error { - var ok bool - - if id.SubscriptionId, ok = input.Parsed["subscriptionId"]; !ok { - return resourceids.NewSegmentNotSpecifiedError(id, "subscriptionId", input) - } - - if id.ResourceGroupName, ok = input.Parsed["resourceGroupName"]; !ok { - return resourceids.NewSegmentNotSpecifiedError(id, "resourceGroupName", input) - } - - if id.MobileNetworkName, ok = input.Parsed["mobileNetworkName"]; !ok { - return resourceids.NewSegmentNotSpecifiedError(id, "mobileNetworkName", input) - } - - if id.SiteName, ok = input.Parsed["siteName"]; !ok { - return resourceids.NewSegmentNotSpecifiedError(id, "siteName", input) - } - - return nil -} - -// ValidateSiteID checks that 'input' can be parsed as a Site ID -func ValidateSiteID(input interface{}, key string) (warnings []string, errors []error) { - v, ok := input.(string) - if !ok { - errors = append(errors, fmt.Errorf("expected %q to be a string", key)) - return - } - - if _, err := ParseSiteID(v); err != nil { - errors = append(errors, err) - } - - return -} - -// ID returns the formatted Site ID -func (id SiteId) ID() string { - fmtString := "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.MobileNetwork/mobileNetworks/%s/sites/%s" - return fmt.Sprintf(fmtString, id.SubscriptionId, id.ResourceGroupName, id.MobileNetworkName, id.SiteName) -} - -// Segments returns a slice of Resource ID Segments which comprise this Site ID -func (id SiteId) Segments() []resourceids.Segment { - return []resourceids.Segment{ - resourceids.StaticSegment("staticSubscriptions", "subscriptions", "subscriptions"), - resourceids.SubscriptionIdSegment("subscriptionId", "12345678-1234-9876-4563-123456789012"), - resourceids.StaticSegment("staticResourceGroups", "resourceGroups", "resourceGroups"), - resourceids.ResourceGroupSegment("resourceGroupName", "example-resource-group"), - resourceids.StaticSegment("staticProviders", "providers", "providers"), - resourceids.ResourceProviderSegment("staticMicrosoftMobileNetwork", "Microsoft.MobileNetwork", "Microsoft.MobileNetwork"), - resourceids.StaticSegment("staticMobileNetworks", "mobileNetworks", "mobileNetworks"), - resourceids.UserSpecifiedSegment("mobileNetworkName", "mobileNetworkName"), - resourceids.StaticSegment("staticSites", "sites", "sites"), - resourceids.UserSpecifiedSegment("siteName", "siteName"), - } -} - -// String returns a human-readable description of this Site ID -func (id SiteId) String() string { - components := []string{ - fmt.Sprintf("Subscription: %q", id.SubscriptionId), - fmt.Sprintf("Resource Group Name: %q", id.ResourceGroupName), - fmt.Sprintf("Mobile Network Name: %q", id.MobileNetworkName), - fmt.Sprintf("Site Name: %q", id.SiteName), - } - return fmt.Sprintf("Site (%s)", strings.Join(components, "\n")) -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_createorupdate.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_createorupdate.go deleted file mode 100644 index e85d2db36935..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_createorupdate.go +++ /dev/null @@ -1,75 +0,0 @@ -package site - -import ( - "context" - "fmt" - "net/http" - - "github.com/hashicorp/go-azure-sdk/sdk/client" - "github.com/hashicorp/go-azure-sdk/sdk/client/pollers" - "github.com/hashicorp/go-azure-sdk/sdk/client/resourcemanager" - "github.com/hashicorp/go-azure-sdk/sdk/odata" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type CreateOrUpdateOperationResponse struct { - Poller pollers.Poller - HttpResponse *http.Response - OData *odata.OData - Model *Site -} - -// CreateOrUpdate ... -func (c SiteClient) CreateOrUpdate(ctx context.Context, id SiteId, input Site) (result CreateOrUpdateOperationResponse, err error) { - opts := client.RequestOptions{ - ContentType: "application/json; charset=utf-8", - ExpectedStatusCodes: []int{ - http.StatusCreated, - http.StatusOK, - }, - HttpMethod: http.MethodPut, - Path: id.ID(), - } - - req, err := c.Client.NewRequest(ctx, opts) - if err != nil { - return - } - - if err = req.Marshal(input); err != nil { - return - } - - var resp *client.Response - resp, err = req.Execute(ctx) - if resp != nil { - result.OData = resp.OData - result.HttpResponse = resp.Response - } - if err != nil { - return - } - - result.Poller, err = resourcemanager.PollerFromResponse(resp, c.Client) - if err != nil { - return - } - - return -} - -// CreateOrUpdateThenPoll performs CreateOrUpdate then polls until it's completed -func (c SiteClient) CreateOrUpdateThenPoll(ctx context.Context, id SiteId, input Site) error { - result, err := c.CreateOrUpdate(ctx, id, input) - if err != nil { - return fmt.Errorf("performing CreateOrUpdate: %+v", err) - } - - if err := result.Poller.PollUntilDone(ctx); err != nil { - return fmt.Errorf("polling after CreateOrUpdate: %+v", err) - } - - return nil -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_delete.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_delete.go deleted file mode 100644 index 7bf19e13f6ad..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_delete.go +++ /dev/null @@ -1,71 +0,0 @@ -package site - -import ( - "context" - "fmt" - "net/http" - - "github.com/hashicorp/go-azure-sdk/sdk/client" - "github.com/hashicorp/go-azure-sdk/sdk/client/pollers" - "github.com/hashicorp/go-azure-sdk/sdk/client/resourcemanager" - "github.com/hashicorp/go-azure-sdk/sdk/odata" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type DeleteOperationResponse struct { - Poller pollers.Poller - HttpResponse *http.Response - OData *odata.OData -} - -// Delete ... -func (c SiteClient) Delete(ctx context.Context, id SiteId) (result DeleteOperationResponse, err error) { - opts := client.RequestOptions{ - ContentType: "application/json; charset=utf-8", - ExpectedStatusCodes: []int{ - http.StatusAccepted, - http.StatusNoContent, - http.StatusOK, - }, - HttpMethod: http.MethodDelete, - Path: id.ID(), - } - - req, err := c.Client.NewRequest(ctx, opts) - if err != nil { - return - } - - var resp *client.Response - resp, err = req.Execute(ctx) - if resp != nil { - result.OData = resp.OData - result.HttpResponse = resp.Response - } - if err != nil { - return - } - - result.Poller, err = resourcemanager.PollerFromResponse(resp, c.Client) - if err != nil { - return - } - - return -} - -// DeleteThenPoll performs Delete then polls until it's completed -func (c SiteClient) DeleteThenPoll(ctx context.Context, id SiteId) error { - result, err := c.Delete(ctx, id) - if err != nil { - return fmt.Errorf("performing Delete: %+v", err) - } - - if err := result.Poller.PollUntilDone(ctx); err != nil { - return fmt.Errorf("polling after Delete: %+v", err) - } - - return nil -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_get.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_get.go deleted file mode 100644 index f6b55484e63e..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_get.go +++ /dev/null @@ -1,53 +0,0 @@ -package site - -import ( - "context" - "net/http" - - "github.com/hashicorp/go-azure-sdk/sdk/client" - "github.com/hashicorp/go-azure-sdk/sdk/odata" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type GetOperationResponse struct { - HttpResponse *http.Response - OData *odata.OData - Model *Site -} - -// Get ... -func (c SiteClient) Get(ctx context.Context, id SiteId) (result GetOperationResponse, err error) { - opts := client.RequestOptions{ - ContentType: "application/json; charset=utf-8", - ExpectedStatusCodes: []int{ - http.StatusOK, - }, - HttpMethod: http.MethodGet, - Path: id.ID(), - } - - req, err := c.Client.NewRequest(ctx, opts) - if err != nil { - return - } - - var resp *client.Response - resp, err = req.Execute(ctx) - if resp != nil { - result.OData = resp.OData - result.HttpResponse = resp.Response - } - if err != nil { - return - } - - var model Site - result.Model = &model - if err = resp.Unmarshal(result.Model); err != nil { - return - } - - return -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_updatetags.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_updatetags.go deleted file mode 100644 index d6fc0f56612f..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/method_updatetags.go +++ /dev/null @@ -1,57 +0,0 @@ -package site - -import ( - "context" - "net/http" - - "github.com/hashicorp/go-azure-sdk/sdk/client" - "github.com/hashicorp/go-azure-sdk/sdk/odata" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type UpdateTagsOperationResponse struct { - HttpResponse *http.Response - OData *odata.OData - Model *Site -} - -// UpdateTags ... -func (c SiteClient) UpdateTags(ctx context.Context, id SiteId, input TagsObject) (result UpdateTagsOperationResponse, err error) { - opts := client.RequestOptions{ - ContentType: "application/json; charset=utf-8", - ExpectedStatusCodes: []int{ - http.StatusOK, - }, - HttpMethod: http.MethodPatch, - Path: id.ID(), - } - - req, err := c.Client.NewRequest(ctx, opts) - if err != nil { - return - } - - if err = req.Marshal(input); err != nil { - return - } - - var resp *client.Response - resp, err = req.Execute(ctx) - if resp != nil { - result.OData = resp.OData - result.HttpResponse = resp.Response - } - if err != nil { - return - } - - var model Site - result.Model = &model - if err = resp.Unmarshal(result.Model); err != nil { - return - } - - return -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_site.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_site.go deleted file mode 100644 index bd5f7fe6a7a5..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_site.go +++ /dev/null @@ -1,18 +0,0 @@ -package site - -import ( - "github.com/hashicorp/go-azure-helpers/resourcemanager/systemdata" -) - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type Site struct { - Id *string `json:"id,omitempty"` - Location string `json:"location"` - Name *string `json:"name,omitempty"` - Properties *SitePropertiesFormat `json:"properties,omitempty"` - SystemData *systemdata.SystemData `json:"systemData,omitempty"` - Tags *map[string]string `json:"tags,omitempty"` - Type *string `json:"type,omitempty"` -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_sitepropertiesformat.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_sitepropertiesformat.go deleted file mode 100644 index 8c4dd99fde45..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_sitepropertiesformat.go +++ /dev/null @@ -1,9 +0,0 @@ -package site - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type SitePropertiesFormat struct { - NetworkFunctions *[]SubResource `json:"networkFunctions,omitempty"` - ProvisioningState *ProvisioningState `json:"provisioningState,omitempty"` -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_subresource.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_subresource.go deleted file mode 100644 index 1c27266a3117..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_subresource.go +++ /dev/null @@ -1,8 +0,0 @@ -package site - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type SubResource struct { - Id string `json:"id"` -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_tagsobject.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_tagsobject.go deleted file mode 100644 index 75ebb164c0a2..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/model_tagsobject.go +++ /dev/null @@ -1,8 +0,0 @@ -package site - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -type TagsObject struct { - Tags *map[string]string `json:"tags,omitempty"` -} diff --git a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/version.go b/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/version.go deleted file mode 100644 index 1e248ebd2d2d..000000000000 --- a/vendor/github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/site/version.go +++ /dev/null @@ -1,10 +0,0 @@ -package site - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See NOTICE.txt in the project root for license information. - -const defaultApiVersion = "2022-11-01" - -func userAgent() string { - return "hashicorp/go-azure-sdk/site/2022-11-01" -}