From c27c936367e8286af7f38455ea4e3f52fc7954f8 Mon Sep 17 00:00:00 2001 From: Ragini-Microsoft Date: Wed, 4 Mar 2026 16:23:13 +0530 Subject: [PATCH] removed the archive docgen folder --- archive-doc-gen/.azdo/pipelines/azure-dev.yml | 43 - .../.devcontainer/devcontainer.json | 38 - archive-doc-gen/.devcontainer/setup_env.sh | 7 - archive-doc-gen/.flake8 | 5 - archive-doc-gen/.gitattributes | 3 - archive-doc-gen/.github/CODEOWNERS | 6 - .../.github/ISSUE_TEMPLATE/bug_report.md | 32 - .../.github/ISSUE_TEMPLATE/feature_request.md | 26 - .../.github/ISSUE_TEMPLATE/subtask.md | 22 - archive-doc-gen/.github/dependabot.yml | 52 - .../.github/pull_request_template.md | 40 - .../Scheduled-Dependabot-PRs-Auto-Merge.yml | 152 - .../.github/workflows/azure-dev.yml | 35 - .../workflows/broken-links-checker.yml | 57 - .../.github/workflows/create-release.yml | 64 - .../.github/workflows/deploy-linux.yml | 283 - .../.github/workflows/deploy-orchestrator.yml | 141 - .../.github/workflows/deploy-v2.yml | 853 - .../.github/workflows/deploy-windows.yml | 274 - archive-doc-gen/.github/workflows/deploy.yml | 410 - .../workflows/docker-build-and-push.yml | 109 - .../workflows/job-cleanup-deployment.yml | 109 - .../.github/workflows/job-deploy-linux.yml | 403 - .../.github/workflows/job-deploy-windows.yml | 394 - .../.github/workflows/job-deploy.yml | 554 - .../.github/workflows/job-docker-build.yml | 102 - .../workflows/job-send-notification.yml | 419 - archive-doc-gen/.github/workflows/node.js.yml | 53 - .../.github/workflows/pr-title-checker.yml | 22 - archive-doc-gen/.github/workflows/pylint.yml | 38 - .../.github/workflows/python-app.yml | 60 - .../.github/workflows/stale-bot.yml | 82 - .../workflows/telemetry-template-check.yml | 30 - .../.github/workflows/test-automation-v2.yml | 196 - .../.github/workflows/test-automation.yml | 146 - archive-doc-gen/.github/workflows/tests.yml | 131 - archive-doc-gen/.gitignore | 15 - archive-doc-gen/.vscode/launch.json | 32 - archive-doc-gen/.vscode/settings.json | 1 - archive-doc-gen/CODE_OF_CONDUCT.md | 9 - archive-doc-gen/CONTRIBUTING.md | 14 - archive-doc-gen/LICENSE | 21 - archive-doc-gen/README.md | 228 - archive-doc-gen/SECURITY.md | 41 - archive-doc-gen/SUPPORT.md | 13 - archive-doc-gen/app-azure.yaml | 45 - archive-doc-gen/azure.yaml | 51 - archive-doc-gen/azure_custom.yaml | 48 - archive-doc-gen/docs/ACRBuildAndPushGuide.md | 71 - archive-doc-gen/docs/AppAuthentication.md | 32 - archive-doc-gen/docs/AzureAccountSetUp.md | 14 - archive-doc-gen/docs/AzureGPTQuotaSettings.md | 10 - .../docs/AzureSemanticSearchRegion.md | 7 - .../docs/CustomizingAzdParameters.md | 42 - archive-doc-gen/docs/DeleteResourceGroup.md | 53 - archive-doc-gen/docs/DeploymentGuide.md | 509 - archive-doc-gen/docs/LocalDevelopmentSetup.md | 506 - .../docs/LogAnalyticsReplicationDisable.md | 28 - archive-doc-gen/docs/PowershellSetup.md | 45 - archive-doc-gen/docs/QuotaCheck.md | 103 - archive-doc-gen/docs/README_LOCAL.md | 218 - archive-doc-gen/docs/SampleQuestions.md | 37 - archive-doc-gen/docs/TRANSPARENCY_FAQ.md | 17 - archive-doc-gen/docs/TroubleShootingSteps.md | 157 - .../docs/container_registry_migration.md | 81 - .../docs/create_new_app_registration.md | 35 - archive-doc-gen/docs/images/AddDetails.png | Bin 358587 -> 0 bytes archive-doc-gen/docs/images/AddPlatform.png | Bin 199104 -> 0 bytes .../docs/images/AddRedirectURL.png | Bin 42553 -> 0 bytes .../docs/images/AppAuthIdentityProvider.png | Bin 49121 -> 0 bytes .../images/AppAuthIdentityProviderAdd.png | Bin 74106 -> 0 bytes .../images/AppAuthIdentityProviderAdded.png | Bin 74705 -> 0 bytes .../docs/images/AppAuthentication.png | Bin 53626 -> 0 bytes .../docs/images/AppAuthenticationIdentity.png | Bin 66771 -> 0 bytes .../docs/images/AppServiceContainer.png | Bin 123401 -> 0 bytes .../docs/images/Appregistrations.png | Bin 203898 -> 0 bytes archive-doc-gen/docs/images/Archimage.png | Bin 42856 -> 0 bytes archive-doc-gen/docs/images/AzureHomePage.png | Bin 68688 -> 0 bytes archive-doc-gen/docs/images/ContainerApp.png | Bin 96874 -> 0 bytes archive-doc-gen/docs/images/DeleteRG.png | Bin 78459 -> 0 bytes .../DocGen_Azure_AI_Foundry_Architecture.png | Bin 34541 -> 0 bytes .../docs/images/Enviorment_variables.png | Bin 93904 -> 0 bytes archive-doc-gen/docs/images/GenerateDraft.png | Bin 21675 -> 0 bytes .../docs/images/MicrosoftEntraID.png | Bin 130465 -> 0 bytes .../docs/images/NewRegistration.png | Bin 364480 -> 0 bytes archive-doc-gen/docs/images/Web.png | Bin 278249 -> 0 bytes archive-doc-gen/docs/images/WebAppURL.png | Bin 83669 -> 0 bytes archive-doc-gen/docs/images/architecture.png | Bin 221087 -> 0 bytes archive-doc-gen/docs/images/customerTruth.png | Bin 186853 -> 0 bytes .../docs/images/deleteservices.png | Bin 118313 -> 0 bytes .../docs/images/deployment_center.png | Bin 111692 -> 0 bytes archive-doc-gen/docs/images/git_bash.png | Bin 30005 -> 0 bytes archive-doc-gen/docs/images/keyfeatures.png | Bin 23018 -> 0 bytes archive-doc-gen/docs/images/landing_page.png | Bin 78302 -> 0 bytes archive-doc-gen/docs/images/logAnalytics.png | Bin 145324 -> 0 bytes .../docs/images/logAnalyticsJson.png | Bin 201052 -> 0 bytes .../docs/images/logAnalyticsList.png | Bin 90986 -> 0 bytes .../docs/images/oneClickDeploy.png | Bin 91952 -> 0 bytes .../docs/images/quota-check-output.png | Bin 12857 -> 0 bytes .../azure_ai_foundry_list.png | Bin 339436 -> 0 bytes .../navigate_to_projects.png | Bin 97180 -> 0 bytes .../project_resource_id.png | Bin 200850 -> 0 bytes .../docs/images/re_use_log/logAnalytics.png | Bin 145324 -> 0 bytes .../images/re_use_log/logAnalyticsJson.png | Bin 201052 -> 0 bytes .../images/re_use_log/logAnalyticsList.png | Bin 90986 -> 0 bytes .../docs/images/readme/business-scenario.png | Bin 14787 -> 0 bytes .../docs/images/readme/quick-deploy.png | Bin 19499 -> 0 bytes .../docs/images/readme/solution-overview.png | Bin 15891 -> 0 bytes .../readme/supporting-documentation.png | Bin 17402 -> 0 bytes .../docs/images/resource-groups.png | Bin 52735 -> 0 bytes archive-doc-gen/docs/images/resource_menu.png | Bin 109519 -> 0 bytes archive-doc-gen/docs/images/resourcegroup.png | Bin 31099 -> 0 bytes .../docs/images/resourcegroup1.png | Bin 55920 -> 0 bytes .../docs/images/supportingDocuments.png | Bin 190820 -> 0 bytes archive-doc-gen/docs/images/userStory.png | Bin 128713 -> 0 bytes .../docs/re-use-foundry-project.md | 44 - archive-doc-gen/docs/re-use-log-analytics.md | 31 - archive-doc-gen/infra/data/pdfdata.zip | Bin 177630 -> 0 bytes archive-doc-gen/infra/main.bicep | 1324 - archive-doc-gen/infra/main.json | 41874 ---------------- archive-doc-gen/infra/main.parameters.json | 51 - .../infra/main.waf.parameters.json | 69 - archive-doc-gen/infra/main_custom.bicep | 1321 - .../infra/modules/ai-project.bicep | 57 - .../modules/ai-services-deployments.bicep | 197 - .../deploy_aifp_aisearch_connection.bicep | 33 - .../infra/modules/role-assignment.bicep | 19 - .../infra/modules/virtualNetwork.bicep | 346 - archive-doc-gen/infra/modules/web-sites.bicep | 372 - .../infra/modules/web-sites.config.bicep | 126 - .../infra/scripts/add_cosmosdb_access.sh | 50 - .../infra/scripts/copy_kb_files.sh | 126 - .../index_scripts/01_create_search_index.py | 115 - .../scripts/index_scripts/02_process_data.py | 182 - .../scripts/index_scripts/requirements.txt | 13 - .../infra/scripts/package_webapp.ps1 | 108 - .../infra/scripts/package_webapp.sh | 95 - .../infra/scripts/process_sample_data.sh | 336 - .../infra/scripts/run_create_index_scripts.sh | 214 - archive-doc-gen/infra/vscode_web/.gitignore | 85 - archive-doc-gen/infra/vscode_web/LICENSE | 21 - .../infra/vscode_web/README-noazd.md | 2 - archive-doc-gen/infra/vscode_web/README.md | 43 - .../infra/vscode_web/codeSample.py | 25 - .../vscode_web/endpoint-requirements.txt | 3 - .../infra/vscode_web/endpointCodeSample.py | 31 - archive-doc-gen/infra/vscode_web/index.json | 72 - archive-doc-gen/infra/vscode_web/install.sh | 3 - .../infra/vscode_web/requirements.txt | 3 - archive-doc-gen/package-lock.json | 6 - archive-doc-gen/scripts/SAMPLE_DATA.md | 57 - archive-doc-gen/scripts/auth_init.ps1 | 11 - archive-doc-gen/scripts/auth_init.py | 94 - archive-doc-gen/scripts/auth_init.sh | 6 - archive-doc-gen/scripts/auth_update.ps1 | 10 - archive-doc-gen/scripts/auth_update.py | 48 - archive-doc-gen/scripts/auth_update.sh | 6 - archive-doc-gen/scripts/checkquota.sh | 100 - archive-doc-gen/scripts/chunk_documents.py | 108 - archive-doc-gen/scripts/config.json | 14 - archive-doc-gen/scripts/data_preparation.py | 655 - archive-doc-gen/scripts/data_utils.py | 1462 - archive-doc-gen/scripts/embed_documents.py | 76 - archive-doc-gen/scripts/loadenv.ps1 | 39 - archive-doc-gen/scripts/loadenv.sh | 23 - archive-doc-gen/scripts/prepdocs.ps1 | 11 - archive-doc-gen/scripts/prepdocs.py | 246 - archive-doc-gen/scripts/prepdocs.sh | 6 - archive-doc-gen/scripts/quota_check_params.sh | 246 - archive-doc-gen/scripts/readme.md | 148 - archive-doc-gen/scripts/role_assignment.sh | 105 - archive-doc-gen/src/.dockerignore | 162 - archive-doc-gen/src/.env.sample | 131 - archive-doc-gen/src/.gitignore | 12 - archive-doc-gen/src/SUPPORT.md | 13 - archive-doc-gen/src/TEST_CASE_FLOWS.md | 77 - archive-doc-gen/src/WebApp.Dockerfile | 31 - archive-doc-gen/src/app.py | 1305 - archive-doc-gen/src/backend/__init__.py | 0 .../backend/api/agent/agent_factory_base.py | 37 - .../backend/api/agent/browse_agent_factory.py | 89 - .../api/agent/section_agent_factory.py | 88 - .../api/agent/template_agent_factory.py | 88 - archive-doc-gen/src/backend/auth/__init__.py | 0 .../src/backend/auth/auth_utils.py | 21 - .../src/backend/auth/sample_user.py | 39 - .../backend/helpers/azure_credential_utils.py | 41 - .../src/backend/history/cosmosdbservice.py | 197 - .../src/backend/security/__init__.py | 0 .../src/backend/security/ms_defender_utils.py | 14 - archive-doc-gen/src/backend/settings.py | 450 - archive-doc-gen/src/backend/utils.py | 172 - archive-doc-gen/src/event_utils.py | 13 - archive-doc-gen/src/frontend/.eslintignore | 4 - archive-doc-gen/src/frontend/.eslintrc.json | 94 - archive-doc-gen/src/frontend/.prettierignore | 4 - archive-doc-gen/src/frontend/.prettierrc.json | 13 - .../src/frontend/__mocks__/dompurify.ts | 5 - .../src/frontend/__mocks__/fileMock.ts | 4 - .../src/frontend/__mocks__/mockAPIData.ts | 164 - .../src/frontend/__mocks__/react-markdown.tsx | 11 - archive-doc-gen/src/frontend/eslint.config.ts | 20 - archive-doc-gen/src/frontend/index.html | 13 - archive-doc-gen/src/frontend/jest.config.ts | 56 - .../src/frontend/jest.polyfills.js | 28 - .../src/frontend/package-lock.json | 17516 ------- archive-doc-gen/src/frontend/package.json | 86 - archive-doc-gen/src/frontend/polyfills.js | 3 - .../src/frontend/public/favicon.ico | Bin 269342 -> 0 bytes archive-doc-gen/src/frontend/src/api/api.ts | 409 - archive-doc-gen/src/frontend/src/api/index.ts | 2 - .../src/frontend/src/api/models.ts | 156 - .../src/frontend/src/assets/Azure.svg | 23 - .../src/frontend/src/assets/ClearChat.svg | 5 - .../src/frontend/src/assets/Contoso.svg | 25 - .../src/frontend/src/assets/Generate.svg | 3 - .../src/frontend/src/assets/Send.svg | 10 - .../src/components/Answer/Answer.module.css | 203 - .../src/components/Answer/Answer.test.tsx | 534 - .../frontend/src/components/Answer/Answer.tsx | 564 - .../components/Answer/AnswerParser.test.ts | 69 - .../src/components/Answer/AnswerParser.tsx | 63 - .../frontend/src/components/Answer/index.ts | 1 - .../ChatHistory/ChatHistoryList.test.tsx | 146 - .../ChatHistory/ChatHistoryList.tsx | 86 - .../ChatHistory/ChatHistoryListItem.tsx | 460 - .../ChatHistory/ChatHistoryPanel.module.css | 79 - .../ChatHistory/ChatHistoryPanel.test.tsx | 230 - .../ChatHistory/ChatHistoryPanel.tsx | 237 - .../ChatHistory/chatHistoryListItem.test.tsx | 711 - .../DraftCards/SectionCard.test.tsx | 229 - .../src/components/DraftCards/SectionCard.tsx | 318 - .../components/DraftCards/TitleCard.test.tsx | 119 - .../src/components/DraftCards/TitleCard.tsx | 44 - .../FeatureCard/FeatureCard.test.tsx | 128 - .../components/FeatureCard/FeatureCard.tsx | 80 - .../QuestionInput/QuestionInput.module.css | 64 - .../QuestionInput/QuestionInput.test.tsx | 177 - .../QuestionInput/QuestionInput.tsx | 77 - .../src/components/QuestionInput/index.ts | 1 - .../src/components/Sidebar/Sidebar.module.css | 74 - .../src/components/Sidebar/Sidebar.test.tsx | 218 - .../src/components/Sidebar/Sidebar.tsx | 169 - .../src/components/common/Button.module.css | 48 - .../src/components/common/Button.test.tsx | 68 - .../frontend/src/components/common/Button.tsx | 30 - .../src/constants/chatHistory.test.tsx | 45 - .../frontend/src/constants/chatHistory.tsx | 492 - .../frontend/src/constants/xssAllowTags.ts | 44 - .../src/frontend/src/helpers/helpers.ts | 130 - archive-doc-gen/src/frontend/src/index.css | 29 - archive-doc-gen/src/frontend/src/index.tsx | 42 - .../src/frontend/src/pages/NoPage.tsx | 5 - .../frontend/src/pages/chat/Chat.module.css | 411 - .../src/frontend/src/pages/chat/Chat.test.tsx | 1539 - .../src/frontend/src/pages/chat/Chat.tsx | 964 - .../chat/Components/AuthNotConfigure.test.tsx | 48 - .../chat/Components/AuthNotConfigure.tsx | 36 - .../Components/ChatMessageContainer.test.tsx | 204 - .../chat/Components/ChatMessageContainer.tsx | 73 - .../chat/Components/CitationPanel.test.tsx | 133 - .../pages/chat/Components/CitationPanel.tsx | 63 - .../src/pages/document/Document.module.css | 0 .../src/pages/document/Document.test.tsx | 62 - .../frontend/src/pages/document/Document.tsx | 49 - .../frontend/src/pages/draft/Draft.module.css | 25 - .../frontend/src/pages/draft/Draft.test.tsx | 293 - .../src/frontend/src/pages/draft/Draft.tsx | 175 - .../src/pages/landing/Landing.module.css | 80 - .../src/pages/landing/Landing.test.tsx | 68 - .../frontend/src/pages/landing/Landing.tsx | 53 - .../src/pages/layout/Layout.module.css | 156 - .../frontend/src/pages/layout/Layout.test.tsx | 189 - .../src/frontend/src/pages/layout/Layout.tsx | 194 - .../src/frontend/src/state/AppProvider.tsx | 146 - .../src/frontend/src/state/AppReducer.tsx | 147 - .../src/frontend/src/test/setupTests.ts | 48 - .../src/frontend/src/test/test.utils.tsx | 42 - .../src/frontend/src/vite-env.d.ts | 1 - archive-doc-gen/src/frontend/tsconfig.json | 24 - .../src/frontend/tsconfig.node.json | 9 - archive-doc-gen/src/frontend/vite.config.ts | 18 - archive-doc-gen/src/gunicorn.conf.py | 13 - archive-doc-gen/src/requirements-dev.txt | 20 - archive-doc-gen/src/requirements.txt | 27 - archive-doc-gen/src/start.cmd | 44 - archive-doc-gen/src/start.sh | 42 - archive-doc-gen/src/test.cmd | 6 - archive-doc-gen/src/tests/conftest.py | 0 .../src/tests/integration_tests/conftest.py | 25 - .../dotenv_templates/dotenv.jinja2 | 79 - .../integration_tests/test_datasources.py | 137 - .../integration_tests/test_startup_scripts.py | 30 - .../dotenv_data/dotenv_no_datasource_1 | 13 - .../dotenv_data/dotenv_no_datasource_2 | 14 - .../dotenv_with_azure_search_success | 37 - .../dotenv_with_elasticsearch_success | 33 - .../helpers/test_azure_credential_utils.py | 78 - .../src/tests/unit_tests/test_settings.py | 36 - .../src/tests/unit_tests/test_utils.py | 31 - archive-doc-gen/tests/e2e-test/.gitignore | 168 - archive-doc-gen/tests/e2e-test/README.md | 35 - .../tests/e2e-test/base/__init__.py | 0 archive-doc-gen/tests/e2e-test/base/base.py | 76 - .../tests/e2e-test/config/constants.py | 37 - archive-doc-gen/tests/e2e-test/img.png | Bin 85099 -> 0 bytes archive-doc-gen/tests/e2e-test/img_1.png | Bin 62274 -> 0 bytes .../tests/e2e-test/pages/__init__.py | 0 .../tests/e2e-test/pages/browsePage.py | 287 - .../tests/e2e-test/pages/draftPage.py | 627 - .../tests/e2e-test/pages/generatePage.py | 815 - .../tests/e2e-test/pages/homePage.py | 41 - archive-doc-gen/tests/e2e-test/pytest.ini | 6 - .../tests/e2e-test/requirements.txt | 7 - .../tests/e2e-test/sample_dotenv_file.txt | 1 - .../tests/e2e-test/tests/__init__.py | 0 .../tests/e2e-test/tests/conftest.py | 187 - .../tests/e2e-test/tests/test_st_docgen_tc.py | 4225 -- 318 files changed, 98817 deletions(-) delete mode 100644 archive-doc-gen/.azdo/pipelines/azure-dev.yml delete mode 100644 archive-doc-gen/.devcontainer/devcontainer.json delete mode 100644 archive-doc-gen/.devcontainer/setup_env.sh delete mode 100644 archive-doc-gen/.flake8 delete mode 100644 archive-doc-gen/.gitattributes delete mode 100644 archive-doc-gen/.github/CODEOWNERS delete mode 100644 archive-doc-gen/.github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 archive-doc-gen/.github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 archive-doc-gen/.github/ISSUE_TEMPLATE/subtask.md delete mode 100644 archive-doc-gen/.github/dependabot.yml delete mode 100644 archive-doc-gen/.github/pull_request_template.md delete mode 100644 archive-doc-gen/.github/workflows/Scheduled-Dependabot-PRs-Auto-Merge.yml delete mode 100644 archive-doc-gen/.github/workflows/azure-dev.yml delete mode 100644 archive-doc-gen/.github/workflows/broken-links-checker.yml delete mode 100644 archive-doc-gen/.github/workflows/create-release.yml delete mode 100644 archive-doc-gen/.github/workflows/deploy-linux.yml delete mode 100644 archive-doc-gen/.github/workflows/deploy-orchestrator.yml delete mode 100644 archive-doc-gen/.github/workflows/deploy-v2.yml delete mode 100644 archive-doc-gen/.github/workflows/deploy-windows.yml delete mode 100644 archive-doc-gen/.github/workflows/deploy.yml delete mode 100644 archive-doc-gen/.github/workflows/docker-build-and-push.yml delete mode 100644 archive-doc-gen/.github/workflows/job-cleanup-deployment.yml delete mode 100644 archive-doc-gen/.github/workflows/job-deploy-linux.yml delete mode 100644 archive-doc-gen/.github/workflows/job-deploy-windows.yml delete mode 100644 archive-doc-gen/.github/workflows/job-deploy.yml delete mode 100644 archive-doc-gen/.github/workflows/job-docker-build.yml delete mode 100644 archive-doc-gen/.github/workflows/job-send-notification.yml delete mode 100644 archive-doc-gen/.github/workflows/node.js.yml delete mode 100644 archive-doc-gen/.github/workflows/pr-title-checker.yml delete mode 100644 archive-doc-gen/.github/workflows/pylint.yml delete mode 100644 archive-doc-gen/.github/workflows/python-app.yml delete mode 100644 archive-doc-gen/.github/workflows/stale-bot.yml delete mode 100644 archive-doc-gen/.github/workflows/telemetry-template-check.yml delete mode 100644 archive-doc-gen/.github/workflows/test-automation-v2.yml delete mode 100644 archive-doc-gen/.github/workflows/test-automation.yml delete mode 100644 archive-doc-gen/.github/workflows/tests.yml delete mode 100644 archive-doc-gen/.gitignore delete mode 100644 archive-doc-gen/.vscode/launch.json delete mode 100644 archive-doc-gen/.vscode/settings.json delete mode 100644 archive-doc-gen/CODE_OF_CONDUCT.md delete mode 100644 archive-doc-gen/CONTRIBUTING.md delete mode 100644 archive-doc-gen/LICENSE delete mode 100644 archive-doc-gen/README.md delete mode 100644 archive-doc-gen/SECURITY.md delete mode 100644 archive-doc-gen/SUPPORT.md delete mode 100644 archive-doc-gen/app-azure.yaml delete mode 100644 archive-doc-gen/azure.yaml delete mode 100644 archive-doc-gen/azure_custom.yaml delete mode 100644 archive-doc-gen/docs/ACRBuildAndPushGuide.md delete mode 100644 archive-doc-gen/docs/AppAuthentication.md delete mode 100644 archive-doc-gen/docs/AzureAccountSetUp.md delete mode 100644 archive-doc-gen/docs/AzureGPTQuotaSettings.md delete mode 100644 archive-doc-gen/docs/AzureSemanticSearchRegion.md delete mode 100644 archive-doc-gen/docs/CustomizingAzdParameters.md delete mode 100644 archive-doc-gen/docs/DeleteResourceGroup.md delete mode 100644 archive-doc-gen/docs/DeploymentGuide.md delete mode 100644 archive-doc-gen/docs/LocalDevelopmentSetup.md delete mode 100644 archive-doc-gen/docs/LogAnalyticsReplicationDisable.md delete mode 100644 archive-doc-gen/docs/PowershellSetup.md delete mode 100644 archive-doc-gen/docs/QuotaCheck.md delete mode 100644 archive-doc-gen/docs/README_LOCAL.md delete mode 100644 archive-doc-gen/docs/SampleQuestions.md delete mode 100644 archive-doc-gen/docs/TRANSPARENCY_FAQ.md delete mode 100644 archive-doc-gen/docs/TroubleShootingSteps.md delete mode 100644 archive-doc-gen/docs/container_registry_migration.md delete mode 100644 archive-doc-gen/docs/create_new_app_registration.md delete mode 100644 archive-doc-gen/docs/images/AddDetails.png delete mode 100644 archive-doc-gen/docs/images/AddPlatform.png delete mode 100644 archive-doc-gen/docs/images/AddRedirectURL.png delete mode 100644 archive-doc-gen/docs/images/AppAuthIdentityProvider.png delete mode 100644 archive-doc-gen/docs/images/AppAuthIdentityProviderAdd.png delete mode 100644 archive-doc-gen/docs/images/AppAuthIdentityProviderAdded.png delete mode 100644 archive-doc-gen/docs/images/AppAuthentication.png delete mode 100644 archive-doc-gen/docs/images/AppAuthenticationIdentity.png delete mode 100644 archive-doc-gen/docs/images/AppServiceContainer.png delete mode 100644 archive-doc-gen/docs/images/Appregistrations.png delete mode 100644 archive-doc-gen/docs/images/Archimage.png delete mode 100644 archive-doc-gen/docs/images/AzureHomePage.png delete mode 100644 archive-doc-gen/docs/images/ContainerApp.png delete mode 100644 archive-doc-gen/docs/images/DeleteRG.png delete mode 100644 archive-doc-gen/docs/images/DocGen_Azure_AI_Foundry_Architecture.png delete mode 100644 archive-doc-gen/docs/images/Enviorment_variables.png delete mode 100644 archive-doc-gen/docs/images/GenerateDraft.png delete mode 100644 archive-doc-gen/docs/images/MicrosoftEntraID.png delete mode 100644 archive-doc-gen/docs/images/NewRegistration.png delete mode 100644 archive-doc-gen/docs/images/Web.png delete mode 100644 archive-doc-gen/docs/images/WebAppURL.png delete mode 100644 archive-doc-gen/docs/images/architecture.png delete mode 100644 archive-doc-gen/docs/images/customerTruth.png delete mode 100644 archive-doc-gen/docs/images/deleteservices.png delete mode 100644 archive-doc-gen/docs/images/deployment_center.png delete mode 100644 archive-doc-gen/docs/images/git_bash.png delete mode 100644 archive-doc-gen/docs/images/keyfeatures.png delete mode 100644 archive-doc-gen/docs/images/landing_page.png delete mode 100644 archive-doc-gen/docs/images/logAnalytics.png delete mode 100644 archive-doc-gen/docs/images/logAnalyticsJson.png delete mode 100644 archive-doc-gen/docs/images/logAnalyticsList.png delete mode 100644 archive-doc-gen/docs/images/oneClickDeploy.png delete mode 100644 archive-doc-gen/docs/images/quota-check-output.png delete mode 100644 archive-doc-gen/docs/images/re_use_foundry_project/azure_ai_foundry_list.png delete mode 100644 archive-doc-gen/docs/images/re_use_foundry_project/navigate_to_projects.png delete mode 100644 archive-doc-gen/docs/images/re_use_foundry_project/project_resource_id.png delete mode 100644 archive-doc-gen/docs/images/re_use_log/logAnalytics.png delete mode 100644 archive-doc-gen/docs/images/re_use_log/logAnalyticsJson.png delete mode 100644 archive-doc-gen/docs/images/re_use_log/logAnalyticsList.png delete mode 100644 archive-doc-gen/docs/images/readme/business-scenario.png delete mode 100644 archive-doc-gen/docs/images/readme/quick-deploy.png delete mode 100644 archive-doc-gen/docs/images/readme/solution-overview.png delete mode 100644 archive-doc-gen/docs/images/readme/supporting-documentation.png delete mode 100644 archive-doc-gen/docs/images/resource-groups.png delete mode 100644 archive-doc-gen/docs/images/resource_menu.png delete mode 100644 archive-doc-gen/docs/images/resourcegroup.png delete mode 100644 archive-doc-gen/docs/images/resourcegroup1.png delete mode 100644 archive-doc-gen/docs/images/supportingDocuments.png delete mode 100644 archive-doc-gen/docs/images/userStory.png delete mode 100644 archive-doc-gen/docs/re-use-foundry-project.md delete mode 100644 archive-doc-gen/docs/re-use-log-analytics.md delete mode 100644 archive-doc-gen/infra/data/pdfdata.zip delete mode 100644 archive-doc-gen/infra/main.bicep delete mode 100644 archive-doc-gen/infra/main.json delete mode 100644 archive-doc-gen/infra/main.parameters.json delete mode 100644 archive-doc-gen/infra/main.waf.parameters.json delete mode 100644 archive-doc-gen/infra/main_custom.bicep delete mode 100644 archive-doc-gen/infra/modules/ai-project.bicep delete mode 100644 archive-doc-gen/infra/modules/ai-services-deployments.bicep delete mode 100644 archive-doc-gen/infra/modules/deploy_aifp_aisearch_connection.bicep delete mode 100644 archive-doc-gen/infra/modules/role-assignment.bicep delete mode 100644 archive-doc-gen/infra/modules/virtualNetwork.bicep delete mode 100644 archive-doc-gen/infra/modules/web-sites.bicep delete mode 100644 archive-doc-gen/infra/modules/web-sites.config.bicep delete mode 100644 archive-doc-gen/infra/scripts/add_cosmosdb_access.sh delete mode 100644 archive-doc-gen/infra/scripts/copy_kb_files.sh delete mode 100644 archive-doc-gen/infra/scripts/index_scripts/01_create_search_index.py delete mode 100644 archive-doc-gen/infra/scripts/index_scripts/02_process_data.py delete mode 100644 archive-doc-gen/infra/scripts/index_scripts/requirements.txt delete mode 100644 archive-doc-gen/infra/scripts/package_webapp.ps1 delete mode 100644 archive-doc-gen/infra/scripts/package_webapp.sh delete mode 100644 archive-doc-gen/infra/scripts/process_sample_data.sh delete mode 100644 archive-doc-gen/infra/scripts/run_create_index_scripts.sh delete mode 100644 archive-doc-gen/infra/vscode_web/.gitignore delete mode 100644 archive-doc-gen/infra/vscode_web/LICENSE delete mode 100644 archive-doc-gen/infra/vscode_web/README-noazd.md delete mode 100644 archive-doc-gen/infra/vscode_web/README.md delete mode 100644 archive-doc-gen/infra/vscode_web/codeSample.py delete mode 100644 archive-doc-gen/infra/vscode_web/endpoint-requirements.txt delete mode 100644 archive-doc-gen/infra/vscode_web/endpointCodeSample.py delete mode 100644 archive-doc-gen/infra/vscode_web/index.json delete mode 100644 archive-doc-gen/infra/vscode_web/install.sh delete mode 100644 archive-doc-gen/infra/vscode_web/requirements.txt delete mode 100644 archive-doc-gen/package-lock.json delete mode 100644 archive-doc-gen/scripts/SAMPLE_DATA.md delete mode 100644 archive-doc-gen/scripts/auth_init.ps1 delete mode 100644 archive-doc-gen/scripts/auth_init.py delete mode 100644 archive-doc-gen/scripts/auth_init.sh delete mode 100644 archive-doc-gen/scripts/auth_update.ps1 delete mode 100644 archive-doc-gen/scripts/auth_update.py delete mode 100644 archive-doc-gen/scripts/auth_update.sh delete mode 100644 archive-doc-gen/scripts/checkquota.sh delete mode 100644 archive-doc-gen/scripts/chunk_documents.py delete mode 100644 archive-doc-gen/scripts/config.json delete mode 100644 archive-doc-gen/scripts/data_preparation.py delete mode 100644 archive-doc-gen/scripts/data_utils.py delete mode 100644 archive-doc-gen/scripts/embed_documents.py delete mode 100644 archive-doc-gen/scripts/loadenv.ps1 delete mode 100644 archive-doc-gen/scripts/loadenv.sh delete mode 100644 archive-doc-gen/scripts/prepdocs.ps1 delete mode 100644 archive-doc-gen/scripts/prepdocs.py delete mode 100644 archive-doc-gen/scripts/prepdocs.sh delete mode 100644 archive-doc-gen/scripts/quota_check_params.sh delete mode 100644 archive-doc-gen/scripts/readme.md delete mode 100644 archive-doc-gen/scripts/role_assignment.sh delete mode 100644 archive-doc-gen/src/.dockerignore delete mode 100644 archive-doc-gen/src/.env.sample delete mode 100644 archive-doc-gen/src/.gitignore delete mode 100644 archive-doc-gen/src/SUPPORT.md delete mode 100644 archive-doc-gen/src/TEST_CASE_FLOWS.md delete mode 100644 archive-doc-gen/src/WebApp.Dockerfile delete mode 100644 archive-doc-gen/src/app.py delete mode 100644 archive-doc-gen/src/backend/__init__.py delete mode 100644 archive-doc-gen/src/backend/api/agent/agent_factory_base.py delete mode 100644 archive-doc-gen/src/backend/api/agent/browse_agent_factory.py delete mode 100644 archive-doc-gen/src/backend/api/agent/section_agent_factory.py delete mode 100644 archive-doc-gen/src/backend/api/agent/template_agent_factory.py delete mode 100644 archive-doc-gen/src/backend/auth/__init__.py delete mode 100644 archive-doc-gen/src/backend/auth/auth_utils.py delete mode 100644 archive-doc-gen/src/backend/auth/sample_user.py delete mode 100644 archive-doc-gen/src/backend/helpers/azure_credential_utils.py delete mode 100644 archive-doc-gen/src/backend/history/cosmosdbservice.py delete mode 100644 archive-doc-gen/src/backend/security/__init__.py delete mode 100644 archive-doc-gen/src/backend/security/ms_defender_utils.py delete mode 100644 archive-doc-gen/src/backend/settings.py delete mode 100644 archive-doc-gen/src/backend/utils.py delete mode 100644 archive-doc-gen/src/event_utils.py delete mode 100644 archive-doc-gen/src/frontend/.eslintignore delete mode 100644 archive-doc-gen/src/frontend/.eslintrc.json delete mode 100644 archive-doc-gen/src/frontend/.prettierignore delete mode 100644 archive-doc-gen/src/frontend/.prettierrc.json delete mode 100644 archive-doc-gen/src/frontend/__mocks__/dompurify.ts delete mode 100644 archive-doc-gen/src/frontend/__mocks__/fileMock.ts delete mode 100644 archive-doc-gen/src/frontend/__mocks__/mockAPIData.ts delete mode 100644 archive-doc-gen/src/frontend/__mocks__/react-markdown.tsx delete mode 100644 archive-doc-gen/src/frontend/eslint.config.ts delete mode 100644 archive-doc-gen/src/frontend/index.html delete mode 100644 archive-doc-gen/src/frontend/jest.config.ts delete mode 100644 archive-doc-gen/src/frontend/jest.polyfills.js delete mode 100644 archive-doc-gen/src/frontend/package-lock.json delete mode 100644 archive-doc-gen/src/frontend/package.json delete mode 100644 archive-doc-gen/src/frontend/polyfills.js delete mode 100644 archive-doc-gen/src/frontend/public/favicon.ico delete mode 100644 archive-doc-gen/src/frontend/src/api/api.ts delete mode 100644 archive-doc-gen/src/frontend/src/api/index.ts delete mode 100644 archive-doc-gen/src/frontend/src/api/models.ts delete mode 100644 archive-doc-gen/src/frontend/src/assets/Azure.svg delete mode 100644 archive-doc-gen/src/frontend/src/assets/ClearChat.svg delete mode 100644 archive-doc-gen/src/frontend/src/assets/Contoso.svg delete mode 100644 archive-doc-gen/src/frontend/src/assets/Generate.svg delete mode 100644 archive-doc-gen/src/frontend/src/assets/Send.svg delete mode 100644 archive-doc-gen/src/frontend/src/components/Answer/Answer.module.css delete mode 100644 archive-doc-gen/src/frontend/src/components/Answer/Answer.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/Answer/Answer.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/Answer/AnswerParser.test.ts delete mode 100644 archive-doc-gen/src/frontend/src/components/Answer/AnswerParser.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/Answer/index.ts delete mode 100644 archive-doc-gen/src/frontend/src/components/ChatHistory/ChatHistoryList.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/ChatHistory/ChatHistoryList.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/ChatHistory/ChatHistoryListItem.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/ChatHistory/ChatHistoryPanel.module.css delete mode 100644 archive-doc-gen/src/frontend/src/components/ChatHistory/ChatHistoryPanel.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/ChatHistory/ChatHistoryPanel.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/ChatHistory/chatHistoryListItem.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/DraftCards/SectionCard.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/DraftCards/SectionCard.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/DraftCards/TitleCard.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/DraftCards/TitleCard.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/FeatureCard/FeatureCard.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/FeatureCard/FeatureCard.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/QuestionInput/QuestionInput.module.css delete mode 100644 archive-doc-gen/src/frontend/src/components/QuestionInput/QuestionInput.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/QuestionInput/QuestionInput.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/QuestionInput/index.ts delete mode 100644 archive-doc-gen/src/frontend/src/components/Sidebar/Sidebar.module.css delete mode 100644 archive-doc-gen/src/frontend/src/components/Sidebar/Sidebar.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/Sidebar/Sidebar.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/common/Button.module.css delete mode 100644 archive-doc-gen/src/frontend/src/components/common/Button.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/components/common/Button.tsx delete mode 100644 archive-doc-gen/src/frontend/src/constants/chatHistory.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/constants/chatHistory.tsx delete mode 100644 archive-doc-gen/src/frontend/src/constants/xssAllowTags.ts delete mode 100644 archive-doc-gen/src/frontend/src/helpers/helpers.ts delete mode 100644 archive-doc-gen/src/frontend/src/index.css delete mode 100644 archive-doc-gen/src/frontend/src/index.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/NoPage.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Chat.module.css delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Chat.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Chat.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Components/AuthNotConfigure.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Components/AuthNotConfigure.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Components/ChatMessageContainer.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Components/ChatMessageContainer.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Components/CitationPanel.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/chat/Components/CitationPanel.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/document/Document.module.css delete mode 100644 archive-doc-gen/src/frontend/src/pages/document/Document.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/document/Document.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/draft/Draft.module.css delete mode 100644 archive-doc-gen/src/frontend/src/pages/draft/Draft.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/draft/Draft.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/landing/Landing.module.css delete mode 100644 archive-doc-gen/src/frontend/src/pages/landing/Landing.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/landing/Landing.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/layout/Layout.module.css delete mode 100644 archive-doc-gen/src/frontend/src/pages/layout/Layout.test.tsx delete mode 100644 archive-doc-gen/src/frontend/src/pages/layout/Layout.tsx delete mode 100644 archive-doc-gen/src/frontend/src/state/AppProvider.tsx delete mode 100644 archive-doc-gen/src/frontend/src/state/AppReducer.tsx delete mode 100644 archive-doc-gen/src/frontend/src/test/setupTests.ts delete mode 100644 archive-doc-gen/src/frontend/src/test/test.utils.tsx delete mode 100644 archive-doc-gen/src/frontend/src/vite-env.d.ts delete mode 100644 archive-doc-gen/src/frontend/tsconfig.json delete mode 100644 archive-doc-gen/src/frontend/tsconfig.node.json delete mode 100644 archive-doc-gen/src/frontend/vite.config.ts delete mode 100644 archive-doc-gen/src/gunicorn.conf.py delete mode 100644 archive-doc-gen/src/requirements-dev.txt delete mode 100644 archive-doc-gen/src/requirements.txt delete mode 100644 archive-doc-gen/src/start.cmd delete mode 100644 archive-doc-gen/src/start.sh delete mode 100644 archive-doc-gen/src/test.cmd delete mode 100644 archive-doc-gen/src/tests/conftest.py delete mode 100644 archive-doc-gen/src/tests/integration_tests/conftest.py delete mode 100644 archive-doc-gen/src/tests/integration_tests/dotenv_templates/dotenv.jinja2 delete mode 100644 archive-doc-gen/src/tests/integration_tests/test_datasources.py delete mode 100644 archive-doc-gen/src/tests/integration_tests/test_startup_scripts.py delete mode 100644 archive-doc-gen/src/tests/unit_tests/dotenv_data/dotenv_no_datasource_1 delete mode 100644 archive-doc-gen/src/tests/unit_tests/dotenv_data/dotenv_no_datasource_2 delete mode 100644 archive-doc-gen/src/tests/unit_tests/dotenv_data/dotenv_with_azure_search_success delete mode 100644 archive-doc-gen/src/tests/unit_tests/dotenv_data/dotenv_with_elasticsearch_success delete mode 100644 archive-doc-gen/src/tests/unit_tests/helpers/test_azure_credential_utils.py delete mode 100644 archive-doc-gen/src/tests/unit_tests/test_settings.py delete mode 100644 archive-doc-gen/src/tests/unit_tests/test_utils.py delete mode 100644 archive-doc-gen/tests/e2e-test/.gitignore delete mode 100644 archive-doc-gen/tests/e2e-test/README.md delete mode 100644 archive-doc-gen/tests/e2e-test/base/__init__.py delete mode 100644 archive-doc-gen/tests/e2e-test/base/base.py delete mode 100644 archive-doc-gen/tests/e2e-test/config/constants.py delete mode 100644 archive-doc-gen/tests/e2e-test/img.png delete mode 100644 archive-doc-gen/tests/e2e-test/img_1.png delete mode 100644 archive-doc-gen/tests/e2e-test/pages/__init__.py delete mode 100644 archive-doc-gen/tests/e2e-test/pages/browsePage.py delete mode 100644 archive-doc-gen/tests/e2e-test/pages/draftPage.py delete mode 100644 archive-doc-gen/tests/e2e-test/pages/generatePage.py delete mode 100644 archive-doc-gen/tests/e2e-test/pages/homePage.py delete mode 100644 archive-doc-gen/tests/e2e-test/pytest.ini delete mode 100644 archive-doc-gen/tests/e2e-test/requirements.txt delete mode 100644 archive-doc-gen/tests/e2e-test/sample_dotenv_file.txt delete mode 100644 archive-doc-gen/tests/e2e-test/tests/__init__.py delete mode 100644 archive-doc-gen/tests/e2e-test/tests/conftest.py delete mode 100644 archive-doc-gen/tests/e2e-test/tests/test_st_docgen_tc.py diff --git a/archive-doc-gen/.azdo/pipelines/azure-dev.yml b/archive-doc-gen/.azdo/pipelines/azure-dev.yml deleted file mode 100644 index 69b1f954d..000000000 --- a/archive-doc-gen/.azdo/pipelines/azure-dev.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Run when commits are pushed to mainline branch (main or master) -# Set this to the mainline branch you are using -trigger: - - main - -pool: - vmImage: ubuntu-latest - -steps: - - task: setup-azd@0 - displayName: Install azd - - - - pwsh: | - azd config set auth.useAzCliAuth "true" - displayName: Configure AZD to Use AZ CLI Authentication. - - - task: AzureCLI@2 - displayName: Provision Infrastructure - inputs: - azureSubscription: azconnection - scriptType: bash - scriptLocation: inlineScript - inlineScript: | - azd provision --no-prompt - env: - - AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID) - AZURE_ENV_NAME: $(AZURE_ENV_NAME) - AZURE_LOCATION: $(AZURE_LOCATION) - - - task: AzureCLI@2 - displayName: Deploy Application - inputs: - azureSubscription: azconnection - scriptType: bash - scriptLocation: inlineScript - inlineScript: | - azd deploy --no-prompt - env: - AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID) - AZURE_ENV_NAME: $(AZURE_ENV_NAME) - AZURE_LOCATION: $(AZURE_LOCATION) \ No newline at end of file diff --git a/archive-doc-gen/.devcontainer/devcontainer.json b/archive-doc-gen/.devcontainer/devcontainer.json deleted file mode 100644 index f143c9dc4..000000000 --- a/archive-doc-gen/.devcontainer/devcontainer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "azd-template", - "image": "mcr.microsoft.com/devcontainers/python:3.11-bullseye", - "forwardPorts": [50505], - "features": { - "ghcr.io/devcontainers/features/node:1": { - "nodeGypDependencies": true, - "installYarnUsingApt": true, - "version": "lts", - "pnpmVersion": "latest", - "nvmVersion": "latest" - }, - "ghcr.io/devcontainers/features/azure-cli:1": { - "installBicep": true, - "version": "latest", - "bicepVersion": "latest" - }, - "ghcr.io/azure/azure-dev/azd:0": { - "version": "stable" - } - }, - "customizations": { - "vscode": { - "extensions": [ - "ms-azuretools.azure-dev", - "ms-azuretools.vscode-bicep", - "ms-python.python", - "ms-toolsai.jupyter", - "GitHub.vscode-github-actions" - ] - } - }, - "postCreateCommand": "bash ./.devcontainer/setup_env.sh", - "remoteUser": "vscode", - "hostRequirements": { - "memory": "4gb" - } -} diff --git a/archive-doc-gen/.devcontainer/setup_env.sh b/archive-doc-gen/.devcontainer/setup_env.sh deleted file mode 100644 index 91de5b222..000000000 --- a/archive-doc-gen/.devcontainer/setup_env.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -git fetch -git pull - -# provide execute permission to quotacheck script -sudo chmod +x ./scripts/quota_check_params.sh \ No newline at end of file diff --git a/archive-doc-gen/.flake8 b/archive-doc-gen/.flake8 deleted file mode 100644 index 931d65ab2..000000000 --- a/archive-doc-gen/.flake8 +++ /dev/null @@ -1,5 +0,0 @@ -[flake8] -max-line-length = 88 -extend-ignore = E501 -exclude = venv, frontend -ignore = E203, W503 \ No newline at end of file diff --git a/archive-doc-gen/.gitattributes b/archive-doc-gen/.gitattributes deleted file mode 100644 index 314766e91..000000000 --- a/archive-doc-gen/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -* text=auto eol=lf -*.{cmd,[cC][mM][dD]} text eol=crlf -*.{bat,[bB][aA][tT]} text eol=crlf diff --git a/archive-doc-gen/.github/CODEOWNERS b/archive-doc-gen/.github/CODEOWNERS deleted file mode 100644 index 9ebbb4d0e..000000000 --- a/archive-doc-gen/.github/CODEOWNERS +++ /dev/null @@ -1,6 +0,0 @@ -# Lines starting with '#' are comments. -# Each line is a file pattern followed by one or more owners. - -# These owners will be the default owners for everything in the repo. -* @toherman-msft @Avijit-Microsoft @Roopan-Microsoft @Prajwal-Microsoft @Vinay-Microsoft @malrose07 @aniaroramsft @nchandhi @dgp10801 - diff --git a/archive-doc-gen/.github/ISSUE_TEMPLATE/bug_report.md b/archive-doc-gen/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index d65a1c64f..000000000 --- a/archive-doc-gen/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Configuration: Please provide the following** - - Azure OpenAI model name and version (e.g. 'gpt-35-turbo-16k, version 0613') - - Is chat history enabled? - - Are you using data? If so, what data source? (e.g. Azure AI Search, Azure CosmosDB Mongo vCore, etc) - -**Additional context** -Add any other context about the problem here. diff --git a/archive-doc-gen/.github/ISSUE_TEMPLATE/feature_request.md b/archive-doc-gen/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index c9c39ef89..000000000 --- a/archive-doc-gen/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to this sample app, or to an Azure service, such as Azure OpenAI or Azure AI Search?** -Describe the scope of your request. This forum is focused on features relating to this sample app and its functionality, not the functionality of underlying Azure services. - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Is this feature specific to your use case or your organization, or would it apply broadly across other uses of this app?** -Describe how you and others might leverage this feature. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/archive-doc-gen/.github/ISSUE_TEMPLATE/subtask.md b/archive-doc-gen/.github/ISSUE_TEMPLATE/subtask.md deleted file mode 100644 index 2451f8b3c..000000000 --- a/archive-doc-gen/.github/ISSUE_TEMPLATE/subtask.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -name: Sub task -about: A sub task -title: '' -labels: subtask -assignees: '' - ---- - -Required by - -# Description - -A clear and concise description of what this subtask is. - -# Tasks - -_To be filled in by the engineer picking up the subtask - -- [ ] Task 1 -- [ ] Task 2 -- [ ] ... \ No newline at end of file diff --git a/archive-doc-gen/.github/dependabot.yml b/archive-doc-gen/.github/dependabot.yml deleted file mode 100644 index a41e11808..000000000 --- a/archive-doc-gen/.github/dependabot.yml +++ /dev/null @@ -1,52 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 - -updates: -# 1) All frontend (npm) deps in ONE PR - - package-ecosystem: "npm" - directory: "/src/frontend" - schedule: - interval: "monthly" - target-branch: "dependabotchanges" - open-pull-requests-limit: 10 - commit-message: - prefix: "build(deps)" - - groups: - all-frontend-deps: - patterns: - - "*" - - -# 2) All backend (pip) deps in ONE PR - - package-ecosystem: "pip" - directory: "/src" - schedule: - interval: "monthly" - target-branch: "dependabotchanges" - open-pull-requests-limit: 10 - commit-message: - prefix: "build(deps)" - groups: - all-backend-deps: - patterns: - - "*" - -# 3) All GitHub Actions in ONE PR - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "monthly" - target-branch: "dependabotchanges" - open-pull-requests-limit: 10 - commit-message: - prefix: "build(deps)" - groups: - all-actions: - patterns: - - "*" - diff --git a/archive-doc-gen/.github/pull_request_template.md b/archive-doc-gen/.github/pull_request_template.md deleted file mode 100644 index 1041c9ba6..000000000 --- a/archive-doc-gen/.github/pull_request_template.md +++ /dev/null @@ -1,40 +0,0 @@ -## Purpose - -* ... - -## Does this introduce a breaking change? - - -- [ ] Yes -- [ ] No - - - -## Golden Path Validation -- [ ] I have tested the primary workflows (the "golden path") to ensure they function correctly without errors. - -## Deployment Validation -- [ ] I have validated the deployment process successfully and all services are running as expected with this change. - -## What to Check -Verify that the following are valid -- [ ] I have built and tested the code locally and in a deployed app -- [ ] For frontend changes, I have pulled the latest code from main, built the frontend, and committed all static files. -- [ ] This is a change for all users of this app. No code or asset is specific to my use case or my organization. - - -## Other Information - \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/Scheduled-Dependabot-PRs-Auto-Merge.yml b/archive-doc-gen/.github/workflows/Scheduled-Dependabot-PRs-Auto-Merge.yml deleted file mode 100644 index e29507533..000000000 --- a/archive-doc-gen/.github/workflows/Scheduled-Dependabot-PRs-Auto-Merge.yml +++ /dev/null @@ -1,152 +0,0 @@ -# ------------------------------------------------------------------------------ -# Scheduled Dependabot PRs Auto-Merge Workflow -# -# Purpose: -# - Automatically detect, rebase (if needed), and merge Dependabot PRs targeting -# the `dependabotchanges` branch, supporting different merge strategies. -# -# Features: -# ✅ Filters PRs authored by Dependabot and targets the specific base branch -# ✅ Rebases PRs with conflicts and auto-resolves using "prefer-theirs" strategy -# ✅ Attempts all three merge strategies: merge, squash, rebase (first success wins) -# ✅ Handles errors gracefully, logs clearly -# -# Triggers: -# - Scheduled daily run (midnight UTC) -# - Manual trigger (via GitHub UI) -# -# Required Permissions: -# - contents: write -# - pull-requests: write -# ------------------------------------------------------------------------------ - -name: Scheduled Dependabot PRs Auto-Merge - -on: - schedule: - - cron: '0 0 * * *' # Runs once a day at midnight UTC - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - merge-dependabot: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Install GitHub CLI - run: | - sudo apt update - sudo apt install -y gh - - name: Fetch & Filter Dependabot PRs - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - echo "🔍 Fetching all Dependabot PRs targeting 'dependabotchanges'..." - > matched_prs.txt - pr_batch=$(gh pr list --state open --json number,title,author,baseRefName,url \ - --jq '.[] | "\(.number)|\(.title)|\(.author.login)|\(.baseRefName)|\(.url)"') - while IFS='|' read -r number title author base url; do - author=$(echo "$author" | xargs) - base=$(echo "$base" | xargs) - if [[ "$author" == "app/dependabot" && "$base" == "dependabotchanges" ]]; then - echo "$url" >> matched_prs.txt - echo "✅ Matched PR #$number - $title" - else - echo "❌ Skipped PR #$number - $title (Author: $author, Base: $base)" - fi - done <<< "$pr_batch" - echo "👉 Matched PRs:" - cat matched_prs.txt || echo "None" - - name: Rebase PR if Conflicts Exist - if: success() - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - if [[ ! -s matched_prs.txt ]]; then - echo "⚠️ No matching PRs to process." - exit 0 - fi - while IFS= read -r pr_url; do - pr_number=$(basename "$pr_url") - echo "🔁 Checking PR #$pr_number for conflicts..." - mergeable=$(gh pr view "$pr_number" --json mergeable --jq '.mergeable') - if [[ "$mergeable" == "CONFLICTING" ]]; then - echo "⚠️ Merge conflicts detected. Performing manual rebase for PR #$pr_number..." - head_branch=$(gh pr view "$pr_number" --json headRefName --jq '.headRefName') - base_branch=$(gh pr view "$pr_number" --json baseRefName --jq '.baseRefName') - git fetch origin "$base_branch":"$base_branch" - git fetch origin "$head_branch":"$head_branch" - git checkout "$head_branch" - git config user.name "github-actions" - git config user.email "action@github.com" - # Attempt rebase with 'theirs' strategy - if git rebase --strategy=recursive -X theirs "$base_branch"; then - echo "✅ Rebase successful. Pushing..." - git push origin "$head_branch" --force - else - echo "❌ Rebase failed. Aborting..." - git rebase --abort || true - fi - else - echo "✅ PR #$pr_number is mergeable. Skipping rebase." - fi - done < matched_prs.txt - - - name: Auto-Merge PRs using available strategy - if: success() - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - if [[ ! -s matched_prs.txt ]]; then - echo "⚠️ No matching PRs to process." - exit 0 - fi - while IFS= read -r pr_url; do - pr_number=$(basename "$pr_url") - echo "🔍 Checking mergeability for PR #$pr_number" - attempt=0 - max_attempts=8 - mergeable="" - sleep 5 # Let GitHub calculate mergeable status - while [[ $attempt -lt $max_attempts ]]; do - mergeable=$(gh pr view "$pr_number" --json mergeable --jq '.mergeable' 2>/dev/null || echo "UNKNOWN") - echo "🔁 Attempt $((attempt+1))/$max_attempts: mergeable=$mergeable" - if [[ "$mergeable" == "MERGEABLE" ]]; then - success=0 - for strategy in rebase squash merge; do - echo "🚀 Trying to auto-merge PR #$pr_number using '$strategy' strategy..." - set -x - merge_output=$(gh pr merge --auto --"$strategy" "$pr_url" 2>&1) - merge_status=$? - set +x - echo "$merge_output" - if [[ $merge_status -eq 0 ]]; then - echo "✅ Auto-merge succeeded using '$strategy'." - success=1 - break - else - echo "❌ Auto-merge failed using '$strategy'. Trying next strategy..." - fi - done - if [[ $success -eq 0 ]]; then - echo "❌ All merge strategies failed for PR #$pr_number" - fi - break - elif [[ "$mergeable" == "CONFLICTING" ]]; then - echo "❌ Cannot merge due to conflicts. Skipping PR #$pr_number" - break - else - echo "🕒 Waiting for GitHub to determine mergeable status..." - sleep 15 - fi - ((attempt++)) - done - if [[ "$mergeable" != "MERGEABLE" && "$mergeable" != "CONFLICTING" ]]; then - echo "❌ Mergeability undetermined after $max_attempts attempts. Skipping PR #$pr_number" - fi - done < matched_prs.txt || echo "⚠️ Completed loop with some errors, but continuing gracefully." \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/azure-dev.yml b/archive-doc-gen/.github/workflows/azure-dev.yml deleted file mode 100644 index 6f1c6305f..000000000 --- a/archive-doc-gen/.github/workflows/azure-dev.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Azure Template Validation -on: - workflow_dispatch: - -permissions: - contents: read - id-token: write - pull-requests: write - -jobs: - template_validation_job: - runs-on: ubuntu-latest - name: Template validation - - steps: - # Step 1: Checkout the code from your repository - - name: Checkout code - uses: actions/checkout@v6 - - # Step 2: Validate the Azure template using microsoft/template-validation-action - - name: Validate Azure Template - uses: microsoft/template-validation-action@v0.4.4 - id: validation - env: - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - AZURE_ENV_NAME: ${{ secrets.AZURE_ENV_NAME }} - AZURE_LOCATION: ${{ secrets.AZURE_LOCATION }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }} - - # Step 3: Print the result of the validation - - name: Print result - run: cat ${{ steps.validation.outputs.resultFile }} \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/broken-links-checker.yml b/archive-doc-gen/.github/workflows/broken-links-checker.yml deleted file mode 100644 index a87fda61b..000000000 --- a/archive-doc-gen/.github/workflows/broken-links-checker.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Broken Link Checker - -on: - pull_request: - paths: - - '**/*.md' - workflow_dispatch: - -permissions: - contents: read - -jobs: - markdown-link-check: - name: Check Markdown Broken Links - runs-on: ubuntu-latest - - steps: - - name: Checkout Repo - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - # For PR : Get only changed markdown files - - name: Get changed markdown files (PR only) - id: changed-markdown-files - if: github.event_name == 'pull_request' - uses: tj-actions/changed-files@e0021407031f5be11a464abee9a0776171c79891 # v46 - with: - files: | - **/*.md - - - # For PR: Check broken links only in changed files - - name: Check Broken Links in Changed Markdown Files - id: lychee-check-pr - if: github.event_name == 'pull_request' && steps.changed-markdown-files.outputs.any_changed == 'true' - uses: lycheeverse/lychee-action@v2.7.0 - with: - args: > - --verbose --no-progress --exclude ^https?:// - ${{ steps.changed-markdown-files.outputs.all_changed_files }} - failIfEmpty: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # For manual trigger: Check all markdown files in repo - - name: Check Broken Links in All Markdown Files in Entire Repo (Manual Trigger) - id: lychee-check-manual - if: github.event_name == 'workflow_dispatch' - uses: lycheeverse/lychee-action@v2.7.0 - with: - args: > - --verbose --no-progress --exclude ^https?:// - '**/*.md' - failIfEmpty: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/archive-doc-gen/.github/workflows/create-release.yml b/archive-doc-gen/.github/workflows/create-release.yml deleted file mode 100644 index c45474d51..000000000 --- a/archive-doc-gen/.github/workflows/create-release.yml +++ /dev/null @@ -1,64 +0,0 @@ -on: - push: - branches: - - main - -permissions: - contents: write - pull-requests: write - -name: Create-Release - -jobs: - create-release: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - ref: ${{ github.event.workflow_run.head_sha }} - - - uses: codfish/semantic-release-action@v4 - id: semantic - with: - tag-format: 'v${version}' - additional-packages: | - ['conventional-changelog-conventionalcommits@7'] - plugins: | - [ - [ - "@semantic-release/commit-analyzer", - { - "preset": "conventionalcommits" - } - ], - [ - "@semantic-release/release-notes-generator", - { - "preset": "conventionalcommits", - "presetConfig": { - "types": [ - { type: 'feat', section: 'Features', hidden: false }, - { type: 'fix', section: 'Bug Fixes', hidden: false }, - { type: 'perf', section: 'Performance Improvements', hidden: false }, - { type: 'revert', section: 'Reverts', hidden: false }, - { type: 'docs', section: 'Other Updates', hidden: false }, - { type: 'style', section: 'Other Updates', hidden: false }, - { type: 'chore', section: 'Other Updates', hidden: false }, - { type: 'refactor', section: 'Other Updates', hidden: false }, - { type: 'test', section: 'Other Updates', hidden: false }, - { type: 'build', section: 'Other Updates', hidden: false }, - { type: 'ci', section: 'Other Updates', hidden: false } - ] - } - } - ], - '@semantic-release/github' - ] - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: echo ${{ steps.semantic.outputs.release-version }} - - - run: echo "$OUTPUTS" - env: - OUTPUTS: ${{ toJson(steps.semantic.outputs) }} diff --git a/archive-doc-gen/.github/workflows/deploy-linux.yml b/archive-doc-gen/.github/workflows/deploy-linux.yml deleted file mode 100644 index c45aae3f5..000000000 --- a/archive-doc-gen/.github/workflows/deploy-linux.yml +++ /dev/null @@ -1,283 +0,0 @@ -name: Deploy-Test-Cleanup (v2) Linux -on: - pull_request: - branches: - - main - paths: - - 'src/frontend/**' - - 'src/**/*.py' - - 'src/requirements*.txt' - - 'src/WebApp.Dockerfile' - - '!src/tests/**' - - 'infra/**/*.bicep' - - 'infra/**/*.json' - - '*.yaml' - - '.github/workflows/deploy-*.yml' - workflow_run: - workflows: ["Build Docker and Optional Push"] - types: - - completed - branches: - - main - - dev - - demo - workflow_dispatch: - inputs: - azure_location: - description: 'Azure Location For Deployment' - required: false - default: 'australiaeast' - type: choice - options: - - 'australiaeast' - - 'centralus' - - 'eastasia' - - 'eastus2' - - 'japaneast' - - 'northeurope' - - 'southeastasia' - - 'uksouth' - resource_group_name: - description: 'Resource Group Name (Optional)' - required: false - default: '' - type: string - - waf_enabled: - description: 'Enable WAF' - required: false - default: false - type: boolean - EXP: - description: 'Enable EXP' - required: false - default: false - type: boolean - build_docker_image: - description: 'Build And Push Docker Image (Optional)' - required: false - default: false - type: boolean - - cleanup_resources: - description: 'Cleanup Deployed Resources' - required: false - default: false - type: boolean - - run_e2e_tests: - description: 'Run End-to-End Tests' - required: false - default: 'GoldenPath-Testing' - type: choice - options: - - 'GoldenPath-Testing' - - 'Smoke-Testing' - - 'None' - - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: - description: 'Log Analytics Workspace ID (Optional)' - required: false - default: '' - type: string - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: - description: 'AI Project Resource ID (Optional)' - required: false - default: '' - type: string - existing_webapp_url: - description: 'Existing WebApp URL (Skips Deployment)' - required: false - default: '' - type: string - - schedule: - - cron: '0 9,21 * * *' # Runs at 9:00 AM and 9:00 PM GMT -permissions: - contents: read - actions: read -jobs: - validate-inputs: - runs-on: ubuntu-latest - outputs: - validation_passed: ${{ steps.validate.outputs.passed }} - azure_location: ${{ steps.validate.outputs.azure_location }} - resource_group_name: ${{ steps.validate.outputs.resource_group_name }} - waf_enabled: ${{ steps.validate.outputs.waf_enabled }} - exp: ${{ steps.validate.outputs.exp }} - build_docker_image: ${{ steps.validate.outputs.build_docker_image }} - cleanup_resources: ${{ steps.validate.outputs.cleanup_resources }} - run_e2e_tests: ${{ steps.validate.outputs.run_e2e_tests }} - azure_env_log_analytics_workspace_id: ${{ steps.validate.outputs.azure_env_log_analytics_workspace_id }} - azure_existing_ai_project_resource_id: ${{ steps.validate.outputs.azure_existing_ai_project_resource_id }} - existing_webapp_url: ${{ steps.validate.outputs.existing_webapp_url }} - steps: - - name: Validate Workflow Input Parameters - id: validate - shell: bash - env: - INPUT_AZURE_LOCATION: ${{ github.event.inputs.azure_location }} - INPUT_RESOURCE_GROUP_NAME: ${{ github.event.inputs.resource_group_name }} - INPUT_WAF_ENABLED: ${{ github.event.inputs.waf_enabled }} - INPUT_EXP: ${{ github.event.inputs.EXP }} - INPUT_BUILD_DOCKER_IMAGE: ${{ github.event.inputs.build_docker_image }} - INPUT_CLEANUP_RESOURCES: ${{ github.event.inputs.cleanup_resources }} - INPUT_RUN_E2E_TESTS: ${{ github.event.inputs.run_e2e_tests }} - INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - INPUT_EXISTING_WEBAPP_URL: ${{ github.event.inputs.existing_webapp_url }} - run: | - echo "🔍 Validating workflow input parameters..." - VALIDATION_FAILED=false - - # Validate azure_location (Azure region format) - LOCATION="${INPUT_AZURE_LOCATION:-australiaeast}" - - if [[ ! "$LOCATION" =~ ^[a-z0-9]+$ ]]; then - echo "❌ ERROR: azure_location '$LOCATION' is invalid. Must contain only lowercase letters and numbers" - VALIDATION_FAILED=true - else - echo "✅ azure_location: '$LOCATION' is valid" - fi - - # Validate resource_group_name (Azure naming convention, optional) - if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then - if [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then - echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period." - VALIDATION_FAILED=true - elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then - echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters (length: ${#INPUT_RESOURCE_GROUP_NAME})" - VALIDATION_FAILED=true - else - echo "✅ resource_group_name: '$INPUT_RESOURCE_GROUP_NAME' is valid" - fi - else - echo "✅ resource_group_name: Not provided (will be auto-generated)" - fi - - # Validate waf_enabled (boolean) - WAF_ENABLED="${INPUT_WAF_ENABLED:-false}" - if [[ "$WAF_ENABLED" != "true" && "$WAF_ENABLED" != "false" ]]; then - echo "❌ ERROR: waf_enabled must be 'true' or 'false', got: '$WAF_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ waf_enabled: '$WAF_ENABLED' is valid" - fi - - # Validate EXP (boolean) - EXP_ENABLED="${INPUT_EXP:-false}" - if [[ "$EXP_ENABLED" != "true" && "$EXP_ENABLED" != "false" ]]; then - echo "❌ ERROR: EXP must be 'true' or 'false', got: '$EXP_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ EXP: '$EXP_ENABLED' is valid" - fi - - # Validate build_docker_image (boolean) - BUILD_DOCKER="${INPUT_BUILD_DOCKER_IMAGE:-false}" - if [[ "$BUILD_DOCKER" != "true" && "$BUILD_DOCKER" != "false" ]]; then - echo "❌ ERROR: build_docker_image must be 'true' or 'false', got: '$BUILD_DOCKER'" - VALIDATION_FAILED=true - else - echo "✅ build_docker_image: '$BUILD_DOCKER' is valid" - fi - - # Validate cleanup_resources (boolean) - CLEANUP_RESOURCES="${INPUT_CLEANUP_RESOURCES:-false}" - if [[ "$CLEANUP_RESOURCES" != "true" && "$CLEANUP_RESOURCES" != "false" ]]; then - echo "❌ ERROR: cleanup_resources must be 'true' or 'false', got: '$CLEANUP_RESOURCES'" - VALIDATION_FAILED=true - else - echo "✅ cleanup_resources: '$CLEANUP_RESOURCES' is valid" - fi - - # Validate run_e2e_tests (specific allowed values) - TEST_OPTION="${INPUT_RUN_E2E_TESTS:-GoldenPath-Testing}" - if [[ "$TEST_OPTION" != "GoldenPath-Testing" && "$TEST_OPTION" != "Smoke-Testing" && "$TEST_OPTION" != "None" ]]; then - echo "❌ ERROR: run_e2e_tests must be one of: GoldenPath-Testing, Smoke-Testing, None, got: '$TEST_OPTION'" - VALIDATION_FAILED=true - else - echo "✅ run_e2e_tests: '$TEST_OPTION' is valid" - fi - - # Validate AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID (optional, Azure Resource ID format) - if [[ -n "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" ]]; then - if [[ ! "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then - echo "❌ ERROR: AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}" - echo " Got: '$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: Valid Resource ID format" - fi - else - echo "✅ AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: Not provided (optional)" - fi - - # Validate AZURE_EXISTING_AI_PROJECT_RESOURCE_ID (optional, Azure Resource ID format) - if [[ -n "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" ]]; then - if [[ ! "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/([Mm]icrosoft\.[Mm]achine[Ll]earning[Ss]ervices/([Ww]orkspaces|[Pp]rojects)/[^/]+|[Mm]icrosoft\.[Cc]ognitive[Ss]ervices/[Aa]ccounts/[^/]+/[Pp]rojects/[^/]+)$ ]]; then - echo "❌ ERROR: AZURE_EXISTING_AI_PROJECT_RESOURCE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}" - echo " Got: '$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: Valid Resource ID format" - fi - else - echo "✅ AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: Not provided (optional)" - fi - - # Validate existing_webapp_url (optional, must start with https) - if [[ -n "$INPUT_EXISTING_WEBAPP_URL" ]]; then - if [[ ! "$INPUT_EXISTING_WEBAPP_URL" =~ ^https:// ]]; then - echo "❌ ERROR: existing_webapp_url must start with 'https://', got: '$INPUT_EXISTING_WEBAPP_URL'" - VALIDATION_FAILED=true - else - echo "✅ existing_webapp_url: '$INPUT_EXISTING_WEBAPP_URL' is valid" - fi - else - echo "✅ existing_webapp_url: Not provided (will perform deployment)" - fi - - # Fail workflow if any validation failed - if [[ "$VALIDATION_FAILED" == "true" ]]; then - echo "" - echo "❌ Parameter validation failed. Please correct the errors above and try again." - exit 1 - fi - - echo "" - echo "✅ All input parameters validated successfully!" - - # Output validated values - echo "passed=true" >> $GITHUB_OUTPUT - echo "azure_location=$LOCATION" >> $GITHUB_OUTPUT - echo "resource_group_name=$INPUT_RESOURCE_GROUP_NAME" >> $GITHUB_OUTPUT - echo "waf_enabled=$WAF_ENABLED" >> $GITHUB_OUTPUT - echo "exp=$EXP_ENABLED" >> $GITHUB_OUTPUT - echo "build_docker_image=$BUILD_DOCKER" >> $GITHUB_OUTPUT - echo "cleanup_resources=$CLEANUP_RESOURCES" >> $GITHUB_OUTPUT - echo "run_e2e_tests=$TEST_OPTION" >> $GITHUB_OUTPUT - echo "azure_env_log_analytics_workspace_id=$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" >> $GITHUB_OUTPUT - echo "azure_existing_ai_project_resource_id=$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" >> $GITHUB_OUTPUT - echo "existing_webapp_url=$INPUT_EXISTING_WEBAPP_URL" >> $GITHUB_OUTPUT - - Run: - needs: validate-inputs - if: needs.validate-inputs.outputs.validation_passed == 'true' - uses: ./.github/workflows/deploy-orchestrator.yml - with: - runner_os: ubuntu-latest - azure_location: ${{ needs.validate-inputs.outputs.azure_location || 'australiaeast' }} - resource_group_name: ${{ needs.validate-inputs.outputs.resource_group_name || '' }} - waf_enabled: ${{ needs.validate-inputs.outputs.waf_enabled == 'true' }} - EXP: ${{ needs.validate-inputs.outputs.exp == 'true' }} - build_docker_image: ${{ needs.validate-inputs.outputs.build_docker_image == 'true' }} - cleanup_resources: ${{ needs.validate-inputs.outputs.cleanup_resources == 'true' }} - run_e2e_tests: ${{ needs.validate-inputs.outputs.run_e2e_tests || 'GoldenPath-Testing' }} - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ needs.validate-inputs.outputs.azure_env_log_analytics_workspace_id || '' }} - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ needs.validate-inputs.outputs.azure_existing_ai_project_resource_id || '' }} - existing_webapp_url: ${{ needs.validate-inputs.outputs.existing_webapp_url || '' }} - trigger_type: ${{ github.event_name }} - secrets: inherit diff --git a/archive-doc-gen/.github/workflows/deploy-orchestrator.yml b/archive-doc-gen/.github/workflows/deploy-orchestrator.yml deleted file mode 100644 index 31741f3b4..000000000 --- a/archive-doc-gen/.github/workflows/deploy-orchestrator.yml +++ /dev/null @@ -1,141 +0,0 @@ -name: Deployment orchestrator - -on: - workflow_call: - inputs: - runner_os: - description: 'Runner OS (ubuntu-latest or windows-latest)' - required: true - type: string - azure_location: - description: 'Azure Location For Deployment' - required: false - default: 'australiaeast' - type: string - resource_group_name: - description: 'Resource Group Name (Optional)' - required: false - default: '' - type: string - waf_enabled: - description: 'Enable WAF' - required: false - default: false - type: boolean - EXP: - description: 'Enable EXP' - required: false - default: false - type: boolean - build_docker_image: - description: 'Build And Push Docker Image (Optional)' - required: false - default: false - type: boolean - cleanup_resources: - description: 'Cleanup Deployed Resources' - required: false - default: false - type: boolean - run_e2e_tests: - description: 'Run End-to-End Tests' - required: false - default: 'GoldenPath-Testing' - type: string - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: - description: 'Log Analytics Workspace ID (Optional)' - required: false - default: '' - type: string - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: - description: 'AI Project Resource ID (Optional)' - required: false - default: '' - type: string - existing_webapp_url: - description: 'Existing Container WebApp URL (Skips Deployment)' - required: false - default: '' - type: string - trigger_type: - description: 'Trigger type (workflow_dispatch, pull_request, schedule)' - required: true - type: string - -env: - AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }} -permissions: - contents: read - actions: read - -jobs: - docker-build: - uses: ./.github/workflows/job-docker-build.yml - with: - trigger_type: ${{ inputs.trigger_type }} - build_docker_image: ${{ inputs.build_docker_image }} - secrets: inherit - - deploy: - if: "!cancelled() && (needs.docker-build.result == 'success' || needs.docker-build.result == 'skipped') && (inputs.trigger_type != 'workflow_dispatch' || inputs.existing_webapp_url == '' || inputs.existing_webapp_url == null)" - needs: docker-build - uses: ./.github/workflows/job-deploy.yml - with: - trigger_type: ${{ inputs.trigger_type }} - runner_os: ${{ inputs.runner_os }} - azure_location: ${{ inputs.azure_location }} - resource_group_name: ${{ inputs.resource_group_name }} - waf_enabled: ${{ inputs.waf_enabled }} - EXP: ${{ inputs.EXP }} - build_docker_image: ${{ inputs.build_docker_image }} - existing_webapp_url: ${{ inputs.existing_webapp_url }} - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - docker_image_tag: ${{ needs.docker-build.outputs.IMAGE_TAG }} - run_e2e_tests: ${{ inputs.run_e2e_tests }} - cleanup_resources: ${{ inputs.cleanup_resources }} - secrets: inherit - - e2e-test: - if: "!cancelled() && ((needs.deploy.result == 'success' && needs.deploy.outputs.WEB_APPURL != '') || (inputs.existing_webapp_url != '' && inputs.existing_webapp_url != null)) && (inputs.trigger_type != 'workflow_dispatch' || (inputs.run_e2e_tests != 'None' && inputs.run_e2e_tests != '' && inputs.run_e2e_tests != null))" - needs: [docker-build, deploy] - uses: ./.github/workflows/test-automation-v2.yml - with: - DOCGEN_URL: ${{ needs.deploy.outputs.WEB_APPURL || inputs.existing_webapp_url }} - TEST_SUITE: ${{ inputs.trigger_type == 'workflow_dispatch' && inputs.run_e2e_tests || 'GoldenPath-Testing' }} - secrets: inherit - - send-notification: - if: "!cancelled()" - needs: [docker-build, deploy, e2e-test] - uses: ./.github/workflows/job-send-notification.yml - with: - trigger_type: ${{ inputs.trigger_type }} - waf_enabled: ${{ inputs.waf_enabled }} - EXP: ${{ inputs.EXP }} - run_e2e_tests: ${{ inputs.run_e2e_tests }} - existing_webapp_url: ${{ inputs.existing_webapp_url }} - deploy_result: ${{ needs.deploy.result }} - e2e_test_result: ${{ needs.e2e-test.result }} - WEB_APPURL: ${{ needs.deploy.outputs.WEB_APPURL || inputs.existing_webapp_url }} - RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }} - QUOTA_FAILED: ${{ needs.deploy.outputs.QUOTA_FAILED }} - TEST_SUCCESS: ${{ needs.e2e-test.outputs.TEST_SUCCESS }} - TEST_REPORT_URL: ${{ needs.e2e-test.outputs.TEST_REPORT_URL }} - secrets: inherit - - cleanup-deployment: - if: "!cancelled() && needs.deploy.outputs.RESOURCE_GROUP_NAME != '' && inputs.existing_webapp_url == '' && (inputs.trigger_type != 'workflow_dispatch' || inputs.cleanup_resources)" - needs: [docker-build, deploy, e2e-test] - uses: ./.github/workflows/job-cleanup-deployment.yml - with: - runner_os: ${{ inputs.runner_os }} - trigger_type: ${{ inputs.trigger_type }} - cleanup_resources: ${{ inputs.cleanup_resources }} - existing_webapp_url: ${{ inputs.existing_webapp_url }} - RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }} - AZURE_LOCATION: ${{ needs.deploy.outputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: ${{ needs.deploy.outputs.AZURE_ENV_OPENAI_LOCATION }} - ENV_NAME: ${{ needs.deploy.outputs.ENV_NAME }} - IMAGE_TAG: ${{ needs.deploy.outputs.IMAGE_TAG }} - secrets: inherit diff --git a/archive-doc-gen/.github/workflows/deploy-v2.yml b/archive-doc-gen/.github/workflows/deploy-v2.yml deleted file mode 100644 index 555b7614b..000000000 --- a/archive-doc-gen/.github/workflows/deploy-v2.yml +++ /dev/null @@ -1,853 +0,0 @@ -name: Deploy-Test-Cleanup (v2) -on: - pull_request: - branches: - - main - workflow_run: - workflows: ["Build Docker and Optional Push"] - types: - - completed - branches: - - main - - dev - - demo - workflow_dispatch: - inputs: - azure_location: - description: 'Azure Location For Deployment' - required: false - default: 'australiaeast' - type: choice - options: - - 'australiaeast' - - 'centralus' - - 'eastasia' - - 'eastus2' - - 'japaneast' - - 'northeurope' - - 'southeastasia' - - 'uksouth' - - 'eastus' - resource_group_name: - description: 'Resource Group Name (Optional)' - required: false - default: '' - type: string - - waf_enabled: - description: 'Enable WAF' - required: false - default: false - type: boolean - EXP: - description: 'Enable EXP' - required: false - default: false - type: boolean - build_docker_image: - description: 'Build And Push Docker Image (Optional)' - required: false - default: false - type: boolean - run_e2e_tests: - description: 'Run End-to-End Tests' - required: false - default: true - type: boolean - cleanup_resources: - description: 'Cleanup Deployed Resources' - required: false - default: false - type: boolean - - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: - description: 'Log Analytics Workspace ID (Optional)' - required: false - default: '' - type: string - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: - description: 'AI Project Resource ID (Optional)' - required: false - default: '' - type: string - existing_webapp_url: - description: 'Existing WebApp URL (Skips Deployment)' - required: false - default: '' - type: string - - schedule: - - cron: '0 9,21 * * *' # Runs at 9:00 AM and 9:00 PM GMT -env: - GPT_MIN_CAPACITY: 150 - TEXT_EMBEDDING_MIN_CAPACITY: 80 - BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }} - # For automatic triggers (pull_request, workflow_run, schedule): force Non-WAF + Non-EXP - # For manual dispatch: use input values or defaults - WAF_ENABLED: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.waf_enabled || false) || false }} - EXP: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.EXP || false) || false }} - CLEANUP_RESOURCES: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.cleanup_resources || true) || true }} - RUN_E2E_TESTS: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.run_e2e_tests || true) || true }} - BUILD_DOCKER_IMAGE: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.build_docker_image || false) || false }} - AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }} - -jobs: - docker-build: - if: github.event_name == 'workflow_dispatch' && github.event.inputs.build_docker_image == 'true' - runs-on: ubuntu-latest - outputs: - IMAGE_TAG: ${{ steps.generate_docker_tag.outputs.IMAGE_TAG }} - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Generate Unique Docker Image Tag - id: generate_docker_tag - run: | - echo "🔨 Building new Docker image - generating unique tag..." - # Generate unique tag for manual deployment runs - TIMESTAMP=$(date +%Y%m%d-%H%M%S) - RUN_ID="${{ github.run_id }}" - BRANCH_NAME="${{ github.head_ref || github.ref_name }}" - # Sanitize branch name for Docker tag (replace invalid characters with hyphens) - CLEAN_BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/[^a-zA-Z0-9._-]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g') - UNIQUE_TAG="${CLEAN_BRANCH_NAME}-${TIMESTAMP}-${RUN_ID}" - echo "IMAGE_TAG=$UNIQUE_TAG" >> $GITHUB_ENV - echo "IMAGE_TAG=$UNIQUE_TAG" >> $GITHUB_OUTPUT - echo "Generated unique Docker tag: $UNIQUE_TAG" - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to Azure Container Registry - uses: azure/docker-login@v2 - with: - login-server: ${{ secrets.ACR_TEST_LOGIN_SERVER }} - username: ${{ secrets.ACR_TEST_USERNAME }} - password: ${{ secrets.ACR_TEST_PASSWORD }} - - - name: Build and Push Docker Image - id: build_push_image - uses: docker/build-push-action@v6 - env: - DOCKER_BUILD_SUMMARY: false - with: - context: ./src - file: ./src/WebApp.Dockerfile - push: true - tags: | - ${{ secrets.ACR_TEST_LOGIN_SERVER }}/webapp:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }} - ${{ secrets.ACR_TEST_LOGIN_SERVER }}/webapp:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }} - - - name: Verify Docker Image Build - run: | - echo "✅ Docker image successfully built and pushed" - echo "Image tag: ${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}" - echo "Run number: ${{ github.run_number }}" - - - name: Generate Docker Build Summary - if: always() - run: | - # Extract ACR name from the secret - ACR_NAME=$(echo "${{ secrets.ACR_TEST_LOGIN_SERVER }}" | cut -d'.' -f1) - echo "## 🐳 Docker Build Job Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| **Job Status** | ${{ job.status == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Image Tag** | \`${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Registry** | \`${ACR_NAME}.azurecr.io\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Full Image Path** | \`${ACR_NAME}.azurecr.io/webapp:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Trigger** | ${{ github.event_name }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Branch** | ${{ env.BRANCH_NAME }} |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [[ "${{ job.status }}" == "success" ]]; then - echo "### ✅ Build Details" >> $GITHUB_STEP_SUMMARY - echo "- Docker image successfully built and pushed to ACR" >> $GITHUB_STEP_SUMMARY - echo "- Generated unique tag: \`${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}\`" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Build Failed" >> $GITHUB_STEP_SUMMARY - echo "- Docker build process encountered an error" >> $GITHUB_STEP_SUMMARY - echo "- Check the docker-build job for detailed error information" >> $GITHUB_STEP_SUMMARY - fi - - deploy: - if: always() && (github.event_name != 'workflow_dispatch' || github.event.inputs.existing_webapp_url == '' || github.event.inputs.existing_webapp_url == null) - needs: [docker-build] - runs-on: ubuntu-latest - outputs: - RESOURCE_GROUP_NAME: ${{ steps.check_create_rg.outputs.RESOURCE_GROUP_NAME }} - WEBAPP_URL: ${{ steps.get_output.outputs.WEBAPP_URL }} - ENV_NAME: ${{ steps.generate_env_name.outputs.ENV_NAME }} - AZURE_LOCATION: ${{ steps.set_region.outputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: ${{ steps.set_region.outputs.AZURE_ENV_OPENAI_LOCATION }} - IMAGE_TAG: ${{ steps.determine_image_tag.outputs.IMAGE_TAG }} - QUOTA_FAILED: ${{ steps.quota_failure_output.outputs.QUOTA_FAILED }} - env: - # For automatic triggers: force Non-WAF + Non-EXP, for manual dispatch: use inputs - WAF_ENABLED: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.waf_enabled || false) || false }} - EXP: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.EXP || false) || false }} - CLEANUP_RESOURCES: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.cleanup_resources || true) || true }} - - steps: - - name: Display Workflow Configuration - run: | - echo "🚀 ===================================" - echo "📋 WORKFLOW CONFIGURATION SUMMARY" - echo "🚀 ===================================" - echo "Trigger Type: ${{ github.event_name }}" - echo "Branch: ${{ env.BRANCH_NAME }}" - echo "" - echo "Configuration Settings:" - echo " • WAF Enabled: ${{ env.WAF_ENABLED }}" - echo " • EXP Enabled: ${{ env.EXP }}" - echo " • Run E2E Tests: ${{ env.RUN_E2E_TESTS }}" - echo " • Cleanup Resources: ${{ env.CLEANUP_RESOURCES }}" - echo " • Build Docker Image: ${{ env.BUILD_DOCKER_IMAGE }}" - if [[ "${{ github.event_name }}" == "workflow_dispatch" && -n "${{ github.event.inputs.azure_location }}" ]]; then - echo " • Selected Azure Location: ${{ github.event.inputs.azure_location }}" - else - echo " • Azure Location: Will be determined by quota check" - fi - if [[ "${{ github.event.inputs.existing_webapp_url }}" != "" ]]; then - echo " • Using Existing Webapp URL: ${{ github.event.inputs.existing_webapp_url }}" - echo " • Skip Deployment: Yes" - else - echo " • Skip Deployment: No" - fi - echo "" - if [[ "${{ github.event_name }}" != "workflow_dispatch" ]]; then - echo "ℹ️ Automatic Trigger: Using Non-WAF + Non-EXP configuration" - else - echo "ℹ️ Manual Trigger: Using user-specified configuration" - # Check if EXP was auto-enabled after user input validation - if [[ "${{ env.EXP }}" == "true" && "${{ github.event.inputs.EXP }}" != "true" ]]; then - echo "🔧 Note: EXP was automatically enabled due to provided parameter values" - fi - fi - echo "🚀 ===================================" - - - name: Validate and Auto-Configure EXP - run: | - echo "🔍 Validating EXP configuration..." - - # Check if EXP values were provided but EXP is disabled - if [[ "${{ github.event.inputs.EXP }}" != "true" ]]; then - if [[ -n "${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" ]] || [[ -n "${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" ]]; then - echo "🔧 AUTO-ENABLING EXP: EXP parameter values were provided but EXP was not explicitly enabled." - echo "" - echo "You provided values for:" - [[ -n "${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" ]] && echo " - Azure Log Analytics Workspace ID: '${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}'" - [[ -n "${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" ]] && echo " - Azure AI Project Resource ID: '${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}'" - echo "" - echo "✅ Automatically enabling EXP to use these values." - echo "EXP=true" >> $GITHUB_ENV - echo "📌 EXP has been automatically enabled for this deployment." - fi - fi - - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Azure CLI - run: | - curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash - az --version # Verify installation - - - name: Run Quota Check - id: quota-check - run: | - export AZURE_CLIENT_ID=${{ secrets.AZURE_CLIENT_ID }} - export AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }} - export AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }} - export AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}" - export GPT_MIN_CAPACITY=${{ env.GPT_MIN_CAPACITY }} - export TEXT_EMBEDDING_MIN_CAPACITY=${{ env.TEXT_EMBEDDING_MIN_CAPACITY }} - export AZURE_REGIONS="${{ vars.AZURE_REGIONS }}" - - chmod +x scripts/checkquota.sh - if ! scripts/checkquota.sh; then - # If quota check fails due to insufficient quota, set the flag - if grep -q "No region with sufficient quota found" scripts/checkquota.sh; then - echo "QUOTA_FAILED=true" >> $GITHUB_ENV - fi - exit 1 # Fail the pipeline if any other failure occurs - fi - - - - - - name: Set Quota Failure Output - id: quota_failure_output - if: env.QUOTA_FAILED == 'true' - run: | - echo "QUOTA_FAILED=true" >> $GITHUB_OUTPUT - echo "Quota check failed - will notify via separate notification job" - - - name: Fail Pipeline if Quota Check Fails - if: env.QUOTA_FAILED == 'true' - run: exit 1 - - - name: Set Deployment Region - id: set_region - run: | - # Set AZURE_ENV_OPENAI_LOCATION from quota check result - echo "Selected Region from Quota Check: $VALID_REGION" - echo "AZURE_ENV_OPENAI_LOCATION=$VALID_REGION" >> $GITHUB_ENV - echo "AZURE_ENV_OPENAI_LOCATION=$VALID_REGION" >> $GITHUB_OUTPUT - - # Set AZURE_LOCATION from user input (for manual dispatch) or default to quota check result (for automatic triggers) - if [[ "${{ github.event_name }}" == "workflow_dispatch" && -n "${{ github.event.inputs.azure_location }}" ]]; then - USER_SELECTED_LOCATION="${{ github.event.inputs.azure_location }}" - echo "Using user-selected Azure location: $USER_SELECTED_LOCATION" - echo "AZURE_LOCATION=$USER_SELECTED_LOCATION" >> $GITHUB_ENV - echo "AZURE_LOCATION=$USER_SELECTED_LOCATION" >> $GITHUB_OUTPUT - else - echo "Using location from quota check for automatic triggers: $VALID_REGION" - echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_ENV - echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_OUTPUT - fi - - - name: Generate Resource Group Name - id: generate_rg_name - run: | - # Check if a resource group name was provided as input - if [[ -n "${{ github.event.inputs.resource_group_name }}" ]]; then - echo "Using provided Resource Group name: ${{ github.event.inputs.resource_group_name }}" - echo "RESOURCE_GROUP_NAME=${{ github.event.inputs.resource_group_name }}" >> $GITHUB_ENV - else - echo "Generating a unique resource group name..." - ACCL_NAME="docgen" # Account name as specified - SHORT_UUID=$(uuidgen | cut -d'-' -f1) - UNIQUE_RG_NAME="arg-${ACCL_NAME}-${SHORT_UUID}" - echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV - echo "Generated RESOURCE_GROUP_NAME: ${UNIQUE_RG_NAME}" - fi - - - name: Setup Azure Developer CLI - run: | - curl -fsSL https://aka.ms/install-azd.sh | sudo bash - azd version - - - name: Login to Azure - id: login-azure - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --client-secret ${{ secrets.AZURE_CLIENT_SECRET }} --tenant-id ${{ secrets.AZURE_TENANT_ID }} - - - name: Install Bicep CLI - run: az bicep install - - - name: Check and Create Resource Group - id: check_create_rg - run: | - set -e - echo "🔍 Checking if resource group '$RESOURCE_GROUP_NAME' exists..." - rg_exists=$(az group exists --name $RESOURCE_GROUP_NAME) - if [ "$rg_exists" = "false" ]; then - echo "📦 Resource group does not exist. Creating new resource group '$RESOURCE_GROUP_NAME' in location '$AZURE_LOCATION'..." - az group create --name $RESOURCE_GROUP_NAME --location $AZURE_LOCATION || { echo "❌ Error creating resource group"; exit 1; } - echo "✅ Resource group '$RESOURCE_GROUP_NAME' created successfully." - else - echo "✅ Resource group '$RESOURCE_GROUP_NAME' already exists. Deploying to existing resource group." - fi - echo "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" >> $GITHUB_OUTPUT - - - name: Generate Unique Solution Prefix - id: generate_solution_prefix - run: | - set -e - COMMON_PART="psldg" - TIMESTAMP=$(date +%s) - UPDATED_TIMESTAMP=$(echo $TIMESTAMP | tail -c 6) - UNIQUE_SOLUTION_PREFIX="${COMMON_PART}${UPDATED_TIMESTAMP}" - echo "SOLUTION_PREFIX=${UNIQUE_SOLUTION_PREFIX}" >> $GITHUB_ENV - echo "Generated SOLUTION_PREFIX: ${UNIQUE_SOLUTION_PREFIX}" - - - name: Determine Docker Image Tag - id: determine_image_tag - run: | - if [[ "${{ env.BUILD_DOCKER_IMAGE }}" == "true" ]]; then - # Use the tag from docker-build job if it was built - if [[ "${{ needs.docker-build.result }}" == "success" ]]; then - IMAGE_TAG="${{ needs.docker-build.outputs.IMAGE_TAG }}" - echo "🔗 Using Docker image tag from build job: $IMAGE_TAG" - else - echo "❌ Docker build job failed or was skipped, but BUILD_DOCKER_IMAGE is true" - exit 1 - fi - else - echo "🏷️ Using existing Docker image based on branch..." - BRANCH_NAME="${{ env.BRANCH_NAME }}" - echo "Current branch: $BRANCH_NAME" - - # Determine image tag based on branch - if [[ "$BRANCH_NAME" == "main" ]]; then - IMAGE_TAG="latest_waf" - echo "Using main branch - image tag: latest_waf" - elif [[ "$BRANCH_NAME" == "dev" ]]; then - IMAGE_TAG="dev" - echo "Using dev branch - image tag: dev" - elif [[ "$BRANCH_NAME" == "demo" ]]; then - IMAGE_TAG="demo" - echo "Using demo branch - image tag: demo" - else - IMAGE_TAG="latest_waf" - echo "Using default for branch '$BRANCH_NAME' - image tag: latest_waf" - fi - - echo "Using existing Docker image tag: $IMAGE_TAG" - fi - - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_OUTPUT - - - name: Generate Unique Environment Name - id: generate_env_name - run: | - COMMON_PART="pslc" - TIMESTAMP=$(date +%s) - UPDATED_TIMESTAMP=$(echo $TIMESTAMP | tail -c 6) - UNIQUE_ENV_NAME="${COMMON_PART}${UPDATED_TIMESTAMP}" - echo "ENV_NAME=${UNIQUE_ENV_NAME}" >> $GITHUB_ENV - echo "Generated Environment Name: ${UNIQUE_ENV_NAME}" - echo "ENV_NAME=${UNIQUE_ENV_NAME}" >> $GITHUB_OUTPUT - - - name: Configure Parameters Based on WAF Setting - run: | - if [[ "${{ env.WAF_ENABLED }}" == "true" ]]; then - echo "🔧 Configuring WAF deployment - copying main.waf.parameters.json to main.parameters.json..." - cp infra/main.waf.parameters.json infra/main.parameters.json - echo "✅ Successfully copied WAF parameters to main parameters file" - else - echo "🔧 Configuring Non-WAF deployment - using default main.parameters.json..." - # Ensure we have the original parameters file if it was overwritten - if [[ -f infra/main.waf.parameters.json ]] && [[ ! -f infra/main.parameters.json.backup ]]; then - echo "Backing up original parameters file..." - git checkout HEAD -- infra/main.parameters.json || echo "Using existing main.parameters.json" - fi - fi - - - name: Display Docker Image Tag - run: | - echo "=== Docker Image Information ===" - echo "Docker Image Tag: ${{ steps.determine_image_tag.outputs.IMAGE_TAG }}" - echo "Registry: ${{ secrets.ACR_TEST_LOGIN_SERVER }}" - echo "Full Image: ${{ secrets.ACR_TEST_LOGIN_SERVER }}/webapp:${{ steps.determine_image_tag.outputs.IMAGE_TAG }}" - echo "================================" - - - name: Deploy using azd up and extract values (${{ github.event.inputs.waf_enabled == 'true' && 'WAF' || 'Non-WAF' }}+${{ (github.event.inputs.EXP == 'true' || github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID != '' || github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID != '') && 'EXP' || 'Non-EXP' }}) - id: get_output - run: | - set -e - echo "Starting azd deployment..." - echo "WAF Enabled: ${{ env.WAF_ENABLED }}" - echo "EXP: ${{ env.EXP }}" - echo "Using Docker Image Tag: ${{ steps.determine_image_tag.outputs.IMAGE_TAG }}" - - # Install azd (Azure Developer CLI) - curl -fsSL https://aka.ms/install-azd.sh | bash - - # Generate current timestamp in desired format: YYYY-MM-DDTHH:MM:SS.SSSSSSSZ - current_date=$(date -u +"%Y-%m-%dT%H:%M:%S.%7NZ") - - echo "Creating environment..." - azd env new $ENV_NAME --no-prompt - echo "Environment created: $ENV_NAME" - - echo "Setting default subscription..." - azd config set defaults.subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - # Set additional parameters - azd env set AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}" - azd env set AZURE_ENV_OPENAI_LOCATION="$AZURE_ENV_OPENAI_LOCATION" - azd env set AZURE_LOCATION="$AZURE_LOCATION" - azd env set AZURE_RESOURCE_GROUP="$RESOURCE_GROUP_NAME" - azd env set AZURE_ENV_IMAGETAG="${{ steps.determine_image_tag.outputs.IMAGE_TAG }}" - - # Set ACR name only when building Docker image - if [[ "${{ env.BUILD_DOCKER_IMAGE }}" == "true" ]]; then - # Extract ACR name from login server and set as environment variable - ACR_NAME=$(echo "${{ secrets.ACR_TEST_LOGIN_SERVER }}" | cut -d'.' -f1) - azd env set AZURE_ENV_ACR_NAME="$ACR_NAME" - echo "Set ACR name to: $ACR_NAME" - else - echo "Skipping ACR name configuration (using existing image)" - fi - - if [[ "${{ env.EXP }}" == "true" ]]; then - echo "✅ EXP ENABLED - Setting EXP parameters..." - - # Set EXP variables dynamically - if [[ -n "${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" ]]; then - EXP_LOG_ANALYTICS_ID="${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" - else - EXP_LOG_ANALYTICS_ID="${{ secrets.EXP_LOG_ANALYTICS_WORKSPACE_ID }}" - fi - - if [[ -n "${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" ]]; then - EXP_AI_PROJECT_ID="${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" - else - EXP_AI_PROJECT_ID="${{ secrets.EXP_AI_PROJECT_RESOURCE_ID }}" - fi - - echo "AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: $EXP_LOG_ANALYTICS_ID" - echo "AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: $EXP_AI_PROJECT_ID" - azd env set AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID="$EXP_LOG_ANALYTICS_ID" - azd env set AZURE_EXISTING_AI_PROJECT_RESOURCE_ID="$EXP_AI_PROJECT_ID" - else - echo "❌ EXP DISABLED - Skipping EXP parameters" - if [[ -n "${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" ]] || [[ -n "${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" ]]; then - echo "⚠️ Warning: EXP parameter values provided but EXP is disabled. These values will be ignored." - fi - fi - - # Deploy using azd up - azd up --no-prompt - - # Get deployment outputs using azd - echo "Extracting deployment outputs..." - DEPLOY_OUTPUT=$(azd env get-values --output json) - echo "Deployment output: $DEPLOY_OUTPUT" - - if [[ -z "$DEPLOY_OUTPUT" ]]; then - echo "Error: Deployment output is empty. Please check the deployment logs." - exit 1 - fi - - # Extract values from azd output (adjust these based on actual output variable names) - export AI_FOUNDRY_RESOURCE_ID=$(echo "$DEPLOY_OUTPUT" | jq -r '.AI_FOUNDRY_RESOURCE_ID // empty') - echo "AI_FOUNDRY_RESOURCE_ID=$AI_FOUNDRY_RESOURCE_ID" >> $GITHUB_ENV - export AI_SEARCH_SERVICE_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.AI_SEARCH_SERVICE_NAME // empty') - echo "AI_SEARCH_SERVICE_NAME=$AI_SEARCH_SERVICE_NAME" >> $GITHUB_ENV - export AZURE_COSMOSDB_ACCOUNT=$(echo "$DEPLOY_OUTPUT" | jq -r '.AZURE_COSMOSDB_ACCOUNT // empty') - echo "AZURE_COSMOSDB_ACCOUNT=$AZURE_COSMOSDB_ACCOUNT" >> $GITHUB_ENV - export STORAGE_ACCOUNT_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.STORAGE_ACCOUNT_NAME // empty') - echo "STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME" >> $GITHUB_ENV - export STORAGE_CONTAINER_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.STORAGE_CONTAINER_NAME // empty') - echo "STORAGE_CONTAINER_NAME=$STORAGE_CONTAINER_NAME" >> $GITHUB_ENV - export KEY_VAULT_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.KEY_VAULT_NAME // empty') - echo "KEY_VAULT_NAME=$KEY_VAULT_NAME" >> $GITHUB_ENV - export RESOURCE_GROUP_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.RESOURCE_GROUP_NAME // .AZURE_RESOURCE_GROUP // empty') - [[ -z "$RESOURCE_GROUP_NAME" ]] && export RESOURCE_GROUP_NAME="$RESOURCE_GROUP_NAME" - echo "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" >> $GITHUB_ENV - WEBAPP_URL=$(echo "$DEPLOY_OUTPUT" | jq -r '.WEB_APP_URL // .SERVICE_BACKEND_ENDPOINT_URL // empty') - echo "WEBAPP_URL=$WEBAPP_URL" >> $GITHUB_OUTPUT - sleep 30 - - - name: Run Post-Deployment Script - id: post_deploy - env: - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - run: | - set -e - az account set --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" - - echo "Running post-deployment script..." - - bash ./infra/scripts/process_sample_data.sh \ - "$STORAGE_ACCOUNT_NAME" \ - "$STORAGE_CONTAINER_NAME" \ - "$KEY_VAULT_NAME" \ - "$AZURE_COSMOSDB_ACCOUNT" \ - "$RESOURCE_GROUP_NAME" \ - "$AI_SEARCH_SERVICE_NAME" \ - "${{ secrets.AZURE_CLIENT_ID }}" \ - "$AI_FOUNDRY_RESOURCE_ID" - - - name: Logout from Azure - if: always() - run: | - az logout - echo "Logged out from Azure." - - - - - name: Generate Deploy Job Summary - if: always() - run: | - echo "## 🚀 Deploy Job Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| **Job Status** | ${{ job.status == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Environment Name** | \`${{ steps.generate_env_name.outputs.ENV_NAME }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Resource Group** | \`${{ steps.check_create_rg.outputs.RESOURCE_GROUP_NAME }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Azure Region (Infrastructure)** | \`${{ steps.set_region.outputs.AZURE_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Azure OpenAI Region** | \`${{ steps.set_region.outputs.AZURE_ENV_OPENAI_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Docker Image Tag** | \`${{ steps.determine_image_tag.outputs.IMAGE_TAG }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **WAF Enabled** | ${{ env.WAF_ENABLED == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **EXP Enabled** | ${{ env.EXP == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Trigger** | ${{ github.event_name }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Branch** | ${{ env.BRANCH_NAME }} |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [[ "${{ job.status }}" == "success" ]]; then - echo "### ✅ Deployment Details" >> $GITHUB_STEP_SUMMARY - echo "- **Web App URL**: [${{ steps.get_output.outputs.WEBAPP_URL }}](${{ steps.get_output.outputs.WEBAPP_URL }})" >> $GITHUB_STEP_SUMMARY - echo "- **Configuration**: ${{ env.WAF_ENABLED == 'true' && 'WAF' || 'Non-WAF' }}+${{ env.EXP == 'true' && 'EXP' || 'Non-EXP' }}" >> $GITHUB_STEP_SUMMARY - echo "- Successfully deployed to Azure with all resources configured" >> $GITHUB_STEP_SUMMARY - echo "- Post-deployment scripts executed successfully" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Deployment Failed" >> $GITHUB_STEP_SUMMARY - echo "- Deployment process encountered an error" >> $GITHUB_STEP_SUMMARY - echo "- Check the deploy job for detailed error information" >> $GITHUB_STEP_SUMMARY - fi - - e2e-test: - if: always() && ((needs.deploy.result == 'success' && needs.deploy.outputs.WEBAPP_URL != '') || (github.event.inputs.existing_webapp_url != '' && github.event.inputs.existing_webapp_url != null)) && (github.event_name != 'workflow_dispatch' || github.event.inputs.run_e2e_tests == 'true' || github.event.inputs.run_e2e_tests == null) - needs: [docker-build, deploy] - uses: ./.github/workflows/test-automation.yml - with: - DOCGEN_URL: ${{ github.event.inputs.existing_webapp_url || needs.deploy.outputs.WEBAPP_URL }} - secrets: inherit - - cleanup-deployment: - if: always() && needs.deploy.result == 'success' && needs.deploy.outputs.RESOURCE_GROUP_NAME != '' && github.event.inputs.existing_webapp_url == '' && (github.event_name != 'workflow_dispatch' || github.event.inputs.cleanup_resources == 'true' || github.event.inputs.cleanup_resources == null) - needs: [docker-build, deploy, e2e-test] - runs-on: ubuntu-latest - env: - RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }} - AZURE_LOCATION: ${{ needs.deploy.outputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: ${{ needs.deploy.outputs.AZURE_ENV_OPENAI_LOCATION }} - ENV_NAME: ${{ needs.deploy.outputs.ENV_NAME }} - IMAGE_TAG: ${{ needs.deploy.outputs.IMAGE_TAG }} - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Azure Developer CLI - run: | - curl -fsSL https://aka.ms/install-azd.sh | sudo bash - azd version - - - name: Login to Azure - run: | - azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --client-secret ${{ secrets.AZURE_CLIENT_SECRET }} --tenant-id ${{ secrets.AZURE_TENANT_ID }} - azd config set defaults.subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - - name: Setup Azure CLI for Docker cleanup - run: | - curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash - az --version - - - name: Login to Azure CLI for Docker cleanup - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - - - name: Delete Docker Images from ACR - if: github.event.inputs.existing_webapp_url == '' - run: | - set -e - echo "🗑️ Cleaning up Docker images from Azure Container Registry..." - - # Determine the image tag to delete - check if docker-build job ran - if [[ "${{ needs.docker-build.result }}" == "success" ]]; then - IMAGE_TAG="${{ needs.docker-build.outputs.IMAGE_TAG }}" - echo "Using image tag from docker-build job: $IMAGE_TAG" - else - IMAGE_TAG="${{ needs.deploy.outputs.IMAGE_TAG }}" - echo "Using image tag from deploy job: $IMAGE_TAG" - fi - - if [[ -n "$IMAGE_TAG" && "$IMAGE_TAG" != "latest_waf" && "$IMAGE_TAG" != "dev" && "$IMAGE_TAG" != "demo" ]]; then - echo "Deleting Docker images with tag: $IMAGE_TAG" - - # Delete the main image - echo "Deleting image: ${{ secrets.ACR_TEST_LOGIN_SERVER }}/webapp:$IMAGE_TAG" - az acr repository delete --name $(echo "${{ secrets.ACR_TEST_LOGIN_SERVER }}" | cut -d'.' -f1) \ - --image webapp:$IMAGE_TAG --yes || echo "Warning: Failed to delete main image or image not found" - - echo "✅ Docker images cleanup completed" - else - echo "⚠️ Skipping Docker image cleanup (using standard branch image: $IMAGE_TAG)" - fi - - - name: Select Environment and Delete deployment using azd - run: | - set -e - # Try to select the environment if it exists, otherwise create a minimal environment for cleanup - azd env list - if azd env list | grep -q "${{ env.ENV_NAME }}"; then - echo "Environment ${{ env.ENV_NAME }} found, selecting it..." - azd env select ${{ env.ENV_NAME }} - else - echo "Environment ${{ env.ENV_NAME }} not found, creating minimal environment for cleanup..." - azd env new ${{ env.ENV_NAME }} --no-prompt - azd env set AZURE_RESOURCE_GROUP "${{ env.RESOURCE_GROUP_NAME }}" - azd env set AZURE_SUBSCRIPTION_ID "${{ secrets.AZURE_SUBSCRIPTION_ID }}" - azd env set AZURE_ENV_OPENAI_LOCATION="${{ env.AZURE_ENV_OPENAI_LOCATION }}" - azd env set AZURE_LOCATION="${{ env.AZURE_LOCATION }}" - fi - - echo "Deleting deployment..." - azd down --purge --force --no-prompt - echo "Deployment deleted successfully." - - - - - name: Logout from Azure - if: always() - run: | - azd auth logout - az logout || echo "Warning: Failed to logout from Azure CLI" - echo "Logged out from Azure." - - name: Generate Cleanup Job Summary - if: always() - run: | - echo "## 🧹 Cleanup Job Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| **Job Status** | ${{ job.status == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Resource Group** | \`${{ env.RESOURCE_GROUP_NAME }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Environment Name** | \`${{ env.ENV_NAME }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Azure Region (Infrastructure)** | \`${{ env.AZURE_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Azure OpenAI Region** | \`${{ env.AZURE_ENV_OPENAI_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Docker Image Tag** | \`${{ env.IMAGE_TAG }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Trigger** | ${{ github.event_name }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Branch** | ${{ env.BRANCH_NAME }} |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [[ "${{ job.status }}" == "success" ]]; then - echo "### ✅ Cleanup Details" >> $GITHUB_STEP_SUMMARY - echo "- Successfully deleted Azure resource group: \`${{ env.RESOURCE_GROUP_NAME }}\`" >> $GITHUB_STEP_SUMMARY - if [[ "${{ env.IMAGE_TAG }}" != "latest_waf" && "${{ env.IMAGE_TAG }}" != "dev" && "${{ env.IMAGE_TAG }}" != "demo" ]]; then - echo "- Removed custom Docker images from ACR with tag: \`${{ env.IMAGE_TAG }}\`" >> $GITHUB_STEP_SUMMARY - else - echo "- Preserved standard Docker image (using branch tag: \`${{ env.IMAGE_TAG }}\`)" >> $GITHUB_STEP_SUMMARY - fi - echo "- All deployed resources have been successfully cleaned up" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Cleanup Failed" >> $GITHUB_STEP_SUMMARY - echo "- Cleanup process encountered an error" >> $GITHUB_STEP_SUMMARY - echo "- Manual cleanup may be required" >> $GITHUB_STEP_SUMMARY - echo "- ⬇️ Check the cleanup-deployment job for detailed error information" >> $GITHUB_STEP_SUMMARY - - fi - - send-notification: - if: always() - needs: [docker-build, deploy, e2e-test] - runs-on: ubuntu-latest - steps: - - name: Send Quota Failure Notification - if: needs.deploy.result == 'failure' && needs.deploy.outputs.QUOTA_FAILED == 'true' - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the DocGen deployment has failed due to insufficient quota in the requested regions.

Issue Details:
• Quota check failed for GPT and Text Embedding models
• Required GPT Capacity: ${{ env.GPT_MIN_CAPACITY }}
• Required Text Embedding Capacity: ${{ env.TEXT_EMBEDDING_MIN_CAPACITY }}
• Checked Regions: ${{ vars.AZURE_REGIONS }}

Run URL: ${RUN_URL}

Please resolve the quota issue and retry the deployment.

Best regards,
Your Automation Team

", - "subject": "DocGen Pipeline - Failed (Insufficient Quota)" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send quota failure notification" - - - name: Send Deployment Failure Notification - if: needs.deploy.result == 'failure' && needs.deploy.outputs.QUOTA_FAILED != 'true' - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - RESOURCE_GROUP="${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}" - - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the DocGen deployment process has encountered an issue and has failed to complete successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• WAF Enabled: ${{ env.WAF_ENABLED }}
• EXP Enabled: ${{ env.EXP }}

Run URL: ${RUN_URL}

Please investigate the deployment failure at your earliest convenience.

Best regards,
Your Automation Team

", - "subject": "DocGen Pipeline - Failed" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send deployment failure notification" - - - name: Send Success Notification - if: needs.deploy.result == 'success' && (needs.e2e-test.result == 'skipped' || needs.e2e-test.outputs.TEST_SUCCESS == 'true') - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - WEBAPP_URL="${{ needs.deploy.outputs.WEBAPP_URL || github.event.inputs.existing_webapp_url }}" - RESOURCE_GROUP="${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}" - TEST_REPORT_URL="${{ needs.e2e-test.outputs.TEST_REPORT_URL }}" - - # Create email body based on test result - if [ "${{ needs.e2e-test.result }}" = "skipped" ]; then - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the DocGen deployment has completed successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• Web App URL: ${WEBAPP_URL}
• E2E Tests: Skipped (as configured)

Configuration:
• WAF Enabled: ${{ env.WAF_ENABLED }}
• EXP Enabled: ${{ env.EXP }}

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "DocGen Pipeline - Deployment Success" - } - EOF - ) - else - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the DocGen deployment and testing process has completed successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• Web App URL: ${WEBAPP_URL}
• E2E Tests: Passed
• Test Report: View Report

Configuration:
• WAF Enabled: ${{ env.WAF_ENABLED }}
• EXP Enabled: ${{ env.EXP }}

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "DocGen Pipeline - Test Automation - Success" - } - EOF - ) - fi - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send success notification" - - - name: Send Test Failure Notification - if: needs.deploy.result == 'success' && needs.e2e-test.result != 'skipped' && needs.e2e-test.outputs.TEST_SUCCESS != 'true' - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - TEST_REPORT_URL="${{ needs.e2e-test.outputs.TEST_REPORT_URL }}" - WEBAPP_URL="${{ needs.deploy.outputs.WEBAPP_URL || github.event.inputs.existing_webapp_url }}" - RESOURCE_GROUP="${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}" - - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that test automation process has encountered issues and failed to complete successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• Web App URL: ${WEBAPP_URL}
• Deployment Status: ✅ Success
• E2E Tests: ❌ Failed

Test Details:
• Test Report: View Report

Run URL: ${RUN_URL}

Please investigate the matter at your earliest convenience.

Best regards,
Your Automation Team

", - "subject": "DocGen Pipeline - Test Automation - Failed" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send test failure notification" - - - name: Send Existing URL Success Notification - # Scenario: Deployment skipped (existing URL provided) AND e2e tests passed - if: needs.deploy.result == 'skipped' && github.event.inputs.existing_webapp_url != '' && needs.e2e-test.result == 'success' && (needs.e2e-test.outputs.TEST_SUCCESS == 'true' || needs.e2e-test.outputs.TEST_SUCCESS == '') - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - EXISTING_URL="${{ github.event.inputs.existing_webapp_url }}" - TEST_REPORT_URL="${{ needs.e2e-test.outputs.TEST_REPORT_URL }}" - EMAIL_BODY=$(cat <Dear Team,

The DocGen pipeline executed against the existing WebApp URL and testing process has completed successfully.

Test Results:
• Status: ✅ Passed
${TEST_REPORT_URL:+• Test Report: View Report}
• Target URL: ${EXISTING_URL}

Deployment: Skipped

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "DocGen Pipeline - Test Automation Passed (Existing URL)" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send existing URL success notification" - - - name: Send Existing URL Test Failure Notification - # Scenario: Deployment skipped (existing URL provided) AND e2e tests failed - if: needs.deploy.result == 'skipped' && github.event.inputs.existing_webapp_url != '' && needs.e2e-test.result == 'failure' - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - EXISTING_URL="${{ github.event.inputs.existing_webapp_url }}" - TEST_REPORT_URL="${{ needs.e2e-test.outputs.TEST_REPORT_URL }}" - EMAIL_BODY=$(cat <Dear Team,

The DocGen pipeline executed against the existing WebApp URL and the test automation has encountered issues and failed to complete successfully.

Failure Details:
• Target URL: ${EXISTING_URL}
${TEST_REPORT_URL:+• Test Report: View Report}
• Deployment: Skipped

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "DocGen Pipeline - Test Automation Failed (Existing URL)" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send existing URL test failure notification" \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/deploy-windows.yml b/archive-doc-gen/.github/workflows/deploy-windows.yml deleted file mode 100644 index 9aec336a2..000000000 --- a/archive-doc-gen/.github/workflows/deploy-windows.yml +++ /dev/null @@ -1,274 +0,0 @@ -name: Deploy-Test-Cleanup (v2) Windows -on: - # pull_request: - # branches: - # - main - # workflow_run: - # workflows: ["Build Docker and Optional Push"] - # types: - # - completed - # branches: - # - main - # - dev - # - demo - workflow_dispatch: - inputs: - azure_location: - description: 'Azure Location For Deployment' - required: false - default: 'australiaeast' - type: choice - options: - - 'australiaeast' - - 'centralus' - - 'eastasia' - - 'eastus2' - - 'japaneast' - - 'northeurope' - - 'southeastasia' - - 'uksouth' - resource_group_name: - description: 'Resource Group Name (Optional)' - required: false - default: '' - type: string - - waf_enabled: - description: 'Enable WAF' - required: false - default: false - type: boolean - EXP: - description: 'Enable EXP' - required: false - default: false - type: boolean - build_docker_image: - description: 'Build And Push Docker Image (Optional)' - required: false - default: false - type: boolean - - cleanup_resources: - description: 'Cleanup Deployed Resources' - required: false - default: false - type: boolean - - run_e2e_tests: - description: 'Run End-to-End Tests' - required: false - default: 'GoldenPath-Testing' - type: choice - options: - - 'GoldenPath-Testing' - - 'Smoke-Testing' - - 'None' - - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: - description: 'Log Analytics Workspace ID (Optional)' - required: false - default: '' - type: string - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: - description: 'AI Project Resource ID (Optional)' - required: false - default: '' - type: string - existing_webapp_url: - description: 'Existing WebApp URL (Skips Deployment)' - required: false - default: '' - type: string - - # schedule: - # - cron: '0 9,21 * * *' # Runs at 9:00 AM and 9:00 PM GMT -permissions: - contents: read - actions: read - -jobs: - validate-inputs: - runs-on: ubuntu-latest - outputs: - validation_passed: ${{ steps.validate.outputs.passed }} - azure_location: ${{ steps.validate.outputs.azure_location }} - resource_group_name: ${{ steps.validate.outputs.resource_group_name }} - waf_enabled: ${{ steps.validate.outputs.waf_enabled }} - exp: ${{ steps.validate.outputs.exp }} - build_docker_image: ${{ steps.validate.outputs.build_docker_image }} - cleanup_resources: ${{ steps.validate.outputs.cleanup_resources }} - run_e2e_tests: ${{ steps.validate.outputs.run_e2e_tests }} - azure_env_log_analytics_workspace_id: ${{ steps.validate.outputs.azure_env_log_analytics_workspace_id }} - azure_existing_ai_project_resource_id: ${{ steps.validate.outputs.azure_existing_ai_project_resource_id }} - existing_webapp_url: ${{ steps.validate.outputs.existing_webapp_url }} - steps: - - name: Validate Workflow Input Parameters - id: validate - shell: bash - env: - INPUT_AZURE_LOCATION: ${{ github.event.inputs.azure_location }} - INPUT_RESOURCE_GROUP_NAME: ${{ github.event.inputs.resource_group_name }} - INPUT_WAF_ENABLED: ${{ github.event.inputs.waf_enabled }} - INPUT_EXP: ${{ github.event.inputs.EXP }} - INPUT_BUILD_DOCKER_IMAGE: ${{ github.event.inputs.build_docker_image }} - INPUT_CLEANUP_RESOURCES: ${{ github.event.inputs.cleanup_resources }} - INPUT_RUN_E2E_TESTS: ${{ github.event.inputs.run_e2e_tests }} - INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - INPUT_EXISTING_WEBAPP_URL: ${{ github.event.inputs.existing_webapp_url }} - run: | - echo "🔍 Validating workflow input parameters..." - VALIDATION_FAILED=false - - # Validate azure_location (Azure region format) - LOCATION="${INPUT_AZURE_LOCATION:-australiaeast}" - - if [[ ! "$LOCATION" =~ ^[a-z0-9]+$ ]]; then - echo "❌ ERROR: azure_location '$LOCATION' is invalid. Must contain only lowercase letters and numbers" - VALIDATION_FAILED=true - else - echo "✅ azure_location: '$LOCATION' is valid" - fi - - # Validate resource_group_name (Azure naming convention, optional) - if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then - if [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then - echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period." - VALIDATION_FAILED=true - elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then - echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters (length: ${#INPUT_RESOURCE_GROUP_NAME})" - VALIDATION_FAILED=true - else - echo "✅ resource_group_name: '$INPUT_RESOURCE_GROUP_NAME' is valid" - fi - else - echo "✅ resource_group_name: Not provided (will be auto-generated)" - fi - - # Validate waf_enabled (boolean) - WAF_ENABLED="${INPUT_WAF_ENABLED:-false}" - if [[ "$WAF_ENABLED" != "true" && "$WAF_ENABLED" != "false" ]]; then - echo "❌ ERROR: waf_enabled must be 'true' or 'false', got: '$WAF_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ waf_enabled: '$WAF_ENABLED' is valid" - fi - - # Validate EXP (boolean) - EXP_ENABLED="${INPUT_EXP:-false}" - if [[ "$EXP_ENABLED" != "true" && "$EXP_ENABLED" != "false" ]]; then - echo "❌ ERROR: EXP must be 'true' or 'false', got: '$EXP_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ EXP: '$EXP_ENABLED' is valid" - fi - - # Validate build_docker_image (boolean) - BUILD_DOCKER="${INPUT_BUILD_DOCKER_IMAGE:-false}" - if [[ "$BUILD_DOCKER" != "true" && "$BUILD_DOCKER" != "false" ]]; then - echo "❌ ERROR: build_docker_image must be 'true' or 'false', got: '$BUILD_DOCKER'" - VALIDATION_FAILED=true - else - echo "✅ build_docker_image: '$BUILD_DOCKER' is valid" - fi - - # Validate cleanup_resources (boolean) - CLEANUP_RESOURCES="${INPUT_CLEANUP_RESOURCES:-false}" - if [[ "$CLEANUP_RESOURCES" != "true" && "$CLEANUP_RESOURCES" != "false" ]]; then - echo "❌ ERROR: cleanup_resources must be 'true' or 'false', got: '$CLEANUP_RESOURCES'" - VALIDATION_FAILED=true - else - echo "✅ cleanup_resources: '$CLEANUP_RESOURCES' is valid" - fi - - # Validate run_e2e_tests (specific allowed values) - TEST_OPTION="${INPUT_RUN_E2E_TESTS:-GoldenPath-Testing}" - if [[ "$TEST_OPTION" != "GoldenPath-Testing" && "$TEST_OPTION" != "Smoke-Testing" && "$TEST_OPTION" != "None" ]]; then - echo "❌ ERROR: run_e2e_tests must be one of: GoldenPath-Testing, Smoke-Testing, None, got: '$TEST_OPTION'" - VALIDATION_FAILED=true - else - echo "✅ run_e2e_tests: '$TEST_OPTION' is valid" - fi - - # Validate AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID (optional, Azure Resource ID format) - if [[ -n "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" ]]; then - if [[ ! "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then - echo "❌ ERROR: AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}" - echo " Got: '$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: Valid Resource ID format" - fi - else - echo "✅ AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: Not provided (optional)" - fi - - # Validate AZURE_EXISTING_AI_PROJECT_RESOURCE_ID (optional, Azure Resource ID format) - if [[ -n "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" ]]; then - if [[ ! "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/([Mm]icrosoft\.[Mm]achine[Ll]earning[Ss]ervices/([Ww]orkspaces|[Pp]rojects)/[^/]+|[Mm]icrosoft\.[Cc]ognitive[Ss]ervices/[Aa]ccounts/[^/]+/[Pp]rojects/[^/]+)$ ]]; then - echo "❌ ERROR: AZURE_EXISTING_AI_PROJECT_RESOURCE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}" - echo " Got: '$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: Valid Resource ID format" - fi - else - echo "✅ AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: Not provided (optional)" - fi - - # Validate existing_webapp_url (optional, must start with https) - if [[ -n "$INPUT_EXISTING_WEBAPP_URL" ]]; then - if [[ ! "$INPUT_EXISTING_WEBAPP_URL" =~ ^https:// ]]; then - echo "❌ ERROR: existing_webapp_url must start with 'https://', got: '$INPUT_EXISTING_WEBAPP_URL'" - VALIDATION_FAILED=true - else - echo "✅ existing_webapp_url: '$INPUT_EXISTING_WEBAPP_URL' is valid" - fi - else - echo "✅ existing_webapp_url: Not provided (will perform deployment)" - fi - - # Fail workflow if any validation failed - if [[ "$VALIDATION_FAILED" == "true" ]]; then - echo "" - echo "❌ Parameter validation failed. Please correct the errors above and try again." - exit 1 - fi - - echo "" - echo "✅ All input parameters validated successfully!" - - # Output validated values - echo "passed=true" >> $GITHUB_OUTPUT - echo "azure_location=$LOCATION" >> $GITHUB_OUTPUT - echo "resource_group_name=$INPUT_RESOURCE_GROUP_NAME" >> $GITHUB_OUTPUT - echo "waf_enabled=$WAF_ENABLED" >> $GITHUB_OUTPUT - echo "exp=$EXP_ENABLED" >> $GITHUB_OUTPUT - echo "build_docker_image=$BUILD_DOCKER" >> $GITHUB_OUTPUT - echo "cleanup_resources=$CLEANUP_RESOURCES" >> $GITHUB_OUTPUT - echo "run_e2e_tests=$TEST_OPTION" >> $GITHUB_OUTPUT - echo "azure_env_log_analytics_workspace_id=$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" >> $GITHUB_OUTPUT - echo "azure_existing_ai_project_resource_id=$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" >> $GITHUB_OUTPUT - echo "existing_webapp_url=$INPUT_EXISTING_WEBAPP_URL" >> $GITHUB_OUTPUT - - Run: - needs: validate-inputs - if: needs.validate-inputs.outputs.validation_passed == 'true' - uses: ./.github/workflows/deploy-orchestrator.yml - with: - runner_os: windows-latest - azure_location: ${{ needs.validate-inputs.outputs.azure_location || 'australiaeast' }} - resource_group_name: ${{ needs.validate-inputs.outputs.resource_group_name || '' }} - waf_enabled: ${{ needs.validate-inputs.outputs.waf_enabled == 'true' }} - EXP: ${{ needs.validate-inputs.outputs.exp == 'true' }} - build_docker_image: ${{ needs.validate-inputs.outputs.build_docker_image == 'true' }} - cleanup_resources: ${{ needs.validate-inputs.outputs.cleanup_resources == 'true' }} - run_e2e_tests: ${{ needs.validate-inputs.outputs.run_e2e_tests || 'GoldenPath-Testing' }} - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ needs.validate-inputs.outputs.azure_env_log_analytics_workspace_id || '' }} - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ needs.validate-inputs.outputs.azure_existing_ai_project_resource_id || '' }} - existing_webapp_url: ${{ needs.validate-inputs.outputs.existing_webapp_url || '' }} - trigger_type: ${{ github.event_name }} - secrets: inherit diff --git a/archive-doc-gen/.github/workflows/deploy.yml b/archive-doc-gen/.github/workflows/deploy.yml deleted file mode 100644 index ab8bf299a..000000000 --- a/archive-doc-gen/.github/workflows/deploy.yml +++ /dev/null @@ -1,410 +0,0 @@ -name: DocGen Deploy-Test-Cleanup Pipeline - -on: - pull_request: - branches: - - main - workflow_run: - workflows: ["Build Docker and Optional Push"] - types: - - completed - branches: - - main - - dev - - demo - - schedule: - - cron: '0 9,21 * * *' # Runs at 9:00 AM and 9:00 PM GMT - -env: - GPT_MIN_CAPACITY: 150 - TEXT_EMBEDDING_MIN_CAPACITY: 80 - BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }} -permissions: - contents: read - actions: read - -jobs: - deploy: - runs-on: ubuntu-latest - outputs: - RESOURCE_GROUP_NAME: ${{ steps.check_create_rg.outputs.RESOURCE_GROUP_NAME }} - WEBAPP_URL: ${{ steps.get_output.outputs.WEBAPP_URL }} - steps: - - name: Checkout Code - uses: actions/checkout@v6 - - - name: Login to Azure - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - - - name: Run Quota Check - id: quota-check - env: - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - GPT_MIN_CAPACITY: ${{ env.GPT_MIN_CAPACITY }} - TEXT_EMBEDDING_MIN_CAPACITY: ${{ env.TEXT_EMBEDDING_MIN_CAPACITY }} - AZURE_REGIONS: ${{ vars.AZURE_REGIONS }} - run: | - chmod +x scripts/checkquota.sh - if ! scripts/checkquota.sh; then - # If quota check fails due to insufficient quota, set the flag - if grep -q "No region with sufficient quota found" scripts/checkquota.sh; then - echo "QUOTA_FAILED=true" >> $GITHUB_ENV - fi - exit 1 # Fail the pipeline if any other failure occurs - fi - - - - name: Send Notification on Quota Failure - if: env.QUOTA_FAILED == 'true' - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - EMAIL_BODY=$(cat <Dear Team,

The quota check has failed, and the pipeline cannot proceed.

Build URL: ${RUN_URL}

Please take necessary action.

Best regards,
Your Automation Team

" - } - EOF - ) - - curl -X POST "${{ secrets.LOGIC_APP_URL }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send notification" - - - name: Fail Pipeline if Quota Check Fails - if: env.QUOTA_FAILED == 'true' - run: exit 1 - - - name: Install Bicep CLI - run: az bicep install - - - name: Set Deployment Region - run: | - echo "Selected Region: $VALID_REGION" - echo "AZURE_AI_LOCATION=$VALID_REGION" >> $GITHUB_ENV - echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_ENV - if [ "$VALID_REGION" == "eastus" ] || [ "$VALID_REGION" == "westus3" ]; then - echo "AZURE_LOCATION=uksouth" >> $GITHUB_ENV - fi - - - name: Generate Resource Group Name - id: generate_rg_name - run: | - echo "Generating a unique resource group name..." - ACCL_NAME="docgen" # Account name as specified - SHORT_UUID=$(uuidgen | cut -d'-' -f1) - UNIQUE_RG_NAME="arg-${ACCL_NAME}-${SHORT_UUID}" - echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV - echo "Generated RESOURCE_GROUP_NAME: ${UNIQUE_RG_NAME}" - - - name: Check and Create Resource Group - id: check_create_rg - run: | - set -e - echo "Checking if resource group exists..." - rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }}) - if [ "$rg_exists" = "false" ]; then - echo "Resource group does not exist. Creating..." - az group create --name ${{ env.RESOURCE_GROUP_NAME }} --location ${{ env.AZURE_LOCATION }} || { echo "Error creating resource group"; exit 1; } - else - echo "Resource group already exists." - fi - echo "RESOURCE_GROUP_NAME=${{ env.RESOURCE_GROUP_NAME }}" >> $GITHUB_OUTPUT - - - name: Generate Unique Solution Prefix - id: generate_solution_prefix - run: | - set -e - COMMON_PART="psldg" - TIMESTAMP=$(date +%s) - UPDATED_TIMESTAMP=$(echo $TIMESTAMP | tail -c 6) - UNIQUE_SOLUTION_PREFIX="${COMMON_PART}${UPDATED_TIMESTAMP}" - echo "SOLUTION_PREFIX=${UNIQUE_SOLUTION_PREFIX}" >> $GITHUB_ENV - echo "Generated SOLUTION_PREFIX: ${UNIQUE_SOLUTION_PREFIX}" - - - name: Deploy Bicep Template - id: deploy - run: | - set -e - # set image tag based on branch - if [[ "${{ env.BRANCH_NAME }}" == "main" ]]; then - IMAGE_TAG="latest_waf" - elif [[ "${{ env.BRANCH_NAME }}" == "dev" ]]; then - IMAGE_TAG="dev" - elif [[ "${{ env.BRANCH_NAME }}" == "demo" ]]; then - IMAGE_TAG="demo" - else - IMAGE_TAG="latest_waf" - fi - - # Generate current timestamp in desired format: YYYY-MM-DDTHH:MM:SS.SSSSSSSZ - current_date=$(date -u +"%Y-%m-%dT%H:%M:%S.%7NZ") - - az deployment group create \ - --name ${{ env.SOLUTION_PREFIX }}-deployment \ - --resource-group ${{ env.RESOURCE_GROUP_NAME }} \ - --template-file infra/main.bicep \ - --parameters \ - solutionName="${{ env.SOLUTION_PREFIX }}" \ - secondaryLocation="${{ env.AZURE_LOCATION }}" \ - location="${{ env.AZURE_LOCATION }}" \ - gptModelCapacity=${{ env.GPT_MIN_CAPACITY }} \ - embeddingDeploymentCapacity=${{ env.TEXT_EMBEDDING_MIN_CAPACITY }} \ - azureAiServiceLocation=${{ env.AZURE_AI_LOCATION }} \ - imageTag="${IMAGE_TAG}"\ - createdBy="Pipeline" \ - tags="{'Purpose':'Deploying and Cleaning Up Resources for Validation','CreatedDate':'$current_date'}" - - - name: Get Deployment Output and extract Values - id: get_output - run: | - set -e - echo "Fetching deployment output..." - BICEP_OUTPUT=$(az deployment group show --name ${{ env.SOLUTION_PREFIX }}-deployment --resource-group ${{ env.RESOURCE_GROUP_NAME }} --query "properties.outputs" -o json) - echo "Extracting deployment output..." - WEBAPP_URL=$(echo $BICEP_OUTPUT | jq -r '.weB_APP_URL.value') - echo "WEBAPP_URL=$WEBAPP_URL" >> $GITHUB_OUTPUT - STORAGE_ACCOUNT_NAME=$(echo $BICEP_OUTPUT | jq -r '.storagE_ACCOUNT_NAME.value') - echo "STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME" >> $GITHUB_ENV - STORAGE_CONTAINER_NAME=$(echo $BICEP_OUTPUT | jq -r '.storagE_CONTAINER_NAME.value') - echo "STORAGE_CONTAINER_NAME=$STORAGE_CONTAINER_NAME" >> $GITHUB_ENV - KEY_VAULT_NAME=$(echo $BICEP_OUTPUT | jq -r '.keY_VAULT_NAME.value') - echo "KEY_VAULT_NAME=$KEY_VAULT_NAME" >> $GITHUB_ENV - COSMOSDB_ACCOUNT_NAME=$(echo $BICEP_OUTPUT | jq -r '.cosmosdB_ACCOUNT_NAME.value') - echo "COSMOSDB_ACCOUNT_NAME=$COSMOSDB_ACCOUNT_NAME" >> $GITHUB_ENV - AI_FOUNDRY_RESOURCE_ID=$(echo $BICEP_OUTPUT | jq -r '.aI_FOUNDRY_RESOURCE_ID.value') - echo "AI_FOUNDRY_RESOURCE_ID=$AI_FOUNDRY_RESOURCE_ID" >> $GITHUB_ENV - AI_SEARCH_SERVICE_NAME=$(echo $BICEP_OUTPUT | jq -r '.aI_SEARCH_SERVICE_NAME.value') - echo "AI_SEARCH_SERVICE_NAME=$AI_SEARCH_SERVICE_NAME" >> $GITHUB_ENV - echo "Deployment output: $BICEP_OUTPUT" - - - name: Run Post-Deployment Script - id: post_deploy - env: - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - run: | - set -e - az account set --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" - - echo "Running post-deployment script..." - - bash ./infra/scripts/process_sample_data.sh \ - "${{ env.STORAGE_ACCOUNT_NAME }}" \ - "${{ env.STORAGE_CONTAINER_NAME }}" \ - "${{ env.KEY_VAULT_NAME }}" \ - "${{ env.COSMOSDB_ACCOUNT_NAME }}" \ - "${{ env.RESOURCE_GROUP_NAME }}" \ - "${{ env.AI_SEARCH_SERVICE_NAME }}" \ - "${{ secrets.AZURE_CLIENT_ID }}" \ - "${{ env.AI_FOUNDRY_RESOURCE_ID }}" - - - name: Logout from Azure - if: always() - run: | - az logout - echo "Logged out from Azure." - - - e2e-test: - needs: deploy - uses: ./.github/workflows/test-automation.yml - with: - DOCGEN_URL: ${{ needs.deploy.outputs.WEBAPP_URL }} - secrets: inherit - - cleanup-deployment: - if: always() && needs.deploy.outputs.RESOURCE_GROUP_NAME != '' - needs: [deploy, e2e-test] - runs-on: ubuntu-latest - env: - RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }} - steps: - - name: Login to Azure - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - az account set --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" - - - name: Extract AI Services and Key Vault Names - if: always() - run: | - echo "Fetching AI Services and Key Vault names before deletion..." - - # Get Key Vault name - KEYVAULT_NAME=$(az resource list --resource-group "${{ env.RESOURCE_GROUP_NAME }}" --resource-type "Microsoft.KeyVault/vaults" --query "[].name" -o tsv) - echo "Detected Key Vault: $KEYVAULT_NAME" - echo "KEYVAULT_NAME=$KEYVAULT_NAME" >> $GITHUB_ENV - - - # Extract AI Services names - echo "Fetching AI Services..." - AI_SERVICES=$(az resource list --resource-group '${{ env.RESOURCE_GROUP_NAME }}' --resource-type "Microsoft.CognitiveServices/accounts" --query "[].name" -o tsv) - - # Flatten newline-separated values to space-separated - AI_SERVICES=$(echo "$AI_SERVICES" | paste -sd ' ' -) - - echo "Detected AI Services: $AI_SERVICES" - echo "AI_SERVICES=$AI_SERVICES" >> $GITHUB_ENV - - - name: Delete Bicep Deployment - if: always() - run: | - set -e - echo "Checking if resource group exists..." - rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }}) - if [ "$rg_exists" = "true" ]; then - echo "Resource group exists. Cleaning..." - az group delete \ - --name ${{ env.RESOURCE_GROUP_NAME }} \ - --yes \ - --no-wait - echo "Resource group deleted... ${{ env.RESOURCE_GROUP_NAME }}" - else - echo "Resource group does not exist." - fi - - - name: Wait for Resource Deletion to Complete - if: always() - run: | - echo "Waiting for all deployed resources (including AI Services) to be deleted..." - - # Convert AI_SERVICES space-separated string into an array - IFS=' ' read -r -a resources_to_check <<< "${{ env.AI_SERVICES }}" - - echo "Resources to check for deletion:" - printf '%s\n' "${resources_to_check[@]}" - - # Get the current resource list in YAML - resource_list=$(az resource list --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" --output yaml) - - # Set up retry logic - max_retries=3 - retry_intervals=(30 60 120) - retries=0 - - while true; do - resource_found=false - for resource in "${resources_to_check[@]}"; do - echo "Checking if resource '$resource' still exists..." - if echo "$resource_list" | grep -q "name: $resource"; then - echo "Resource '$resource' still exists." - resource_found=true - else - echo "Resource '$resource' has been deleted." - fi - done - - if [ "$resource_found" = true ]; then - retries=$((retries + 1)) - if [ "$retries" -ge "$max_retries" ]; then - echo "Reached max retry attempts. Exiting wait loop." - break - else - echo "Some resources still exist. Waiting for ${retry_intervals[$((retries-1))]} seconds..." - sleep "${retry_intervals[$((retries-1))]}" - resource_list=$(az resource list --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" --output yaml) - fi - else - echo "All resources have been deleted." - break - fi - done - - - - name: Wait for Soft Deletion of Key Vault and AI Services - if: always() - run: | - echo "Waiting for resources to be soft deleted..." - - # Wait for Key Vault to be soft deleted - if [ -n "${{ env.KEYVAULT_NAME }}" ]; then - while true; do - DELETED_VAULT=$(az keyvault show-deleted --name ${{ env.KEYVAULT_NAME }} --query "id" -o tsv 2>/dev/null || echo "") - if [ -n "$DELETED_VAULT" ]; then - echo "Key Vault soft deleted!" - break - fi - echo "Key Vault not yet soft deleted. Retrying in 15s..." - sleep 15 - done - fi - - - # Wait for AI Services to be soft deleted - for AI_SERVICE in ${{ env.AI_SERVICES }}; do - while true; do - DELETED_AI_SERVICE=$(az cognitiveservices account list-deleted --query "[?name=='$AI_SERVICE'].id" -o tsv 2>/dev/null || echo "") - if [ -n "$DELETED_AI_SERVICE" ]; then - echo "AI Service $AI_SERVICE is soft deleted!" - break - fi - echo "AI Service $AI_SERVICE not yet soft deleted. Retrying in 15s..." - sleep 15 - done - done - - - - name: Purge Key Vault and AI Services - if: always() - run: | - echo "Purging soft deleted resources..." - - # Ensure AI_SERVICES is properly split into individual services - IFS=' ' read -r -a SERVICES <<< "${{ env.AI_SERVICES }}" - - for AI_SERVICE in "${SERVICES[@]}"; do - echo "Checking location for AI Service: $AI_SERVICE" - - # Fetch AI Service location - SERVICE_LOCATION=$(az cognitiveservices account list-deleted --query "[?name=='$AI_SERVICE'].location" -o tsv 2>/dev/null || echo "") - - if [ -n "$SERVICE_LOCATION" ]; then - echo "Purging AI Service $AI_SERVICE in $SERVICE_LOCATION" - az cognitiveservices account purge --location "$SERVICE_LOCATION" --resource-group "${{ env.RESOURCE_GROUP_NAME }}" --name "$AI_SERVICE" - else - echo "Could not determine location for AI Service: $AI_SERVICE. Skipping purge." - fi - done - - # --- Purge Key Vaults --- - echo "Starting purge for Key Vaults..." - IFS=' ' read -r -a VAULTS <<< "${{ env.KEYVAULT_NAME }}" - - for VAULT in "${VAULTS[@]}"; do - echo "Checking location for Key Vault: $VAULT" - - # Fetch Key Vault location - VAULT_LOCATION=$(az keyvault list-deleted --query "[?name=='$VAULT'].properties.location" -o tsv 2>/dev/null || echo "") - - if [ -n "$VAULT_LOCATION" ]; then - echo "Purging Key Vault $VAULT in $VAULT_LOCATION" - az keyvault purge --name "$VAULT" --location "$VAULT_LOCATION" - else - echo "Could not determine location for Key Vault: $VAULT. Skipping purge." - fi - done - - - - name: Send Notification on Failure - if: failure() || needs.deploy.result == 'failure' - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the DocGen Deployment Automation process has encountered an issue and has failed to complete successfully.

Build URL: ${RUN_URL}

Please investigate the matter at your earliest convenience.

Best regards,
Your Automation Team

" - } - EOF - ) - - curl -X POST "${{ secrets.LOGIC_APP_URL }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send notification" - - - name: Logout from Azure - if: always() - run: | - az logout - echo "Logged out from Azure." diff --git a/archive-doc-gen/.github/workflows/docker-build-and-push.yml b/archive-doc-gen/.github/workflows/docker-build-and-push.yml deleted file mode 100644 index 07fe2858d..000000000 --- a/archive-doc-gen/.github/workflows/docker-build-and-push.yml +++ /dev/null @@ -1,109 +0,0 @@ -name: Build Docker and Optional Push - -on: - push: - branches: [main, dev, demo] - paths: - - 'src/frontend/**' - - 'src/**/*.py' - - 'src/requirements*.txt' - - 'src/WebApp.Dockerfile' - - '.github/workflows/docker-build-and-push.yml' - - '!src/tests/**' - pull_request: - branches: [main, dev, demo] - types: - - opened - - ready_for_review - - reopened - - synchronize - paths: - - 'src/frontend/**' - - 'src/**/*.py' - - 'src/requirements*.txt' - - 'src/WebApp.Dockerfile' - - '.github/workflows/docker-build-and-push.yml' - - '!src/tests/**' - merge_group: - workflow_dispatch: -permissions: - contents: read - actions: read - -jobs: - build-and-push: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to Azure Container Registry - External Registry - if: ${{ github.ref_name == 'main' }} - uses: azure/docker-login@v2 - with: - login-server: ${{ secrets.ACR_LOGIN_SERVER }} - username: ${{ secrets.ACR_USERNAME }} - password: ${{ secrets.ACR_PASSWORD }} - - - name: Log in to Azure Container Registry (Main/Dev/Demo/Dependabotchanges) - Internal Registry - if: ${{ github.ref_name == 'main' ||github.ref_name == 'dev' || github.ref_name == 'demo' || github.ref_name == 'dependabotchanges' }} - uses: azure/docker-login@v2 - with: - login-server: ${{ secrets.ACR_DEV_LOGIN_SERVER }} - username: ${{ secrets.ACR_DEV_USERNAME }} - password: ${{ secrets.ACR_DEV_PASSWORD }} - - - name: Get current date - id: date - run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - - - name: Get registry - id: registry - run: | - if [[ "${{ github.ref_name }}" == "main" ]]; then - echo "ext_registry=${{ secrets.ACR_LOGIN_SERVER || 'acrlogin.azurecr.io'}}" >> $GITHUB_OUTPUT - echo "int_registry=${{ secrets.ACR_DEV_LOGIN_SERVER || 'acrlogin.azurecr.io'}}" >> $GITHUB_OUTPUT - else - echo "int_registry=${{ secrets.ACR_DEV_LOGIN_SERVER || 'acrlogin.azurecr.io'}}" >> $GITHUB_OUTPUT - fi - - - name: Determine Tag Name Based on Branch - id: determine_tag - run: | - if [[ "${{ github.ref_name }}" == "main" ]]; then - echo "tagname=latest_waf" >> $GITHUB_OUTPUT - elif [[ "${{ github.ref_name }}" == "dev" ]]; then - echo "tagname=dev" >> $GITHUB_OUTPUT - elif [[ "${{ github.ref_name }}" == "demo" ]]; then - echo "tagname=demo" >> $GITHUB_OUTPUT - elif [[ "${{ github.ref_name }}" == "dependabotchanges" ]]; then - echo "tagname=dependabotchanges" >> $GITHUB_OUTPUT - else - echo "tagname=default" >> $GITHUB_OUTPUT - fi - - - name: Build Docker Image and optionally push - Internal Registry - uses: docker/build-push-action@v6 - with: - context: ./src - file: ./src/WebApp.Dockerfile - push: ${{ github.ref_name == 'main' || github.ref_name == 'dev' || github.ref_name == 'demo' || github.ref_name == 'dependabotchanges' }} - tags: | - ${{ steps.registry.outputs.int_registry }}/webapp:${{ steps.determine_tag.outputs.tagname }} - ${{ steps.registry.outputs.int_registry }}/webapp:${{ steps.determine_tag.outputs.tagname }}_${{ steps.date.outputs.date }}_${{ github.run_number }} - - - name: Build Docker Image and optionally push - External Registry - if: ${{ github.ref_name == 'main' }} - uses: docker/build-push-action@v6 - with: - context: ./src - file: ./src/WebApp.Dockerfile - push: ${{github.ref_name == 'main' }} - tags: | - ${{ steps.registry.outputs.ext_registry }}/webapp:${{ steps.determine_tag.outputs.tagname }} - ${{ steps.registry.outputs.ext_registry }}/webapp:${{ steps.determine_tag.outputs.tagname }}_${{ steps.date.outputs.date }}_${{ github.run_number }} - diff --git a/archive-doc-gen/.github/workflows/job-cleanup-deployment.yml b/archive-doc-gen/.github/workflows/job-cleanup-deployment.yml deleted file mode 100644 index 0e8aef426..000000000 --- a/archive-doc-gen/.github/workflows/job-cleanup-deployment.yml +++ /dev/null @@ -1,109 +0,0 @@ -name: Cleanup Deployment Job -on: - workflow_call: - inputs: - runner_os: - description: 'Runner OS (ubuntu-latest or windows-latest)' - required: true - type: string - trigger_type: - description: 'Trigger type (workflow_dispatch, pull_request, schedule)' - required: true - type: string - cleanup_resources: - description: 'Cleanup Deployed Resources' - required: false - default: false - type: boolean - existing_webapp_url: - description: 'Existing Container WebApp URL (Skips Deployment)' - required: false - default: '' - type: string - RESOURCE_GROUP_NAME: - description: 'Resource Group Name to cleanup' - required: true - type: string - AZURE_LOCATION: - description: 'Azure Location' - required: true - type: string - AZURE_ENV_OPENAI_LOCATION: - description: 'Azure OpenAI Location' - required: true - type: string - ENV_NAME: - description: 'Environment Name' - required: true - type: string - IMAGE_TAG: - description: 'Docker Image Tag' - required: true - type: string -permissions: - contents: read - actions: read - -jobs: - cleanup-deployment: - runs-on: ${{ inputs.runner_os }} - continue-on-error: true - env: - RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: ${{ inputs.AZURE_ENV_OPENAI_LOCATION }} - ENV_NAME: ${{ inputs.ENV_NAME }} - IMAGE_TAG: ${{ inputs.IMAGE_TAG }} - steps: - - name: Login to Azure - shell: bash - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - - name: Delete Resource Group (Optimized Cleanup) - id: delete_rg - shell: bash - run: | - set -e - echo "🗑️ Starting optimized resource cleanup..." - echo "Deleting resource group: ${{ env.RESOURCE_GROUP_NAME }}" - - az group delete \ - --name "${{ env.RESOURCE_GROUP_NAME }}" \ - --yes \ - --no-wait - - echo "✅ Resource group deletion initiated (running asynchronously)" - echo "Note: Resources will be cleaned up in the background" - - - name: Logout from Azure - if: always() - shell: bash - run: | - azd auth logout || true - az logout || echo "Warning: Failed to logout from Azure CLI" - echo "Logged out from Azure." - - - name: Generate Cleanup Job Summary - if: always() - shell: bash - run: | - echo "## 🧹 Cleanup Job Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| **Resource Group deletion Status** | ${{ steps.delete_rg.outcome == 'success' && '✅ Initiated' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Resource Group** | \`${{ env.RESOURCE_GROUP_NAME }}\` |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [[ "${{ steps.delete_rg.outcome }}" == "success" ]]; then - echo "### ✅ Cleanup Details" >> $GITHUB_STEP_SUMMARY - echo "- Successfully initiated deletion for Resource Group \`${{ env.RESOURCE_GROUP_NAME }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Cleanup Failed" >> $GITHUB_STEP_SUMMARY - echo "- Cleanup process encountered an error" >> $GITHUB_STEP_SUMMARY - echo "- Manual cleanup may be required for:" >> $GITHUB_STEP_SUMMARY - echo " - Resource Group: \`${{ env.RESOURCE_GROUP_NAME }}\`" >> $GITHUB_STEP_SUMMARY - echo "- Check the cleanup-deployment job logs for detailed error information" >> $GITHUB_STEP_SUMMARY - fi diff --git a/archive-doc-gen/.github/workflows/job-deploy-linux.yml b/archive-doc-gen/.github/workflows/job-deploy-linux.yml deleted file mode 100644 index 37d1b82a2..000000000 --- a/archive-doc-gen/.github/workflows/job-deploy-linux.yml +++ /dev/null @@ -1,403 +0,0 @@ -name: Deploy Steps - Linux - -on: - workflow_call: - inputs: - ENV_NAME: - required: true - type: string - AZURE_ENV_OPENAI_LOCATION: - required: true - type: string - AZURE_LOCATION: - required: true - type: string - RESOURCE_GROUP_NAME: - required: true - type: string - IMAGE_TAG: - required: true - type: string - BUILD_DOCKER_IMAGE: - required: true - type: string - EXP: - required: true - type: string - WAF_ENABLED: - required: false - type: string - default: 'false' - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: - required: false - type: string - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: - required: false - type: string - outputs: - WEB_APPURL: - description: "Container Web App URL" - value: ${{ jobs.deploy-linux.outputs.WEB_APPURL }} -permissions: - contents: read - actions: read - -jobs: - deploy-linux: - runs-on: ubuntu-latest - env: - AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }} - outputs: - WEB_APPURL: ${{ steps.get_output_linux.outputs.WEB_APPURL }} - steps: - - name: Validate Workflow Input Parameters - shell: bash - env: - INPUT_ENV_NAME: ${{ inputs.ENV_NAME }} - INPUT_AZURE_ENV_OPENAI_LOCATION: ${{ inputs.AZURE_ENV_OPENAI_LOCATION }} - INPUT_AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - INPUT_IMAGE_TAG: ${{ inputs.IMAGE_TAG }} - INPUT_BUILD_DOCKER_IMAGE: ${{ inputs.BUILD_DOCKER_IMAGE }} - INPUT_EXP: ${{ inputs.EXP }} - INPUT_WAF_ENABLED: ${{ inputs.WAF_ENABLED }} - INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - run: | - echo "🔍 Validating workflow input parameters..." - VALIDATION_FAILED=false - - # Validate ENV_NAME (required, alphanumeric and hyphens) - if [[ -z "$INPUT_ENV_NAME" ]]; then - echo "❌ ERROR: ENV_NAME is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_ENV_NAME" =~ ^[a-zA-Z0-9-]+$ ]]; then - echo "❌ ERROR: ENV_NAME '$INPUT_ENV_NAME' is invalid. Must contain only alphanumerics and hyphens" - VALIDATION_FAILED=true - else - echo "✅ ENV_NAME: '$INPUT_ENV_NAME' is valid" - fi - - # Validate AZURE_ENV_OPENAI_LOCATION (required, Azure region format) - if [[ -z "$INPUT_AZURE_ENV_OPENAI_LOCATION" ]]; then - echo "❌ ERROR: AZURE_ENV_OPENAI_LOCATION is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_AZURE_ENV_OPENAI_LOCATION" =~ ^[a-z0-9]+$ ]]; then - echo "❌ ERROR: AZURE_ENV_OPENAI_LOCATION '$INPUT_AZURE_ENV_OPENAI_LOCATION' is invalid. Must contain only lowercase letters and numbers" - VALIDATION_FAILED=true - else - echo "✅ AZURE_ENV_OPENAI_LOCATION: '$INPUT_AZURE_ENV_OPENAI_LOCATION' is valid" - fi - - # Validate AZURE_LOCATION (required, Azure region format) - if [[ -z "$INPUT_AZURE_LOCATION" ]]; then - echo "❌ ERROR: AZURE_LOCATION is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_AZURE_LOCATION" =~ ^[a-z0-9]+$ ]]; then - echo "❌ ERROR: AZURE_LOCATION '$INPUT_AZURE_LOCATION' is invalid. Must contain only lowercase letters and numbers" - VALIDATION_FAILED=true - else - echo "✅ AZURE_LOCATION: '$INPUT_AZURE_LOCATION' is valid" - fi - - # Validate RESOURCE_GROUP_NAME (required, Azure naming convention) - if [[ -z "$INPUT_RESOURCE_GROUP_NAME" ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period." - VALIDATION_FAILED=true - elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters" - VALIDATION_FAILED=true - else - echo "✅ RESOURCE_GROUP_NAME: '$INPUT_RESOURCE_GROUP_NAME' is valid" - fi - - # Validate IMAGE_TAG (required, Docker tag pattern) - if [[ -z "$INPUT_IMAGE_TAG" ]]; then - echo "❌ ERROR: IMAGE_TAG is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_IMAGE_TAG" =~ ^[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}$ ]]; then - echo "❌ ERROR: IMAGE_TAG '$INPUT_IMAGE_TAG' is invalid. Must start with alphanumeric or underscore, max 128 characters" - VALIDATION_FAILED=true - else - echo "✅ IMAGE_TAG: '$INPUT_IMAGE_TAG' is valid" - fi - - # Validate BUILD_DOCKER_IMAGE (required, must be 'true' or 'false') - if [[ "$INPUT_BUILD_DOCKER_IMAGE" != "true" && "$INPUT_BUILD_DOCKER_IMAGE" != "false" ]]; then - echo "❌ ERROR: BUILD_DOCKER_IMAGE must be 'true' or 'false', got: '$INPUT_BUILD_DOCKER_IMAGE'" - VALIDATION_FAILED=true - else - echo "✅ BUILD_DOCKER_IMAGE: '$INPUT_BUILD_DOCKER_IMAGE' is valid" - fi - - # Validate EXP (required, must be 'true' or 'false') - if [[ "$INPUT_EXP" != "true" && "$INPUT_EXP" != "false" ]]; then - echo "❌ ERROR: EXP must be 'true' or 'false', got: '$INPUT_EXP'" - VALIDATION_FAILED=true - else - echo "✅ EXP: '$INPUT_EXP' is valid" - fi - - # Validate WAF_ENABLED (must be 'true' or 'false') - if [[ "$INPUT_WAF_ENABLED" != "true" && "$INPUT_WAF_ENABLED" != "false" ]]; then - echo "❌ ERROR: WAF_ENABLED must be 'true' or 'false', got: '$INPUT_WAF_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ WAF_ENABLED: '$INPUT_WAF_ENABLED' is valid" - fi - - # Validate AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID (optional, if provided must be valid Resource ID) - if [[ -n "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" ]]; then - if [[ ! "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then - echo "❌ ERROR: AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}" - echo " Got: '$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: Valid Resource ID format" - fi - fi - - # Validate AZURE_EXISTING_AI_PROJECT_RESOURCE_ID (optional, if provided must be valid Resource ID) - if [[ -n "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" ]]; then - if [[ ! "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/([Mm]icrosoft\.[Mm]achine[Ll]earning[Ss]ervices/([Ww]orkspaces|[Pp]rojects)/[^/]+|[Mm]icrosoft\.[Cc]ognitive[Ss]ervices/[Aa]ccounts/[^/]+/[Pp]rojects/[^/]+)$ ]]; then - echo "❌ ERROR: AZURE_EXISTING_AI_PROJECT_RESOURCE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}" - echo " Got: '$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: Valid Resource ID format" - fi - fi - - # Fail workflow if any validation failed - if [[ "$VALIDATION_FAILED" == "true" ]]; then - echo "" - echo "❌ Parameter validation failed. Please correct the errors above and try again." - exit 1 - fi - - echo "" - echo "✅ All input parameters validated successfully!" - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Configure Parameters Based on WAF Setting - shell: bash - env: - WAF_ENABLED: ${{ inputs.WAF_ENABLED }} - run: | - if [[ "$WAF_ENABLED" == "true" ]]; then - cp infra/main.waf.parameters.json infra/main.parameters.json - echo "✅ Successfully copied WAF parameters to main parameters file" - else - echo "🔧 Configuring Non-WAF deployment - using default main.parameters.json..." - fi - - - name: Install azd - uses: Azure/setup-azd@v2 - - - name: Login to AZD - id: login-azure - shell: bash - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --client-secret ${{ secrets.AZURE_CLIENT_SECRET }} --tenant-id ${{ secrets.AZURE_TENANT_ID }} - - - name: Deploy using azd up and extract values (Linux) - id: get_output_linux - shell: bash - env: - ENV_NAME: ${{ inputs.ENV_NAME }} - AZURE_ENV_OPENAI_LOCATION: ${{ inputs.AZURE_ENV_OPENAI_LOCATION }} - AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }} - RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - IMAGE_TAG: ${{ inputs.IMAGE_TAG }} - BUILD_DOCKER_IMAGE: ${{ inputs.BUILD_DOCKER_IMAGE }} - EXP: ${{ inputs.EXP }} - INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - run: | - set -e - - echo "Creating environment..." - azd env new "$ENV_NAME" --no-prompt - echo "Environment created: $ENV_NAME" - - echo "Setting default subscription..." - azd config set defaults.subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" - - # Set additional parameters - azd env set AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}" - azd env set AZURE_ENV_OPENAI_LOCATION="$AZURE_ENV_OPENAI_LOCATION" - azd env set AZURE_LOCATION="$AZURE_LOCATION" - azd env set AZURE_RESOURCE_GROUP="$RESOURCE_GROUP_NAME" - azd env set AZURE_ENV_IMAGETAG="$IMAGE_TAG" - - # Set ACR name only when building Docker image - if [[ "$BUILD_DOCKER_IMAGE" == "true" ]]; then - # Extract ACR name from login server and set as environment variable - ACR_NAME="${{ secrets.ACR_TEST_USERNAME }}" - azd env set AZURE_ENV_ACR_NAME="$ACR_NAME" - echo "Set ACR name to: $ACR_NAME" - else - echo "Skipping ACR name configuration (using existing image)" - fi - - if [[ "$EXP" == "true" ]]; then - echo "✅ EXP ENABLED - Setting EXP parameters..." - - # Set EXP variables dynamically - if [[ -n "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" ]]; then - EXP_LOG_ANALYTICS_ID="$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" - else - EXP_LOG_ANALYTICS_ID="${{ secrets.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" - fi - - if [[ -n "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" ]]; then - EXP_AI_PROJECT_ID="$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" - else - EXP_AI_PROJECT_ID="${{ secrets.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" - fi - - echo "AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: $EXP_LOG_ANALYTICS_ID" - echo "AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: $EXP_AI_PROJECT_ID" - azd env set AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID="$EXP_LOG_ANALYTICS_ID" - azd env set AZURE_EXISTING_AI_PROJECT_RESOURCE_ID="$EXP_AI_PROJECT_ID" - else - echo "❌ EXP DISABLED - Skipping EXP parameters" - if [[ -n "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" ]] || [[ -n "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" ]]; then - echo "⚠️ Warning: EXP parameter values provided but EXP is disabled. These values will be ignored." - fi - fi - - # Deploy using azd up - azd up --no-prompt - - # Get deployment outputs using azd - echo "Extracting deployment outputs..." - DEPLOY_OUTPUT=$(azd env get-values --output json) - echo "Deployment output: $DEPLOY_OUTPUT" - - if [[ -z "$DEPLOY_OUTPUT" ]]; then - echo "Error: Deployment output is empty. Please check the deployment logs." - exit 1 - fi - - # Extract values from azd output (adjust these based on actual output variable names) - AI_FOUNDRY_RESOURCE_ID=$(echo "$DEPLOY_OUTPUT" | jq -r '.AI_FOUNDRY_RESOURCE_ID // empty') - echo "AI_FOUNDRY_RESOURCE_ID=$AI_FOUNDRY_RESOURCE_ID" >> $GITHUB_ENV - - AI_SEARCH_SERVICE_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.AI_SEARCH_SERVICE_NAME // empty') - echo "AI_SEARCH_SERVICE_NAME=$AI_SEARCH_SERVICE_NAME" >> $GITHUB_ENV - - AZURE_COSMOSDB_ACCOUNT=$(echo "$DEPLOY_OUTPUT" | jq -r '.AZURE_COSMOSDB_ACCOUNT // empty') - echo "AZURE_COSMOSDB_ACCOUNT=$AZURE_COSMOSDB_ACCOUNT" >> $GITHUB_ENV - - STORAGE_ACCOUNT_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.STORAGE_ACCOUNT_NAME // empty') - echo "STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME" >> $GITHUB_ENV - - STORAGE_CONTAINER_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.STORAGE_CONTAINER_NAME // empty') - echo "STORAGE_CONTAINER_NAME=$STORAGE_CONTAINER_NAME" >> $GITHUB_ENV - - KEY_VAULT_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.KEY_VAULT_NAME // empty') - echo "KEY_VAULT_NAME=$KEY_VAULT_NAME" >> $GITHUB_ENV - - RESOURCE_GROUP_NAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.RESOURCE_GROUP_NAME // empty') - echo "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" >> $GITHUB_ENV - - WEB_APPURL=$(echo "$DEPLOY_OUTPUT" | jq -r '.WEB_APP_URL // .SERVICE_BACKEND_ENDPOINT_URL // empty') - echo "WEB_APPURL=$WEB_APPURL" >> $GITHUB_OUTPUT - sleep 30 - - - name: Run Post-Deployment Script - id: post_deploy - env: - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - STORAGE_ACCOUNT_NAME: ${{ env.STORAGE_ACCOUNT_NAME }} - STORAGE_CONTAINER_NAME: ${{ env.STORAGE_CONTAINER_NAME }} - KEY_VAULT_NAME: ${{ env.KEY_VAULT_NAME }} - AZURE_COSMOSDB_ACCOUNT: ${{ env.AZURE_COSMOSDB_ACCOUNT }} - RESOURCE_GROUP_NAME: ${{ env.RESOURCE_GROUP_NAME }} - AI_SEARCH_SERVICE_NAME: ${{ env.AI_SEARCH_SERVICE_NAME }} - AI_FOUNDRY_RESOURCE_ID: ${{ env.AI_FOUNDRY_RESOURCE_ID }} - run: | - set -e - az account set --subscription "$AZURE_SUBSCRIPTION_ID" - - echo "Running post-deployment script..." - - bash ./infra/scripts/process_sample_data.sh \ - "$STORAGE_ACCOUNT_NAME" \ - "$STORAGE_CONTAINER_NAME" \ - "$KEY_VAULT_NAME" \ - "$AZURE_COSMOSDB_ACCOUNT" \ - "$RESOURCE_GROUP_NAME" \ - "$AI_SEARCH_SERVICE_NAME" \ - "$AZURE_CLIENT_ID" \ - "$AI_FOUNDRY_RESOURCE_ID" - - - name: Generate Deploy Job Summary - if: always() - env: - RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - WAF_ENABLED: ${{ inputs.WAF_ENABLED }} - EXP: ${{ inputs.EXP }} - AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: ${{ inputs.AZURE_ENV_OPENAI_LOCATION }} - IMAGE_TAG: ${{ inputs.IMAGE_TAG }} - JOB_STATUS: ${{ job.status }} - WEB_APPURL: ${{ steps.get_output_linux.outputs.WEB_APPURL }} - run: | - echo "## 🚀 Deploy Job Summary (Linux)" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - - if [[ "$JOB_STATUS" == "success" ]]; then - echo "| **Job Status** | ✅ Success |" >> $GITHUB_STEP_SUMMARY - else - echo "| **Job Status** | ❌ Failed |" >> $GITHUB_STEP_SUMMARY - fi - - echo "| **Resource Group** | \`$RESOURCE_GROUP_NAME\` |" >> $GITHUB_STEP_SUMMARY - - # Determine configuration type - if [[ "$WAF_ENABLED" == "true" && "$EXP" == "true" ]]; then - CONFIG_TYPE="WAF + EXP" - elif [[ "$WAF_ENABLED" == "true" && "$EXP" != "true" ]]; then - CONFIG_TYPE="WAF + Non-EXP" - elif [[ "$WAF_ENABLED" != "true" && "$EXP" == "true" ]]; then - CONFIG_TYPE="Non-WAF + EXP" - else - CONFIG_TYPE="Non-WAF + Non-EXP" - fi - echo "| **Configuration Type** | \`$CONFIG_TYPE\` |" >> $GITHUB_STEP_SUMMARY - - echo "| **Azure Region (Infrastructure)** | \`$AZURE_LOCATION\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Azure OpenAI Region** | \`$AZURE_ENV_OPENAI_LOCATION\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Docker Image Tag** | \`$IMAGE_TAG\` |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - if [[ "$JOB_STATUS" == "success" ]]; then - echo "### ✅ Deployment Details" >> $GITHUB_STEP_SUMMARY - echo "- **Web App URL**: [$WEB_APPURL]($WEB_APPURL)" >> $GITHUB_STEP_SUMMARY - echo "- Successfully deployed to Azure with all resources configured" >> $GITHUB_STEP_SUMMARY - echo "- Post-deployment scripts executed successfully" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Deployment Failed" >> $GITHUB_STEP_SUMMARY - echo "- Deployment process encountered an error" >> $GITHUB_STEP_SUMMARY - echo "- Check the deploy job for detailed error information" >> $GITHUB_STEP_SUMMARY - fi - - - name: Logout from Azure - if: always() - shell: bash - run: | - az logout || true - echo "Logged out from Azure." diff --git a/archive-doc-gen/.github/workflows/job-deploy-windows.yml b/archive-doc-gen/.github/workflows/job-deploy-windows.yml deleted file mode 100644 index e9dda12d4..000000000 --- a/archive-doc-gen/.github/workflows/job-deploy-windows.yml +++ /dev/null @@ -1,394 +0,0 @@ -name: Deploy Steps - Windows - -on: - workflow_call: - inputs: - ENV_NAME: - required: true - type: string - AZURE_ENV_OPENAI_LOCATION: - required: true - type: string - AZURE_LOCATION: - required: true - type: string - RESOURCE_GROUP_NAME: - required: true - type: string - IMAGE_TAG: - required: true - type: string - BUILD_DOCKER_IMAGE: - required: true - type: string - EXP: - required: true - type: string - WAF_ENABLED: - required: false - type: string - default: 'false' - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: - required: false - type: string - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: - required: false - type: string - outputs: - WEB_APPURL: - description: "Container Web App URL" - value: ${{ jobs.deploy-windows.outputs.WEB_APPURL }} -permissions: - contents: read - actions: read - -jobs: - deploy-windows: - runs-on: windows-latest - env: - AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }} - outputs: - WEB_APPURL: ${{ steps.get_output_windows.outputs.WEB_APPURL }} - steps: - - name: Validate Workflow Input Parameters - shell: bash - env: - INPUT_ENV_NAME: ${{ inputs.ENV_NAME }} - INPUT_AZURE_ENV_OPENAI_LOCATION: ${{ inputs.AZURE_ENV_OPENAI_LOCATION }} - INPUT_AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - INPUT_IMAGE_TAG: ${{ inputs.IMAGE_TAG }} - INPUT_BUILD_DOCKER_IMAGE: ${{ inputs.BUILD_DOCKER_IMAGE }} - INPUT_EXP: ${{ inputs.EXP }} - INPUT_WAF_ENABLED: ${{ inputs.WAF_ENABLED }} - INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - run: | - echo "🔍 Validating workflow input parameters..." - VALIDATION_FAILED=false - - # Validate ENV_NAME (required, alphanumeric and hyphens) - if [[ -z "$INPUT_ENV_NAME" ]]; then - echo "❌ ERROR: ENV_NAME is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_ENV_NAME" =~ ^[a-zA-Z0-9-]+$ ]]; then - echo "❌ ERROR: ENV_NAME '$INPUT_ENV_NAME' is invalid. Must contain only alphanumerics and hyphens" - VALIDATION_FAILED=true - else - echo "✅ ENV_NAME: '$INPUT_ENV_NAME' is valid" - fi - - # Validate AZURE_ENV_OPENAI_LOCATION (required, Azure region format) - if [[ -z "$INPUT_AZURE_ENV_OPENAI_LOCATION" ]]; then - echo "❌ ERROR: AZURE_ENV_OPENAI_LOCATION is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_AZURE_ENV_OPENAI_LOCATION" =~ ^[a-z0-9]+$ ]]; then - echo "❌ ERROR: AZURE_ENV_OPENAI_LOCATION '$INPUT_AZURE_ENV_OPENAI_LOCATION' is invalid. Must contain only lowercase letters and numbers" - VALIDATION_FAILED=true - else - echo "✅ AZURE_ENV_OPENAI_LOCATION: '$INPUT_AZURE_ENV_OPENAI_LOCATION' is valid" - fi - - # Validate AZURE_LOCATION (required, Azure region format) - if [[ -z "$INPUT_AZURE_LOCATION" ]]; then - echo "❌ ERROR: AZURE_LOCATION is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_AZURE_LOCATION" =~ ^[a-z0-9]+$ ]]; then - echo "❌ ERROR: AZURE_LOCATION '$INPUT_AZURE_LOCATION' is invalid. Must contain only lowercase letters and numbers" - VALIDATION_FAILED=true - else - echo "✅ AZURE_LOCATION: '$INPUT_AZURE_LOCATION' is valid" - fi - - # Validate RESOURCE_GROUP_NAME (required, Azure naming convention) - if [[ -z "$INPUT_RESOURCE_GROUP_NAME" ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period." - VALIDATION_FAILED=true - elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters" - VALIDATION_FAILED=true - else - echo "✅ RESOURCE_GROUP_NAME: '$INPUT_RESOURCE_GROUP_NAME' is valid" - fi - - # Validate IMAGE_TAG (required, Docker tag pattern) - if [[ -z "$INPUT_IMAGE_TAG" ]]; then - echo "❌ ERROR: IMAGE_TAG is required but not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_IMAGE_TAG" =~ ^[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}$ ]]; then - echo "❌ ERROR: IMAGE_TAG '$INPUT_IMAGE_TAG' is invalid. Must start with alphanumeric or underscore, max 128 characters" - VALIDATION_FAILED=true - else - echo "✅ IMAGE_TAG: '$INPUT_IMAGE_TAG' is valid" - fi - - # Validate BUILD_DOCKER_IMAGE (required, must be 'true' or 'false') - if [[ "$INPUT_BUILD_DOCKER_IMAGE" != "true" && "$INPUT_BUILD_DOCKER_IMAGE" != "false" ]]; then - echo "❌ ERROR: BUILD_DOCKER_IMAGE must be 'true' or 'false', got: '$INPUT_BUILD_DOCKER_IMAGE'" - VALIDATION_FAILED=true - else - echo "✅ BUILD_DOCKER_IMAGE: '$INPUT_BUILD_DOCKER_IMAGE' is valid" - fi - - # Validate EXP (required, must be 'true' or 'false') - if [[ "$INPUT_EXP" != "true" && "$INPUT_EXP" != "false" ]]; then - echo "❌ ERROR: EXP must be 'true' or 'false', got: '$INPUT_EXP'" - VALIDATION_FAILED=true - else - echo "✅ EXP: '$INPUT_EXP' is valid" - fi - - # Validate WAF_ENABLED (must be 'true' or 'false') - if [[ "$INPUT_WAF_ENABLED" != "true" && "$INPUT_WAF_ENABLED" != "false" ]]; then - echo "❌ ERROR: WAF_ENABLED must be 'true' or 'false', got: '$INPUT_WAF_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ WAF_ENABLED: '$INPUT_WAF_ENABLED' is valid" - fi - - # Validate AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID (optional, if provided must be valid Resource ID) - if [[ -n "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" ]]; then - if [[ ! "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then - echo "❌ ERROR: AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}" - echo " Got: '$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: Valid Resource ID format" - fi - fi - - # Validate AZURE_EXISTING_AI_PROJECT_RESOURCE_ID (optional, if provided must be valid Resource ID) - if [[ -n "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" ]]; then - if [[ ! "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/([Mm]icrosoft\.[Mm]achine[Ll]earning[Ss]ervices/([Ww]orkspaces|[Pp]rojects)/[^/]+|[Mm]icrosoft\.[Cc]ognitive[Ss]ervices/[Aa]ccounts/[^/]+/[Pp]rojects/[^/]+)$ ]]; then - echo "❌ ERROR: AZURE_EXISTING_AI_PROJECT_RESOURCE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}" - echo " Got: '$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: Valid Resource ID format" - fi - fi - - # Fail workflow if any validation failed - if [[ "$VALIDATION_FAILED" == "true" ]]; then - echo "" - echo "❌ Parameter validation failed. Please correct the errors above and try again." - exit 1 - fi - - echo "" - echo "✅ All input parameters validated successfully!" - - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Configure Parameters Based on WAF Setting - shell: bash - env: - WAF_ENABLED: ${{ inputs.WAF_ENABLED }} - run: | - if [[ "$WAF_ENABLED" == "true" ]]; then - cp infra/main.waf.parameters.json infra/main.parameters.json - echo "✅ Successfully copied WAF parameters to main parameters file" - else - echo "🔧 Configuring Non-WAF deployment - using default main.parameters.json..." - fi - - - name: Setup Azure Developer CLI (Windows) - uses: Azure/setup-azd@v2 - - - name: Login to AZD - id: login-azure - shell: bash - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --client-secret ${{ secrets.AZURE_CLIENT_SECRET }} --tenant-id ${{ secrets.AZURE_TENANT_ID }} - - - - name: Deploy using azd up and extract values (Windows) - id: get_output_windows - shell: pwsh - env: - ENV_NAME: ${{ inputs.ENV_NAME }} - AZURE_ENV_OPENAI_LOCATION: ${{ inputs.AZURE_ENV_OPENAI_LOCATION }} - AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }} - RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - IMAGE_TAG: ${{ inputs.IMAGE_TAG }} - BUILD_DOCKER_IMAGE: ${{ inputs.BUILD_DOCKER_IMAGE }} - EXP: ${{ inputs.EXP }} - INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - run: | - $ErrorActionPreference = "Stop" - - Write-Host "Creating environment..." - azd env new $env:ENV_NAME --no-prompt - Write-Host "Environment created: $env:ENV_NAME" - - Write-Host "Setting default subscription..." - azd config set defaults.subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - # Set additional parameters - azd env set AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}" - azd env set AZURE_ENV_OPENAI_LOCATION="$env:AZURE_ENV_OPENAI_LOCATION" - azd env set AZURE_LOCATION="$env:AZURE_LOCATION" - azd env set AZURE_RESOURCE_GROUP="$env:RESOURCE_GROUP_NAME" - azd env set AZURE_ENV_IMAGETAG="$env:IMAGE_TAG" - - # Set ACR name only when building Docker image - if ($env:BUILD_DOCKER_IMAGE -eq "true") { - $ACR_NAME = "${{ secrets.ACR_TEST_USERNAME }}" - azd env set AZURE_ENV_ACR_NAME="$ACR_NAME" - Write-Host "Set ACR name to: $ACR_NAME" - } else { - Write-Host "Skipping ACR name configuration (using existing image)" - } - - if ($env:EXP -eq "true") { - Write-Host "✅ EXP ENABLED - Setting EXP parameters..." - - # Set EXP variables dynamically - if ($env:INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID -ne "") { - $EXP_LOG_ANALYTICS_ID = $env:INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID - } else { - $EXP_LOG_ANALYTICS_ID = "${{ secrets.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" - } - - if ($env:INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID -ne "") { - $EXP_AI_PROJECT_ID = $env:INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID - } else { - $EXP_AI_PROJECT_ID = "${{ secrets.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" - } - - Write-Host "AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: $EXP_LOG_ANALYTICS_ID" - Write-Host "AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: $EXP_AI_PROJECT_ID" - azd env set AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID="$EXP_LOG_ANALYTICS_ID" - azd env set AZURE_EXISTING_AI_PROJECT_RESOURCE_ID="$EXP_AI_PROJECT_ID" - } else { - Write-Host "❌ EXP DISABLED - Skipping EXP parameters" - } - - # Deploy using azd up - azd up --no-prompt - - Write-Host "✅ Deployment succeeded." - - # Get deployment outputs using azd - Write-Host "Extracting deployment outputs..." - $DEPLOY_OUTPUT = azd env get-values --output json | ConvertFrom-Json - Write-Host "Deployment output: $($DEPLOY_OUTPUT | ConvertTo-Json -Depth 10)" - - if (-not $DEPLOY_OUTPUT) { - Write-Host "Error: Deployment output is empty. Please check the deployment logs." - exit 1 - } - - - $AI_FOUNDRY_RESOURCE_ID = $DEPLOY_OUTPUT.AI_FOUNDRY_RESOURCE_ID - "AI_FOUNDRY_RESOURCE_ID=$AI_FOUNDRY_RESOURCE_ID" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - $AI_SEARCH_SERVICE_NAME = $DEPLOY_OUTPUT.AI_SEARCH_SERVICE_NAME - "AI_SEARCH_SERVICE_NAME=$AI_SEARCH_SERVICE_NAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - $AZURE_COSMOSDB_ACCOUNT = $DEPLOY_OUTPUT.AZURE_COSMOSDB_ACCOUNT - "AZURE_COSMOSDB_ACCOUNT=$AZURE_COSMOSDB_ACCOUNT" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - $STORAGE_ACCOUNT_NAME = $DEPLOY_OUTPUT.STORAGE_ACCOUNT_NAME - "STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - $STORAGE_CONTAINER_NAME = $DEPLOY_OUTPUT.STORAGE_CONTAINER_NAME - "STORAGE_CONTAINER_NAME=$STORAGE_CONTAINER_NAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - $KEY_VAULT_NAME = $DEPLOY_OUTPUT.KEY_VAULT_NAME - "KEY_VAULT_NAME=$KEY_VAULT_NAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - $RESOURCE_GROUP_NAME = $DEPLOY_OUTPUT.RESOURCE_GROUP_NAME - "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - $WEB_APP_URL = $DEPLOY_OUTPUT.WEB_APP_URL - "WEB_APPURL=$WEB_APP_URL" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - "WEB_APPURL=$WEB_APP_URL" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append - - - name: Run Post-Deployment Script - id: post_deploy - env: - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - shell: bash - run: | - set -e - az account set --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" - - echo "Running post-deployment script..." - - bash ./infra/scripts/process_sample_data.sh \ - "${{ env.STORAGE_ACCOUNT_NAME }}" \ - "${{ env.STORAGE_CONTAINER_NAME }}" \ - "${{ env.KEY_VAULT_NAME }}" \ - "${{ env.AZURE_COSMOSDB_ACCOUNT }}" \ - "${{ env.RESOURCE_GROUP_NAME }}" \ - "${{ env.AI_SEARCH_SERVICE_NAME }}" \ - "${{ secrets.AZURE_CLIENT_ID }}" \ - "${{ env.AI_FOUNDRY_RESOURCE_ID }}" - - - name: Generate Deploy Job Summary - if: always() - shell: bash - env: - RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - WAF_ENABLED: ${{ inputs.WAF_ENABLED }} - EXP: ${{ inputs.EXP }} - AZURE_LOCATION: ${{ inputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: ${{ inputs.AZURE_ENV_OPENAI_LOCATION }} - IMAGE_TAG: ${{ inputs.IMAGE_TAG }} - JOB_STATUS: ${{ job.status }} - WEB_APPURL: ${{ steps.get_output_windows.outputs.WEB_APPURL }} - run: | - echo "## 🚀 Deploy Job Summary (Windows)" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - if [[ "$JOB_STATUS" == "success" ]]; then - echo "| **Job Status** | ✅ Success |" >> $GITHUB_STEP_SUMMARY - else - echo "| **Job Status** | ❌ Failed |" >> $GITHUB_STEP_SUMMARY - fi - echo "| **Resource Group** | \`$RESOURCE_GROUP_NAME\` |" >> $GITHUB_STEP_SUMMARY - - # Determine configuration type - if [[ "$WAF_ENABLED" == "true" && "$EXP" == "true" ]]; then - CONFIG_TYPE="WAF + EXP" - elif [[ "$WAF_ENABLED" == "true" && "$EXP" != "true" ]]; then - CONFIG_TYPE="WAF + Non-EXP" - elif [[ "$WAF_ENABLED" != "true" && "$EXP" == "true" ]]; then - CONFIG_TYPE="Non-WAF + EXP" - else - CONFIG_TYPE="Non-WAF + Non-EXP" - fi - echo "| **Configuration Type** | \`$CONFIG_TYPE\` |" >> $GITHUB_STEP_SUMMARY - - echo "| **Azure Region (Infrastructure)** | \`$AZURE_LOCATION\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Azure OpenAI Region** | \`$AZURE_ENV_OPENAI_LOCATION\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Docker Image Tag** | \`$IMAGE_TAG\` |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [[ "$JOB_STATUS" == "success" ]]; then - echo "### ✅ Deployment Details" >> $GITHUB_STEP_SUMMARY - echo "- **Web App URL**: [$WEB_APPURL]($WEB_APPURL)" >> $GITHUB_STEP_SUMMARY - echo "- Successfully deployed to Azure with all resources configured" >> $GITHUB_STEP_SUMMARY - echo "- Post-deployment scripts executed successfully" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Deployment Failed" >> $GITHUB_STEP_SUMMARY - echo "- Deployment process encountered an error" >> $GITHUB_STEP_SUMMARY - echo "- Check the deploy job for detailed error information" >> $GITHUB_STEP_SUMMARY - fi - - - name: Logout from Azure - if: always() - shell: bash - run: | - az logout || true - echo "Logged out from Azure." diff --git a/archive-doc-gen/.github/workflows/job-deploy.yml b/archive-doc-gen/.github/workflows/job-deploy.yml deleted file mode 100644 index a54023768..000000000 --- a/archive-doc-gen/.github/workflows/job-deploy.yml +++ /dev/null @@ -1,554 +0,0 @@ -name: Deploy Job - -on: - workflow_call: - inputs: - trigger_type: - description: 'Trigger type (workflow_dispatch, pull_request, schedule)' - required: true - type: string - runner_os: - description: 'Runner OS (ubuntu-latest or windows-latest)' - required: true - type: string - azure_location: - description: 'Azure Location For Deployment' - required: false - default: 'australiaeast' - type: string - resource_group_name: - description: 'Resource Group Name (Optional)' - required: false - default: '' - type: string - waf_enabled: - description: 'Enable WAF' - required: false - default: false - type: boolean - EXP: - description: 'Enable EXP' - required: false - default: false - type: boolean - build_docker_image: - description: 'Build And Push Docker Image (Optional)' - required: false - default: false - type: boolean - cleanup_resources: - description: 'Cleanup Deployed Resources' - required: false - default: false - type: boolean - run_e2e_tests: - description: 'Run End-to-End Tests' - required: false - default: 'GoldenPath-Testing' - type: string - existing_webapp_url: - description: 'Existing Container WebApp URL (Skips Deployment)' - required: false - default: '' - type: string - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: - description: 'Log Analytics Workspace ID (Optional)' - required: false - default: '' - type: string - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: - description: 'AI Project Resource ID (Optional)' - required: false - default: '' - type: string - docker_image_tag: - description: 'Docker Image Tag from build job' - required: false - default: '' - type: string - outputs: - RESOURCE_GROUP_NAME: - description: "Resource Group Name" - value: ${{ jobs.azure-setup.outputs.RESOURCE_GROUP_NAME }} - WEB_APPURL: - description: "Container Web App URL" - value: ${{ jobs.deploy-linux.outputs.WEB_APPURL || jobs.deploy-windows.outputs.WEB_APPURL }} - ENV_NAME: - description: "Environment Name" - value: ${{ jobs.azure-setup.outputs.ENV_NAME }} - AZURE_LOCATION: - description: "Azure Location" - value: ${{ jobs.azure-setup.outputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: - description: "Azure OpenAI Location" - value: ${{ jobs.azure-setup.outputs.AZURE_ENV_OPENAI_LOCATION }} - IMAGE_TAG: - description: "Docker Image Tag Used" - value: ${{ jobs.azure-setup.outputs.IMAGE_TAG }} - QUOTA_FAILED: - description: "Quota Check Failed Flag" - value: ${{ jobs.azure-setup.outputs.QUOTA_FAILED || 'false' }} - -env: - GPT_MIN_CAPACITY: 150 - TEXT_EMBEDDING_MIN_CAPACITY: 80 - BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }} - WAF_ENABLED: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.waf_enabled || false) || false }} - EXP: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.EXP || false) || false }} - CLEANUP_RESOURCES: ${{ inputs.trigger_type != 'workflow_dispatch' || inputs.cleanup_resources }} - RUN_E2E_TESTS: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.run_e2e_tests || 'GoldenPath-Testing') || 'GoldenPath-Testing' }} - BUILD_DOCKER_IMAGE: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.build_docker_image || false) || false }} -permissions: - contents: read - actions: read - -jobs: - azure-setup: - name: Azure Setup - if: inputs.trigger_type != 'workflow_dispatch' || inputs.existing_webapp_url == '' || inputs.existing_webapp_url == null - runs-on: ubuntu-latest - outputs: - RESOURCE_GROUP_NAME: ${{ steps.check_create_rg.outputs.RESOURCE_GROUP_NAME }} - ENV_NAME: ${{ steps.generate_env_name.outputs.ENV_NAME }} - AZURE_LOCATION: ${{ steps.set_region.outputs.AZURE_LOCATION }} - AZURE_ENV_OPENAI_LOCATION: ${{ steps.set_region.outputs.AZURE_ENV_OPENAI_LOCATION }} - IMAGE_TAG: ${{ steps.determine_image_tag.outputs.IMAGE_TAG }} - QUOTA_FAILED: ${{ steps.quota_failure_output.outputs.QUOTA_FAILED }} - EXP_ENABLED: ${{ steps.configure_exp.outputs.EXP_ENABLED }} - - steps: - - name: Validate Workflow Input Parameters - shell: bash - env: - INPUT_TRIGGER_TYPE: ${{ inputs.trigger_type }} - INPUT_RUNNER_OS: ${{ inputs.runner_os }} - INPUT_BUILD_DOCKER_IMAGE: ${{ inputs.build_docker_image }} - INPUT_AZURE_LOCATION: ${{ inputs.azure_location }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.resource_group_name }} - INPUT_WAF_ENABLED: ${{ inputs.waf_enabled }} - INPUT_EXP: ${{ inputs.EXP }} - INPUT_CLEANUP_RESOURCES: ${{ inputs.cleanup_resources }} - INPUT_RUN_E2E_TESTS: ${{ inputs.run_e2e_tests }} - INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }} - INPUT_DOCKER_IMAGE_TAG: ${{ inputs.docker_image_tag }} - run: | - echo "🔍 Validating workflow input parameters..." - VALIDATION_FAILED=false - - # Validate trigger_type (required - alphanumeric with underscores) - if [[ -z "$INPUT_TRIGGER_TYPE" ]]; then - echo "❌ ERROR: trigger_type is required but was not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_TRIGGER_TYPE" =~ ^[a-zA-Z0-9_]+$ ]]; then - echo "❌ ERROR: trigger_type '$INPUT_TRIGGER_TYPE' is invalid. Must contain only alphanumeric characters and underscores" - VALIDATION_FAILED=true - else - echo "✅ trigger_type: '$INPUT_TRIGGER_TYPE' is valid" - fi - - # Validate runner_os (required - must be specific values) - ALLOWED_RUNNER_OS=("ubuntu-latest" "windows-latest") - if [[ -z "$INPUT_RUNNER_OS" ]]; then - echo "❌ ERROR: runner_os is required but was not provided" - VALIDATION_FAILED=true - elif [[ ! " ${ALLOWED_RUNNER_OS[@]} " =~ " ${INPUT_RUNNER_OS} " ]]; then - echo "❌ ERROR: runner_os '$INPUT_RUNNER_OS' is invalid. Allowed values: ${ALLOWED_RUNNER_OS[*]}" - VALIDATION_FAILED=true - else - echo "✅ runner_os: '$INPUT_RUNNER_OS' is valid" - fi - - # Validate build_docker_image (boolean) - if [[ "$INPUT_BUILD_DOCKER_IMAGE" != "true" && "$INPUT_BUILD_DOCKER_IMAGE" != "false" ]]; then - echo "❌ ERROR: build_docker_image must be 'true' or 'false', got: '$INPUT_BUILD_DOCKER_IMAGE'" - VALIDATION_FAILED=true - else - echo "✅ build_docker_image: '$INPUT_BUILD_DOCKER_IMAGE' is valid" - fi - - # Validate azure_location (Azure region format) - if [[ -n "$INPUT_AZURE_LOCATION" ]]; then - if [[ ! "$INPUT_AZURE_LOCATION" =~ ^[a-z0-9]+$ ]]; then - echo "❌ ERROR: azure_location '$INPUT_AZURE_LOCATION' is invalid. Must contain only lowercase letters and numbers (e.g., 'australiaeast', 'westus2')" - VALIDATION_FAILED=true - else - echo "✅ azure_location: '$INPUT_AZURE_LOCATION' is valid" - fi - fi - - # Validate resource_group_name (Azure resource group naming convention) - if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then - if [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then - echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period." - VALIDATION_FAILED=true - elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then - echo "❌ ERROR: resource_group_name '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters" - VALIDATION_FAILED=true - else - echo "✅ resource_group_name: '$INPUT_RESOURCE_GROUP_NAME' is valid" - fi - fi - - # Validate waf_enabled (boolean) - if [[ "$INPUT_WAF_ENABLED" != "true" && "$INPUT_WAF_ENABLED" != "false" ]]; then - echo "❌ ERROR: waf_enabled must be 'true' or 'false', got: '$INPUT_WAF_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ waf_enabled: '$INPUT_WAF_ENABLED' is valid" - fi - - # Validate EXP (boolean) - if [[ "$INPUT_EXP" != "true" && "$INPUT_EXP" != "false" ]]; then - echo "❌ ERROR: EXP must be 'true' or 'false', got: '$INPUT_EXP'" - VALIDATION_FAILED=true - else - echo "✅ EXP: '$INPUT_EXP' is valid" - fi - - # Validate cleanup_resources (boolean) - if [[ "$INPUT_CLEANUP_RESOURCES" != "true" && "$INPUT_CLEANUP_RESOURCES" != "false" ]]; then - echo "❌ ERROR: cleanup_resources must be 'true' or 'false', got: '$INPUT_CLEANUP_RESOURCES'" - VALIDATION_FAILED=true - else - echo "✅ cleanup_resources: '$INPUT_CLEANUP_RESOURCES' is valid" - fi - - # Validate run_e2e_tests (specific allowed values) - if [[ -n "$INPUT_RUN_E2E_TESTS" ]]; then - ALLOWED_VALUES=("None" "GoldenPath-Testing" "Smoke-Testing") - if [[ ! " ${ALLOWED_VALUES[@]} " =~ " ${INPUT_RUN_E2E_TESTS} " ]]; then - echo "❌ ERROR: run_e2e_tests '$INPUT_RUN_E2E_TESTS' is invalid. Allowed values: ${ALLOWED_VALUES[*]}" - VALIDATION_FAILED=true - else - echo "✅ run_e2e_tests: '$INPUT_RUN_E2E_TESTS' is valid" - fi - fi - - # Validate AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID (Azure Resource ID format) - if [[ -n "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" ]]; then - if [[ ! "$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/[Mm]icrosoft\.[Oo]perational[Ii]nsights/[Ww]orkspaces/[^/]+$ ]]; then - echo "❌ ERROR: AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}" - echo " Got: '$INPUT_AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: Valid Resource ID format" - fi - fi - - # Validate AZURE_EXISTING_AI_PROJECT_RESOURCE_ID (Azure Resource ID format) - if [[ -n "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" ]]; then - if [[ ! "$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID" =~ ^/subscriptions/[a-fA-F0-9-]+/[Rr]esource[Gg]roups/[^/]+/providers/([Mm]icrosoft\.[Mm]achine[Ll]earning[Ss]ervices/([Ww]orkspaces|[Pp]rojects)/[^/]+|[Mm]icrosoft\.[Cc]ognitive[Ss]ervices/[Aa]ccounts/[^/]+/[Pp]rojects/[^/]+)$ ]]; then - echo "❌ ERROR: AZURE_EXISTING_AI_PROJECT_RESOURCE_ID is invalid. Must be a valid Azure Resource ID format:" - echo " /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{accountName}/projects/{projectName}" - echo " Got: '$INPUT_AZURE_EXISTING_AI_PROJECT_RESOURCE_ID'" - VALIDATION_FAILED=true - else - echo "✅ AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: Valid Resource ID format" - fi - fi - - # Validate existing_webapp_url (must start with https) - if [[ -n "$INPUT_EXISTING_WEBAPP_URL" ]]; then - if [[ ! "$INPUT_EXISTING_WEBAPP_URL" =~ ^https:// ]]; then - echo "❌ ERROR: existing_webapp_url must start with 'https://', got: '$INPUT_EXISTING_WEBAPP_URL'" - VALIDATION_FAILED=true - else - echo "✅ existing_webapp_url: '$INPUT_EXISTING_WEBAPP_URL' is valid" - fi - fi - - # Validate docker_image_tag (Docker tag pattern) - if [[ -n "$INPUT_DOCKER_IMAGE_TAG" ]]; then - # Docker tags: lowercase and uppercase letters, digits, underscores, periods, and hyphens - # Cannot start with period or hyphen, max 128 characters - if [[ ! "$INPUT_DOCKER_IMAGE_TAG" =~ ^[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}$ ]]; then - echo "❌ ERROR: docker_image_tag '$INPUT_DOCKER_IMAGE_TAG' is invalid. Must:" - echo " - Start with alphanumeric or underscore" - echo " - Contain only alphanumerics, underscores, periods, hyphens" - echo " - Be max 128 characters" - VALIDATION_FAILED=true - else - echo "✅ docker_image_tag: '$INPUT_DOCKER_IMAGE_TAG' is valid" - fi - fi - - # Fail workflow if any validation failed - if [[ "$VALIDATION_FAILED" == "true" ]]; then - echo "" - echo "❌ Parameter validation failed. Please correct the errors above and try again." - exit 1 - fi - - echo "" - echo "✅ All input parameters validated successfully!" - - - name: Validate and Auto-Configure EXP - id: configure_exp - shell: bash - env: - INPUT_EXP: ${{ inputs.EXP }} - INPUT_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - INPUT_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - run: | - echo "🔍 Validating EXP configuration..." - - EXP_ENABLED="false" - - if [[ "$INPUT_EXP" == "true" ]]; then - EXP_ENABLED="true" - echo "✅ EXP explicitly enabled by user input" - elif [[ -n "$INPUT_LOG_ANALYTICS_WORKSPACE_ID" ]] || [[ -n "$INPUT_AI_PROJECT_RESOURCE_ID" ]]; then - echo "🔧 AUTO-ENABLING EXP: EXP parameter values were provided but EXP was not explicitly enabled." - echo "" - echo "You provided values for:" - [[ -n "$INPUT_LOG_ANALYTICS_WORKSPACE_ID" ]] && echo " - Azure Log Analytics Workspace ID: '$INPUT_LOG_ANALYTICS_WORKSPACE_ID'" - [[ -n "$INPUT_AI_PROJECT_RESOURCE_ID" ]] && echo " - Azure AI Project Resource ID: '$INPUT_AI_PROJECT_RESOURCE_ID'" - echo "" - echo "✅ Automatically enabling EXP to use these values." - EXP_ENABLED="true" - fi - - echo "EXP_ENABLED=$EXP_ENABLED" >> $GITHUB_ENV - echo "EXP_ENABLED=$EXP_ENABLED" >> $GITHUB_OUTPUT - echo "Final EXP status: $EXP_ENABLED" - - - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Login to Azure - shell: bash - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - - name: Run Quota Check - id: quota-check - env: - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - GPT_MIN_CAPACITY: ${{ env.GPT_MIN_CAPACITY }} - TEXT_EMBEDDING_MIN_CAPACITY: ${{ env.TEXT_EMBEDDING_MIN_CAPACITY }} - AZURE_REGIONS: ${{ vars.AZURE_REGIONS }} - run: | - chmod +x scripts/checkquota.sh - if ! scripts/checkquota.sh; then - # If quota check fails due to insufficient quota, set the flag - if grep -q "No region with sufficient quota found" scripts/checkquota.sh; then - echo "QUOTA_FAILED=true" >> $GITHUB_ENV - fi - exit 1 # Fail the pipeline if any other failure occurs - fi - - - name: Set Quota Failure Output - id: quota_failure_output - if: env.QUOTA_FAILED == 'true' - shell: bash - run: | - echo "QUOTA_FAILED=true" >> $GITHUB_OUTPUT - echo "Quota check failed - will notify via separate notification job" - - - name: Fail Pipeline if Quota Check Fails - if: env.QUOTA_FAILED == 'true' - shell: bash - run: exit 1 - - - name: Set Deployment Region - id: set_region - shell: bash - env: - INPUT_AZURE_LOCATION: ${{ inputs.azure_location }} - run: | - echo "Selected Region from Quota Check: $VALID_REGION" - echo "AZURE_ENV_OPENAI_LOCATION=$VALID_REGION" >> $GITHUB_ENV - echo "AZURE_ENV_OPENAI_LOCATION=$VALID_REGION" >> $GITHUB_OUTPUT - - if [[ "${{ inputs.trigger_type }}" == "workflow_dispatch" && -n "$INPUT_AZURE_LOCATION" ]]; then - USER_SELECTED_LOCATION="$INPUT_AZURE_LOCATION" - echo "Using user-selected Azure location: $USER_SELECTED_LOCATION" - echo "AZURE_LOCATION=$USER_SELECTED_LOCATION" >> $GITHUB_ENV - echo "AZURE_LOCATION=$USER_SELECTED_LOCATION" >> $GITHUB_OUTPUT - else - echo "Using location from quota check for automatic triggers: $VALID_REGION" - echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_ENV - echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_OUTPUT - fi - - - name: Generate Resource Group Name - id: generate_rg_name - shell: bash - env: - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.resource_group_name }} - run: | - # Check if a resource group name was provided as input - if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then - echo "Using provided Resource Group name: $INPUT_RESOURCE_GROUP_NAME" - echo "RESOURCE_GROUP_NAME=$INPUT_RESOURCE_GROUP_NAME" >> $GITHUB_ENV - else - echo "Generating a unique resource group name..." - ACCL_NAME="docgen" # Account name as specified - SHORT_UUID=$(uuidgen | cut -d'-' -f1) - UNIQUE_RG_NAME="arg-${ACCL_NAME}-${SHORT_UUID}" - echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV - echo "Generated RESOURCE_GROUP_NAME: ${UNIQUE_RG_NAME}" - fi - - - name: Install Bicep CLI - shell: bash - run: az bicep install - - - name: Check and Create Resource Group - id: check_create_rg - shell: bash - run: | - set -e - echo "🔍 Checking if resource group '$RESOURCE_GROUP_NAME' exists..." - rg_exists=$(az group exists --name $RESOURCE_GROUP_NAME) - if [ "$rg_exists" = "false" ]; then - echo "📦 Resource group does not exist. Creating new resource group '$RESOURCE_GROUP_NAME' in location '$AZURE_LOCATION'..." - az group create --name $RESOURCE_GROUP_NAME --location $AZURE_LOCATION || { echo "❌ Error creating resource group"; exit 1; } - echo "✅ Resource group '$RESOURCE_GROUP_NAME' created successfully." - else - echo "✅ Resource group '$RESOURCE_GROUP_NAME' already exists. Deploying to existing resource group." - fi - echo "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" >> $GITHUB_OUTPUT - echo "RESOURCE_GROUP_NAME=$RESOURCE_GROUP_NAME" >> $GITHUB_ENV - - - name: Generate Unique Solution Prefix - id: generate_solution_prefix - shell: bash - run: | - set -e - COMMON_PART="psldg" - TIMESTAMP=$(date +%s) - UPDATED_TIMESTAMP=$(echo $TIMESTAMP | tail -c 6) - UNIQUE_SOLUTION_PREFIX="${COMMON_PART}${UPDATED_TIMESTAMP}" - echo "SOLUTION_PREFIX=${UNIQUE_SOLUTION_PREFIX}" >> $GITHUB_ENV - echo "Generated SOLUTION_PREFIX: ${UNIQUE_SOLUTION_PREFIX}" - - - name: Determine Docker Image Tag - id: determine_image_tag - env: - INPUT_DOCKER_IMAGE_TAG: ${{ inputs.docker_image_tag }} - run: | - if [[ "${{ env.BUILD_DOCKER_IMAGE }}" == "true" ]]; then - if [[ -n "$INPUT_DOCKER_IMAGE_TAG" ]]; then - IMAGE_TAG="$INPUT_DOCKER_IMAGE_TAG" - echo "🔗 Using Docker image tag from build job: $IMAGE_TAG" - else - echo "❌ Docker build job failed or was skipped, but BUILD_DOCKER_IMAGE is true" - exit 1 - fi - else - echo "🏷️ Using existing Docker image based on branch..." - BRANCH_NAME="${{ env.BRANCH_NAME }}" - echo "Current branch: $BRANCH_NAME" - - # Determine image tag based on branch - if [[ "$BRANCH_NAME" == "main" ]]; then - IMAGE_TAG="latest_waf" - echo "Using main branch - image tag: latest_waf" - elif [[ "$BRANCH_NAME" == "dev" ]]; then - IMAGE_TAG="dev" - echo "Using dev branch - image tag: dev" - elif [[ "$BRANCH_NAME" == "demo" ]]; then - IMAGE_TAG="demo" - echo "Using demo branch - image tag: demo" - else - IMAGE_TAG="latest_waf" - echo "Using default for branch '$BRANCH_NAME' - image tag: latest_waf" - fi - - echo "Using existing Docker image tag: $IMAGE_TAG" - fi - - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_OUTPUT - - - name: Generate Unique Environment Name - id: generate_env_name - shell: bash - run: | - COMMON_PART="pslc" - TIMESTAMP=$(date +%s) - UPDATED_TIMESTAMP=$(echo $TIMESTAMP | tail -c 6) - UNIQUE_ENV_NAME="${COMMON_PART}${UPDATED_TIMESTAMP}" - echo "ENV_NAME=${UNIQUE_ENV_NAME}" >> $GITHUB_ENV - echo "Generated Environment Name: ${UNIQUE_ENV_NAME}" - echo "ENV_NAME=${UNIQUE_ENV_NAME}" >> $GITHUB_OUTPUT - - - name: Display Workflow Configuration to GitHub Summary - shell: bash - env: - INPUT_AZURE_LOCATION: ${{ inputs.azure_location }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.resource_group_name }} - run: | - echo "## 📋 Workflow Configuration Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Configuration | Value |" >> $GITHUB_STEP_SUMMARY - echo "|---------------|-------|" >> $GITHUB_STEP_SUMMARY - echo "| **Branch** | \`${{ env.BRANCH_NAME }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **WAF Enabled** | ${{ env.WAF_ENABLED == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **EXP Enabled** | ${{ steps.configure_exp.outputs.EXP_ENABLED == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Run E2E Tests** | \`${{ env.RUN_E2E_TESTS }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Cleanup Resources** | ${{ env.CLEANUP_RESOURCES == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Build Docker Image** | ${{ env.BUILD_DOCKER_IMAGE == 'true' && '✅ Yes' || '❌ No' }} |" >> $GITHUB_STEP_SUMMARY - - if [[ "${{ inputs.trigger_type }}" == "workflow_dispatch" && -n "$INPUT_AZURE_LOCATION" ]]; then - echo "| **Azure Location** | \`$INPUT_AZURE_LOCATION\` (User Selected) |" >> $GITHUB_STEP_SUMMARY - fi - - if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then - echo "| **Resource Group** | \`$INPUT_RESOURCE_GROUP_NAME\` (Pre-specified) |" >> $GITHUB_STEP_SUMMARY - else - echo "| **Resource Group** | \`${{ env.RESOURCE_GROUP_NAME }}\` (Auto-generated) |" >> $GITHUB_STEP_SUMMARY - fi - - echo "" >> $GITHUB_STEP_SUMMARY - - if [[ "${{ inputs.trigger_type }}" != "workflow_dispatch" ]]; then - echo "ℹ️ **Note:** Automatic Trigger - Using Non-WAF + Non-EXP configuration" >> $GITHUB_STEP_SUMMARY - else - echo "ℹ️ **Note:** Manual Trigger - Using user-specified configuration" >> $GITHUB_STEP_SUMMARY - fi - - deploy-linux: - name: Deploy on Linux - needs: azure-setup - if: inputs.runner_os == 'ubuntu-latest' && !cancelled() && needs.azure-setup.result == 'success' - uses: ./.github/workflows/job-deploy-linux.yml - with: - ENV_NAME: ${{ needs.azure-setup.outputs.ENV_NAME }} - AZURE_ENV_OPENAI_LOCATION: ${{ needs.azure-setup.outputs.AZURE_ENV_OPENAI_LOCATION }} - AZURE_LOCATION: ${{ needs.azure-setup.outputs.AZURE_LOCATION }} - RESOURCE_GROUP_NAME: ${{ needs.azure-setup.outputs.RESOURCE_GROUP_NAME }} - IMAGE_TAG: ${{ needs.azure-setup.outputs.IMAGE_TAG }} - BUILD_DOCKER_IMAGE: ${{ inputs.build_docker_image || 'false' }} - EXP: ${{ needs.azure-setup.outputs.EXP_ENABLED }} - WAF_ENABLED: ${{ inputs.waf_enabled == true && 'true' || 'false' }} - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - secrets: inherit - - deploy-windows: - name: Deploy on Windows - needs: azure-setup - if: inputs.runner_os == 'windows-latest' && !cancelled() && needs.azure-setup.result == 'success' - uses: ./.github/workflows/job-deploy-windows.yml - with: - ENV_NAME: ${{ needs.azure-setup.outputs.ENV_NAME }} - AZURE_ENV_OPENAI_LOCATION: ${{ needs.azure-setup.outputs.AZURE_ENV_OPENAI_LOCATION }} - AZURE_LOCATION: ${{ needs.azure-setup.outputs.AZURE_LOCATION }} - RESOURCE_GROUP_NAME: ${{ needs.azure-setup.outputs.RESOURCE_GROUP_NAME }} - IMAGE_TAG: ${{ needs.azure-setup.outputs.IMAGE_TAG }} - BUILD_DOCKER_IMAGE: ${{ inputs.build_docker_image || 'false' }} - EXP: ${{ needs.azure-setup.outputs.EXP_ENABLED }} - WAF_ENABLED: ${{ inputs.waf_enabled == true && 'true' || 'false' }} - AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: ${{ inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }} - AZURE_EXISTING_AI_PROJECT_RESOURCE_ID: ${{ inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }} - secrets: inherit diff --git a/archive-doc-gen/.github/workflows/job-docker-build.yml b/archive-doc-gen/.github/workflows/job-docker-build.yml deleted file mode 100644 index fc564ea3f..000000000 --- a/archive-doc-gen/.github/workflows/job-docker-build.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: Docker Build Job - -on: - workflow_call: - inputs: - trigger_type: - description: 'Trigger type (workflow_dispatch, pull_request, schedule)' - required: true - type: string - build_docker_image: - description: 'Build And Push Docker Image (Optional)' - required: false - default: false - type: boolean - outputs: - IMAGE_TAG: - description: "Generated Docker Image Tag" - value: ${{ jobs.docker-build.outputs.IMAGE_TAG }} - -env: - BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }} -permissions: - contents: read - actions: read - -jobs: - docker-build: - if: inputs.trigger_type == 'workflow_dispatch' && inputs.build_docker_image == true - runs-on: ubuntu-latest - outputs: - IMAGE_TAG: ${{ steps.generate_docker_tag.outputs.IMAGE_TAG }} - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Generate Unique Docker Image Tag - id: generate_docker_tag - shell: bash - run: | - echo "🔨 Building new Docker image - generating unique tag..." - TIMESTAMP=$(date +%Y%m%d-%H%M%S) - RUN_ID="${{ github.run_id }}" - BRANCH_NAME="${{ github.head_ref || github.ref_name }}" - CLEAN_BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/[^a-zA-Z0-9._-]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g') - UNIQUE_TAG="${CLEAN_BRANCH_NAME}-${TIMESTAMP}-${RUN_ID}" - echo "IMAGE_TAG=$UNIQUE_TAG" >> $GITHUB_ENV - echo "IMAGE_TAG=$UNIQUE_TAG" >> $GITHUB_OUTPUT - echo "Generated unique Docker tag: $UNIQUE_TAG" - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to Azure Container Registry - uses: azure/docker-login@v2 - with: - login-server: ${{ secrets.ACR_TEST_LOGIN_SERVER }} - username: ${{ secrets.ACR_TEST_USERNAME }} - password: ${{ secrets.ACR_TEST_PASSWORD }} - - - name: Build and Push Docker Image - id: build_push_image - uses: docker/build-push-action@v6 - env: - DOCKER_BUILD_SUMMARY: false - with: - context: ./src - file: ./src/WebApp.Dockerfile - push: true - tags: | - ${{ secrets.ACR_TEST_LOGIN_SERVER }}/webapp:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }} - ${{ secrets.ACR_TEST_LOGIN_SERVER }}/webapp:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}_${{ github.run_number }} - - - name: Verify Docker Image Build - shell: bash - run: | - echo "✅ Docker image successfully built and pushed" - echo "Image tag: ${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}" - - - name: Generate Docker Build Summary - if: always() - shell: bash - run: | - ACR_NAME=$(echo "${{ secrets.ACR_TEST_LOGIN_SERVER }}") - echo "## 🐳 Docker Build Job Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| **Job Status** | ${{ job.status == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| **Image Tag** | \`${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Branch** | ${{ env.BRANCH_NAME }} |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [[ "${{ job.status }}" == "success" ]]; then - echo "### ✅ Build Details" >> $GITHUB_STEP_SUMMARY - echo "Successfully built and pushed one Docker image to ACR:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "**Built Images:**" >> $GITHUB_STEP_SUMMARY - echo "- \`${ACR_NAME}.azurecr.io/webapp:${{ steps.generate_docker_tag.outputs.IMAGE_TAG }}\`" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Build Failed" >> $GITHUB_STEP_SUMMARY - echo "- Docker build process encountered an error" >> $GITHUB_STEP_SUMMARY - echo "- Check the docker-build job for detailed error information" >> $GITHUB_STEP_SUMMARY - fi diff --git a/archive-doc-gen/.github/workflows/job-send-notification.yml b/archive-doc-gen/.github/workflows/job-send-notification.yml deleted file mode 100644 index e5c833a33..000000000 --- a/archive-doc-gen/.github/workflows/job-send-notification.yml +++ /dev/null @@ -1,419 +0,0 @@ -name: Send Notification Job - -on: - workflow_call: - inputs: - trigger_type: - description: 'Trigger type (workflow_dispatch, pull_request, schedule)' - required: true - type: string - waf_enabled: - description: 'Enable WAF' - required: false - default: false - type: boolean - EXP: - description: 'Enable EXP' - required: false - default: false - type: boolean - run_e2e_tests: - description: 'Run End-to-End Tests' - required: false - default: 'GoldenPath-Testing' - type: string - existing_webapp_url: - description: 'Existing Container WebApp URL (Skips Deployment)' - required: false - default: '' - type: string - deploy_result: - description: 'Deploy job result (success, failure, skipped)' - required: true - type: string - e2e_test_result: - description: 'E2E test job result (success, failure, skipped)' - required: true - type: string - WEB_APPURL: - description: 'Container Web App URL' - required: false - default: '' - type: string - RESOURCE_GROUP_NAME: - description: 'Resource Group Name' - required: false - default: '' - type: string - QUOTA_FAILED: - description: 'Quota Check Failed Flag' - required: false - default: 'false' - type: string - TEST_SUCCESS: - description: 'Test Success Flag' - required: false - default: '' - type: string - TEST_REPORT_URL: - description: 'Test Report URL' - required: false - default: '' - type: string - -env: - GPT_MIN_CAPACITY: 100 - BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.head_ref || github.ref_name }} - WAF_ENABLED: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.waf_enabled || false) || false }} - EXP: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.EXP || false) || false }} - RUN_E2E_TESTS: ${{ inputs.trigger_type == 'workflow_dispatch' && (inputs.run_e2e_tests || 'GoldenPath-Testing') || 'GoldenPath-Testing' }} -permissions: - contents: read - actions: read - -jobs: - send-notification: - runs-on: ubuntu-latest - continue-on-error: true - env: - accelerator_name: "DocGen" - steps: - - name: Validate Workflow Input Parameters - shell: bash - env: - INPUT_TRIGGER_TYPE: ${{ inputs.trigger_type }} - INPUT_WAF_ENABLED: ${{ inputs.waf_enabled }} - INPUT_EXP: ${{ inputs.EXP }} - INPUT_RUN_E2E_TESTS: ${{ inputs.run_e2e_tests }} - INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }} - INPUT_DEPLOY_RESULT: ${{ inputs.deploy_result }} - INPUT_E2E_TEST_RESULT: ${{ inputs.e2e_test_result }} - INPUT_WEB_APPURL: ${{ inputs.WEB_APPURL }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - INPUT_QUOTA_FAILED: ${{ inputs.QUOTA_FAILED }} - INPUT_TEST_SUCCESS: ${{ inputs.TEST_SUCCESS }} - INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }} - run: | - echo "🔍 Validating workflow input parameters..." - VALIDATION_FAILED=false - - # Validate trigger_type (required - alphanumeric with underscores) - if [[ -z "$INPUT_TRIGGER_TYPE" ]]; then - echo "❌ ERROR: trigger_type is required but was not provided" - VALIDATION_FAILED=true - elif [[ ! "$INPUT_TRIGGER_TYPE" =~ ^[a-zA-Z0-9_]+$ ]]; then - echo "❌ ERROR: trigger_type '$INPUT_TRIGGER_TYPE' is invalid. Must contain only alphanumeric characters and underscores" - VALIDATION_FAILED=true - else - echo "✅ trigger_type: '$INPUT_TRIGGER_TYPE' is valid" - fi - - # Validate waf_enabled (boolean) - if [[ "$INPUT_WAF_ENABLED" != "true" && "$INPUT_WAF_ENABLED" != "false" ]]; then - echo "❌ ERROR: waf_enabled must be 'true' or 'false', got: '$INPUT_WAF_ENABLED'" - VALIDATION_FAILED=true - else - echo "✅ waf_enabled: '$INPUT_WAF_ENABLED' is valid" - fi - - # Validate EXP (boolean) - if [[ "$INPUT_EXP" != "true" && "$INPUT_EXP" != "false" ]]; then - echo "❌ ERROR: EXP must be 'true' or 'false', got: '$INPUT_EXP'" - VALIDATION_FAILED=true - else - echo "✅ EXP: '$INPUT_EXP' is valid" - fi - - # Validate run_e2e_tests (specific allowed values) - if [[ -n "$INPUT_RUN_E2E_TESTS" ]]; then - ALLOWED_VALUES=("None" "GoldenPath-Testing" "Smoke-Testing") - if [[ ! " ${ALLOWED_VALUES[@]} " =~ " ${INPUT_RUN_E2E_TESTS} " ]]; then - echo "❌ ERROR: run_e2e_tests '$INPUT_RUN_E2E_TESTS' is invalid. Allowed values: ${ALLOWED_VALUES[*]}" - VALIDATION_FAILED=true - else - echo "✅ run_e2e_tests: '$INPUT_RUN_E2E_TESTS' is valid" - fi - fi - - # Validate existing_webapp_url (must start with https if provided) - if [[ -n "$INPUT_EXISTING_WEBAPP_URL" ]]; then - if [[ ! "$INPUT_EXISTING_WEBAPP_URL" =~ ^https:// ]]; then - echo "❌ ERROR: existing_webapp_url must start with 'https://', got: '$INPUT_EXISTING_WEBAPP_URL'" - VALIDATION_FAILED=true - else - echo "✅ existing_webapp_url: '$INPUT_EXISTING_WEBAPP_URL' is valid" - fi - fi - - # Validate deploy_result (required, must be specific values) - if [[ -z "$INPUT_DEPLOY_RESULT" ]]; then - echo "❌ ERROR: deploy_result is required but not provided" - VALIDATION_FAILED=true - else - ALLOWED_DEPLOY_RESULTS=("success" "failure" "skipped") - if [[ ! " ${ALLOWED_DEPLOY_RESULTS[@]} " =~ " ${INPUT_DEPLOY_RESULT} " ]]; then - echo "❌ ERROR: deploy_result '$INPUT_DEPLOY_RESULT' is invalid. Allowed values: ${ALLOWED_DEPLOY_RESULTS[*]}" - VALIDATION_FAILED=true - else - echo "✅ deploy_result: '$INPUT_DEPLOY_RESULT' is valid" - fi - fi - - # Validate e2e_test_result (required, must be specific values) - if [[ -z "$INPUT_E2E_TEST_RESULT" ]]; then - echo "❌ ERROR: e2e_test_result is required but not provided" - VALIDATION_FAILED=true - else - ALLOWED_TEST_RESULTS=("success" "failure" "skipped") - if [[ ! " ${ALLOWED_TEST_RESULTS[@]} " =~ " ${INPUT_E2E_TEST_RESULT} " ]]; then - echo "❌ ERROR: e2e_test_result '$INPUT_E2E_TEST_RESULT' is invalid. Allowed values: ${ALLOWED_TEST_RESULTS[*]}" - VALIDATION_FAILED=true - else - echo "✅ e2e_test_result: '$INPUT_E2E_TEST_RESULT' is valid" - fi - fi - - # Validate WEB_APPURL (must start with https if provided) - if [[ -n "$INPUT_WEB_APPURL" ]]; then - if [[ ! "$INPUT_WEB_APPURL" =~ ^https:// ]]; then - echo "❌ ERROR: WEB_APPURL must start with 'https://', got: '$INPUT_WEB_APPURL'" - VALIDATION_FAILED=true - else - echo "✅ WEB_APPURL: '$INPUT_WEB_APPURL' is valid" - fi - fi - - # Validate RESOURCE_GROUP_NAME (Azure resource group naming convention if provided) - if [[ -n "$INPUT_RESOURCE_GROUP_NAME" ]]; then - if [[ ! "$INPUT_RESOURCE_GROUP_NAME" =~ ^[a-zA-Z0-9._\(\)-]+$ ]] || [[ "$INPUT_RESOURCE_GROUP_NAME" =~ \.$ ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' is invalid. Must contain only alphanumerics, periods, underscores, hyphens, and parentheses. Cannot end with period." - VALIDATION_FAILED=true - elif [[ ${#INPUT_RESOURCE_GROUP_NAME} -gt 90 ]]; then - echo "❌ ERROR: RESOURCE_GROUP_NAME '$INPUT_RESOURCE_GROUP_NAME' exceeds 90 characters" - VALIDATION_FAILED=true - else - echo "✅ RESOURCE_GROUP_NAME: '$INPUT_RESOURCE_GROUP_NAME' is valid" - fi - fi - - # Validate QUOTA_FAILED (must be 'true', 'false', or empty string) - if [[ "$INPUT_QUOTA_FAILED" != "true" && "$INPUT_QUOTA_FAILED" != "false" && "$INPUT_QUOTA_FAILED" != "" ]]; then - echo "❌ ERROR: QUOTA_FAILED must be 'true', 'false', or empty string, got: '$INPUT_QUOTA_FAILED'" - VALIDATION_FAILED=true - else - echo "✅ QUOTA_FAILED: '$INPUT_QUOTA_FAILED' is valid" - fi - - # Validate TEST_SUCCESS (must be 'true' or 'false' or empty) - if [[ -n "$INPUT_TEST_SUCCESS" ]]; then - if [[ "$INPUT_TEST_SUCCESS" != "true" && "$INPUT_TEST_SUCCESS" != "false" ]]; then - echo "❌ ERROR: TEST_SUCCESS must be 'true', 'false', or empty, got: '$INPUT_TEST_SUCCESS'" - VALIDATION_FAILED=true - else - echo "✅ TEST_SUCCESS: '$INPUT_TEST_SUCCESS' is valid" - fi - fi - - # Validate TEST_REPORT_URL (must start with https if provided) - if [[ -n "$INPUT_TEST_REPORT_URL" ]]; then - if [[ ! "$INPUT_TEST_REPORT_URL" =~ ^https:// ]]; then - echo "❌ ERROR: TEST_REPORT_URL must start with 'https://', got: '$INPUT_TEST_REPORT_URL'" - VALIDATION_FAILED=true - else - echo "✅ TEST_REPORT_URL: '$INPUT_TEST_REPORT_URL' is valid" - fi - fi - - # Fail workflow if any validation failed - if [[ "$VALIDATION_FAILED" == "true" ]]; then - echo "" - echo "❌ Parameter validation failed. Please correct the errors above and try again." - exit 1 - fi - - echo "" - echo "✅ All input parameters validated successfully!" - - - name: Determine Test Suite Display Name - id: test_suite - shell: bash - env: - RUN_E2E_TESTS_INPUT: ${{ inputs.run_e2e_tests }} - run: | - if [ "$RUN_E2E_TESTS_INPUT" = "GoldenPath-Testing" ]; then - TEST_SUITE_NAME="Golden Path Testing" - elif [ "$RUN_E2E_TESTS_INPUT" = "Smoke-Testing" ]; then - TEST_SUITE_NAME="Smoke Testing" - elif [ "$RUN_E2E_TESTS_INPUT" = "None" ]; then - TEST_SUITE_NAME="None" - else - TEST_SUITE_NAME="$RUN_E2E_TESTS_INPUT" - fi - echo "TEST_SUITE_NAME=$TEST_SUITE_NAME" >> $GITHUB_OUTPUT - echo "Test Suite: $TEST_SUITE_NAME" - - - name: Send Quota Failure Notification - if: inputs.deploy_result == 'failure' && inputs.QUOTA_FAILED == 'true' - shell: bash - env: - INPUT_DEPLOY_RESULT: ${{ inputs.deploy_result }} - INPUT_QUOTA_FAILED: ${{ inputs.QUOTA_FAILED }} - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the ${{ env.accelerator_name }} deployment has failed due to insufficient quota in the requested regions.

Issue Details:
• Quota check failed for GPT model
• Required GPT Capacity: ${{ env.GPT_MIN_CAPACITY }}
• Checked Regions: ${{ vars.AZURE_REGIONS }}

Run URL: ${RUN_URL}

Please resolve the quota issue and retry the deployment.

Best regards,
Your Automation Team

", - "subject": "${{ env.accelerator_name }} Pipeline - Failed (Insufficient Quota)" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send quota failure notification" - - - name: Send Deployment Failure Notification - if: inputs.deploy_result == 'failure' && inputs.QUOTA_FAILED != 'true' - shell: bash - env: - INPUT_DEPLOY_RESULT: ${{ inputs.deploy_result }} - INPUT_QUOTA_FAILED: ${{ inputs.QUOTA_FAILED }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - RESOURCE_GROUP="$INPUT_RESOURCE_GROUP_NAME" - - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the ${{ env.accelerator_name }} deployment process has encountered an issue and has failed to complete successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• WAF Enabled: ${{ env.WAF_ENABLED }}
• EXP Enabled: ${{ env.EXP }}

Run URL: ${RUN_URL}

Please investigate the deployment failure at your earliest convenience.

Best regards,
Your Automation Team

", - "subject": "${{ env.accelerator_name }} Pipeline - Failed" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send deployment failure notification" - - - name: Send Success Notification - if: inputs.deploy_result == 'success' && (inputs.e2e_test_result == 'skipped' || inputs.TEST_SUCCESS == 'true') - shell: bash - env: - INPUT_DEPLOY_RESULT: ${{ inputs.deploy_result }} - INPUT_E2E_TEST_RESULT: ${{ inputs.e2e_test_result }} - INPUT_TEST_SUCCESS: ${{ inputs.TEST_SUCCESS }} - INPUT_WEB_APPURL: ${{ inputs.WEB_APPURL }} - INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }} - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - WEBAPP_URL="${INPUT_WEB_APPURL:-$INPUT_EXISTING_WEBAPP_URL}" - RESOURCE_GROUP="$INPUT_RESOURCE_GROUP_NAME" - TEST_REPORT_URL="$INPUT_TEST_REPORT_URL" - TEST_SUITE_NAME="${{ steps.test_suite.outputs.TEST_SUITE_NAME }}" - - if [ "$INPUT_E2E_TEST_RESULT" = "skipped" ]; then - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the ${{ env.accelerator_name }} deployment has completed successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• Web App URL: ${WEBAPP_URL}
• E2E Tests: Skipped (as configured)

Configuration:
• WAF Enabled: ${{ env.WAF_ENABLED }}
• EXP Enabled: ${{ env.EXP }}

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "${{ env.accelerator_name }} Pipeline - Deployment Success" - } - EOF - ) - else - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that the ${{ env.accelerator_name }} deployment and testing process has completed successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• Web App URL: ${WEBAPP_URL}
• E2E Tests: Passed ✅
• Test Suite: ${TEST_SUITE_NAME}
• Test Report: View Report

Configuration:
• WAF Enabled: ${{ env.WAF_ENABLED }}
• EXP Enabled: ${{ env.EXP }}

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "${{ env.accelerator_name }} Pipeline - Test Automation - Success" - } - EOF - ) - fi - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send success notification" - - - name: Send Test Failure Notification - if: inputs.deploy_result == 'success' && inputs.e2e_test_result != 'skipped' && inputs.TEST_SUCCESS != 'true' - shell: bash - env: - INPUT_DEPLOY_RESULT: ${{ inputs.deploy_result }} - INPUT_E2E_TEST_RESULT: ${{ inputs.e2e_test_result }} - INPUT_TEST_SUCCESS: ${{ inputs.TEST_SUCCESS }} - INPUT_WEB_APPURL: ${{ inputs.WEB_APPURL }} - INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }} - INPUT_RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }} - INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }} - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - TEST_REPORT_URL="$INPUT_TEST_REPORT_URL" - WEBAPP_URL="${INPUT_WEB_APPURL:-$INPUT_EXISTING_WEBAPP_URL}" - RESOURCE_GROUP="$INPUT_RESOURCE_GROUP_NAME" - TEST_SUITE_NAME="${{ steps.test_suite.outputs.TEST_SUITE_NAME }}" - - EMAIL_BODY=$(cat <Dear Team,

We would like to inform you that ${{ env.accelerator_name }} accelerator test automation process has encountered issues and failed to complete successfully.

Deployment Details:
• Resource Group: ${RESOURCE_GROUP}
• Web App URL: ${WEBAPP_URL}
• Deployment Status: ✅ Success
• E2E Tests: ❌ Failed
• Test Suite: ${TEST_SUITE_NAME}

Test Details:
• Test Report: View Report

Run URL: ${RUN_URL}

Please investigate the matter at your earliest convenience.

Best regards,
Your Automation Team

", - "subject": "${{ env.accelerator_name }} Pipeline - Test Automation - Failed" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send test failure notification" - - - name: Send Existing URL Success Notification - if: inputs.deploy_result == 'skipped' && inputs.existing_webapp_url != '' && inputs.e2e_test_result == 'success' && (inputs.TEST_SUCCESS == 'true' || inputs.TEST_SUCCESS == '') - shell: bash - env: - INPUT_DEPLOY_RESULT: ${{ inputs.deploy_result }} - INPUT_E2E_TEST_RESULT: ${{ inputs.e2e_test_result }} - INPUT_TEST_SUCCESS: ${{ inputs.TEST_SUCCESS }} - INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }} - INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }} - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - EXISTING_URL="$INPUT_EXISTING_WEBAPP_URL" - TEST_REPORT_URL="$INPUT_TEST_REPORT_URL" - TEST_SUITE_NAME="${{ steps.test_suite.outputs.TEST_SUITE_NAME }}" - - EMAIL_BODY=$(cat <Dear Team,

The ${{ env.accelerator_name }} pipeline executed against the specified Target URL and testing process has completed successfully.

Test Results:
• Status: ✅ Passed
• Test Suite: ${TEST_SUITE_NAME}
${TEST_REPORT_URL:+• Test Report: View Report}
• Target URL: ${EXISTING_URL}

Deployment: Skipped

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "${{ env.accelerator_name }} Pipeline - Test Automation Passed" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send existing URL success notification" - - - name: Send Existing URL Test Failure Notification - if: inputs.deploy_result == 'skipped' && inputs.existing_webapp_url != '' && inputs.e2e_test_result == 'failure' - shell: bash - env: - INPUT_DEPLOY_RESULT: ${{ inputs.deploy_result }} - INPUT_E2E_TEST_RESULT: ${{ inputs.e2e_test_result }} - INPUT_EXISTING_WEBAPP_URL: ${{ inputs.existing_webapp_url }} - INPUT_TEST_REPORT_URL: ${{ inputs.TEST_REPORT_URL }} - run: | - RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - EXISTING_URL="$INPUT_EXISTING_WEBAPP_URL" - TEST_REPORT_URL="$INPUT_TEST_REPORT_URL" - TEST_SUITE_NAME="${{ steps.test_suite.outputs.TEST_SUITE_NAME }}" - - EMAIL_BODY=$(cat <Dear Team,

The ${{ env.accelerator_name }} pipeline executed against the specified Target URL and the test automation has encountered issues and failed to complete successfully.

Failure Details:
• Target URL: ${EXISTING_URL}
${TEST_REPORT_URL:+• Test Report: View Report}
• Test Suite: ${TEST_SUITE_NAME}
• Deployment: Skipped

Run URL: ${RUN_URL}

Best regards,
Your Automation Team

", - "subject": "${{ env.accelerator_name }} Pipeline - Test Automation Failed" - } - EOF - ) - - curl -X POST "${{ secrets.EMAILNOTIFICATION_LOGICAPP_URL_TA }}" \ - -H "Content-Type: application/json" \ - -d "$EMAIL_BODY" || echo "Failed to send existing URL test failure notification" diff --git a/archive-doc-gen/.github/workflows/node.js.yml b/archive-doc-gen/.github/workflows/node.js.yml deleted file mode 100644 index 6e1cdcb6f..000000000 --- a/archive-doc-gen/.github/workflows/node.js.yml +++ /dev/null @@ -1,53 +0,0 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs - -name: Build Frontend - -on: - push: - branches: [ "main", "dev" ] - paths: - - 'src/frontend/**/*.ts' - - 'src/frontend/**/*.tsx' - - 'src/frontend/**/*.js' - - 'src/frontend/**/*.jsx' - - 'src/frontend/**/*.json' - - 'src/frontend/**/*.css' - - 'src/frontend/**/*.scss' - - 'src/frontend/**/*.html' - - '.github/workflows/node.js.yml' - pull_request: - branches: [ "main", "dev" ] - paths: - - 'src/frontend/**/*.ts' - - 'src/frontend/**/*.tsx' - - 'src/frontend/**/*.js' - - 'src/frontend/**/*.jsx' - - 'src/frontend/**/*.json' - - 'src/frontend/**/*.css' - - 'src/frontend/**/*.scss' - - 'src/frontend/**/*.html' - - '.github/workflows/node.js.yml' - -jobs: - build: - runs-on: ubuntu-latest - defaults: - run: - working-directory: src/frontend - strategy: - matrix: - node-version: [20.x, 22.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - steps: - - uses: actions/checkout@v6 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v6 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - cache-dependency-path: 'src/frontend/package-lock.json' - - run: npm ci - - run: NODE_OPTIONS=--max_old_space_size=8192 npm run build --if-present - - run: npm run test --if-present diff --git a/archive-doc-gen/.github/workflows/pr-title-checker.yml b/archive-doc-gen/.github/workflows/pr-title-checker.yml deleted file mode 100644 index 842cf679f..000000000 --- a/archive-doc-gen/.github/workflows/pr-title-checker.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: "PR Title Checker" - -on: - pull_request_target: - types: - - opened - - edited - - synchronize - merge_group: - -permissions: - pull-requests: read - -jobs: - main: - name: Validate PR title - runs-on: ubuntu-latest - if: ${{ github.event_name != 'merge_group' }} - steps: - - uses: amannn/action-semantic-pull-request@v6 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/archive-doc-gen/.github/workflows/pylint.yml b/archive-doc-gen/.github/workflows/pylint.yml deleted file mode 100644 index 9cf3c43af..000000000 --- a/archive-doc-gen/.github/workflows/pylint.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: PyLint - -on: - push: - paths: - - 'src/**/*.py' - - '.flake8' - - '.github/workflows/pylint.yml' - -jobs: - lint: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.11"] - - steps: - # Step 1: Checkout code - - name: Checkout code - uses: actions/checkout@v6 - - # Step 2: Set up Python environment - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r src/requirements-dev.txt - - # Step 3: Run all code quality checks - - name: Pylint - run: | - echo "Running Pylint..." - python -m flake8 --config=.flake8 --exclude=tests --verbose . - \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/python-app.yml b/archive-doc-gen/.github/workflows/python-app.yml deleted file mode 100644 index 5e442350c..000000000 --- a/archive-doc-gen/.github/workflows/python-app.yml +++ /dev/null @@ -1,60 +0,0 @@ -# This workflow will install Python dependencies, run tests and lint with a single version of Python -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python - -name: Python application - -on: - push: - branches: [ "main" ] - paths: - - 'src/**/*.py' - - 'src/requirements*.txt' - - 'src/tests/**' - - '.github/workflows/python-app.yml' - pull_request: - branches: [ "main" ] - paths: - - 'src/**/*.py' - - 'src/requirements*.txt' - - 'src/tests/**' - - '.github/workflows/python-app.yml' - -permissions: - contents: read - -jobs: - test_linux: - runs-on: - - ubuntu-latest - steps: - - uses: actions/checkout@v6 - - name: Set up Python 3.11 - uses: actions/setup-python@v6 - with: - python-version: "3.11" - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r src/requirements-dev.txt - - name: Test with pytest - run: | - export PYTHONPATH=$(pwd)/src - pytest -v --show-capture=stdout -k "not integration" ./src/tests - - test_windows: - runs-on: - - windows-latest - steps: - - uses: actions/checkout@v6 - - name: Set up Python 3.11 - uses: actions/setup-python@v6 - with: - python-version: "3.11" - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r src/requirements-dev.txt - - name: Test with pytest - run: | - $env:PYTHONPATH="$pwd\src" - pytest -v --show-capture=stdout -k "not integration" ./src/tests \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/stale-bot.yml b/archive-doc-gen/.github/workflows/stale-bot.yml deleted file mode 100644 index 85c76e855..000000000 --- a/archive-doc-gen/.github/workflows/stale-bot.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: "Manage Stale Issues, PRs & Unmerged Branches" -on: - schedule: - - cron: '30 1 * * *' # Runs daily at 1:30 AM UTC - workflow_dispatch: # Allows manual triggering -permissions: - contents: write - issues: write - pull-requests: write -jobs: - stale: - runs-on: ubuntu-latest - steps: - - name: Mark Stale Issues and PRs - uses: actions/stale@v10 - with: - stale-issue-message: "This issue is stale because it has been open 180 days with no activity. Remove stale label or comment, or it will be closed in 30 days." - stale-pr-message: "This PR is stale because it has been open 180 days with no activity. Please update or it will be closed in 30 days." - days-before-stale: 180 - days-before-close: 30 - exempt-issue-labels: "keep" - exempt-pr-labels: "keep" - cleanup-branches: - runs-on: ubuntu-latest - steps: - - name: Checkout Repository - uses: actions/checkout@v6 - with: - fetch-depth: 0 # Fetch full history for accurate branch checks - - name: Fetch All Branches - run: git fetch --all --prune - - name: List Merged Branches With No Activity in Last 3 Months - run: | - - echo "Branch Name,Last Commit Date,Committer,Committed In Branch,Action" > merged_branches_report.csv - - for branch in $(git for-each-ref --format '%(refname:short) %(committerdate:unix)' refs/remotes/origin | awk -v date=$(date -d '3 months ago' +%s) '$2 < date {print $1}'); do - if [[ "$branch" != "origin/main" && "$branch" != "origin/dev" ]]; then - branch_name=${branch#origin/} - # Ensure the branch exists locally before getting last commit date - git fetch origin "$branch_name" || echo "Could not fetch branch: $branch_name" - last_commit_date=$(git log -1 --format=%ci "origin/$branch_name" || echo "Unknown") - committer_name=$(git log -1 --format=%cn "origin/$branch_name" || echo "Unknown") - committed_in_branch=$(git branch -r --contains "origin/$branch_name" | tr -d ' ' | paste -sd "," -) - echo "$branch_name,$last_commit_date,$committer_name,$committed_in_branch,Delete" >> merged_branches_report.csv - fi - done - - name: List PR Approved and Merged Branches Older Than 30 Days - run: | - - for branch in $(gh api repos/${{ github.repository }}/pulls --jq '.[] | select(.merged_at != null and (.base.ref == "main" or .base.ref == "dev")) | select(.merged_at | fromdateiso8601 < (now - 2592000)) | .head.ref'); do - # Ensure the branch exists locally before getting last commit date - git fetch origin "$branch" || echo "Could not fetch branch: $branch" - last_commit_date=$(git log -1 --format=%ci origin/$branch || echo "Unknown") - committer_name=$(git log -1 --format=%cn origin/$branch || echo "Unknown") - committed_in_branch=$(git branch -r --contains "origin/$branch" | tr -d ' ' | paste -sd "," -) - echo "$branch,$last_commit_date,$committer_name,$committed_in_branch,Delete" >> merged_branches_report.csv - done - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: List Open PR Branches With No Activity in Last 3 Months - run: | - - for branch in $(gh api repos/${{ github.repository }}/pulls --state open --jq '.[] | select(.base.ref == "main" or .base.ref == "dev") | .head.ref'); do - # Ensure the branch exists locally before getting last commit date - git fetch origin "$branch" || echo "Could not fetch branch: $branch" - last_commit_date=$(git log -1 --format=%ci origin/$branch || echo "Unknown") - committer_name=$(git log -1 --format=%cn origin/$branch || echo "Unknown") - if [[ $(date -d "$last_commit_date" +%s) -lt $(date -d '3 months ago' +%s) ]]; then - # If no commit in the last 3 months, mark for deletion - committed_in_branch=$(git branch -r --contains "origin/$branch" | tr -d ' ' | paste -sd "," -) - echo "$branch,$last_commit_date,$committer_name,$committed_in_branch,Delete" >> merged_branches_report.csv - fi - done - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Upload CSV Report of Inactive Branches - uses: actions/upload-artifact@v6 - with: - name: merged-branches-report - path: merged_branches_report.csv - retention-days: 30 diff --git a/archive-doc-gen/.github/workflows/telemetry-template-check.yml b/archive-doc-gen/.github/workflows/telemetry-template-check.yml deleted file mode 100644 index 9b12879c1..000000000 --- a/archive-doc-gen/.github/workflows/telemetry-template-check.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: validate template property for telemetry - -on: - pull_request: - branches: - - main - paths: - - 'azure.yaml' - -jobs: - validate-template-property: - name: validate-template-property - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v6 - - - name: Check for required metadata template line - run: | - if grep -E '^\s*#\s*template:\s*document-generation@1\.0' azure.yaml; then - echo "ERROR: 'template' line is commented out in azure.yaml! Please uncomment template line." - exit 1 - fi - - if ! grep -E '^\s*template:\s*document-generation@1\.0' azure.yaml; then - echo "ERROR: Required 'template' line is missing in azure.yaml! Please add template line for telemetry." - exit 1 - fi - echo "template line is present and not commented." \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/test-automation-v2.yml b/archive-doc-gen/.github/workflows/test-automation-v2.yml deleted file mode 100644 index 637a79fa6..000000000 --- a/archive-doc-gen/.github/workflows/test-automation-v2.yml +++ /dev/null @@ -1,196 +0,0 @@ -name: Test Automation DocGen-v2 - -on: - workflow_call: - inputs: - DOCGEN_URL: - required: true - type: string - description: "Web URL for DocGen" - TEST_SUITE: - required: false - type: string - default: "GoldenPath-Testing" - description: "Test suite to run: 'Smoke-Testing', 'GoldenPath-Testing' " - outputs: - TEST_SUCCESS: - description: "Whether tests passed" - value: ${{ jobs.test.outputs.TEST_SUCCESS }} - TEST_REPORT_URL: - description: "URL to test report artifact" - value: ${{ jobs.test.outputs.TEST_REPORT_URL }} - -env: - url: ${{ inputs.DOCGEN_URL }} - accelerator_name: "DocGen" - test_suite: ${{ inputs.TEST_SUITE }} -permissions: - contents: read - actions: read - -jobs: - test: - runs-on: ubuntu-latest - outputs: - TEST_SUCCESS: ${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }} - TEST_REPORT_URL: ${{ steps.upload_report.outputs.artifact-url }} - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.13' - - - name: Login to Azure - run: | - az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }} - az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r tests/e2e-test/requirements.txt - - - name: Ensure browsers are installed - run: python -m playwright install --with-deps chromium - - - name: Validate URL - run: | - if [ -z "${{ env.url }}" ]; then - echo "ERROR: No URL provided for testing" - exit 1 - fi - echo "Testing URL: ${{ env.url }}" - echo "Test Suite: ${{ env.test_suite }}" - - - - name: Wait for Application to be Ready - run: | - echo "Waiting for application to be ready at ${{ env.url }} " - max_attempts=10 - attempt=1 - - while [ $attempt -le $max_attempts ]; do - echo "Attempt $attempt: Checking if application is ready..." - if curl -f -s "${{ env.url }}" > /dev/null; then - echo "Application is ready!" - break - - fi - - if [ $attempt -eq $max_attempts ]; then - echo "Application is not ready after $max_attempts attempts" - exit 1 - fi - - echo "Application not ready, waiting 30 seconds..." - sleep 30 - attempt=$((attempt + 1)) - done - - - name: Run tests(1) - id: test1 - run: | - if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then - xvfb-run pytest -m goldenpath --html=report/report.html --self-contained-html - else - xvfb-run pytest --html=report/report.html --self-contained-html - fi - working-directory: tests/e2e-test - continue-on-error: true - - - name: Sleep for 30 seconds - if: ${{ steps.test1.outcome == 'failure' }} - run: sleep 30s - shell: bash - - - name: Run tests(2) - id: test2 - if: ${{ steps.test1.outcome == 'failure' }} - run: | - if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then - xvfb-run pytest -m goldenpath --html=report/report.html --self-contained-html - else - xvfb-run pytest --html=report/report.html --self-contained-html - fi - working-directory: tests/e2e-test - continue-on-error: true - - - name: Sleep for 60 seconds - if: ${{ steps.test2.outcome == 'failure' }} - run: sleep 60s - shell: bash - - - name: Run tests(3) - id: test3 - if: ${{ steps.test2.outcome == 'failure' }} - run: | - if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then - xvfb-run pytest -m goldenpath --html=report/report.html --self-contained-html - else - xvfb-run pytest --html=report/report.html --self-contained-html - fi - working-directory: tests/e2e-test - - - name: Upload test report - id: upload_report - uses: actions/upload-artifact@v4 - if: ${{ !cancelled() }} - with: - name: test-report - path: | - tests/e2e-test/report/* - tests/e2e-test/screenshots/* - - - name: Generate E2E Test Summary - if: always() - run: | - # Determine test suite type for title - if [ "${{ env.test_suite }}" == "GoldenPath-Testing" ]; then - echo "## 🧪 E2E Test Job Summary : Golden Path Testing" >> $GITHUB_STEP_SUMMARY - else - echo "## 🧪 E2E Test Job Summary : Smoke Testing" >> $GITHUB_STEP_SUMMARY - fi - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - - # Determine overall test result - OVERALL_SUCCESS="${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }}" - if [[ "$OVERALL_SUCCESS" == "true" ]]; then - echo "| **Job Status** | ✅ Success |" >> $GITHUB_STEP_SUMMARY - else - echo "| **Job Status** | ❌ Failed |" >> $GITHUB_STEP_SUMMARY - fi - - echo "| **Target URL** | [${{ env.url }}](${{ env.url }}) |" >> $GITHUB_STEP_SUMMARY - echo "| **Test Suite** | \`${{ env.test_suite }}\` |" >> $GITHUB_STEP_SUMMARY - echo "| **Test Report** | [Download Artifact](${{ steps.upload_report.outputs.artifact-url }}) |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - echo "### 📋 Test Execution Details" >> $GITHUB_STEP_SUMMARY - echo "| Attempt | Status | Notes |" >> $GITHUB_STEP_SUMMARY - echo "|---------|--------|-------|" >> $GITHUB_STEP_SUMMARY - echo "| **Test Run 1** | ${{ steps.test1.outcome == 'success' && '✅ Passed' || '❌ Failed' }} | Initial test execution |" >> $GITHUB_STEP_SUMMARY - - if [[ "${{ steps.test1.outcome }}" == "failure" ]]; then - echo "| **Test Run 2** | ${{ steps.test2.outcome == 'success' && '✅ Passed' || steps.test2.outcome == 'failure' && '❌ Failed' || '⏸️ Skipped' }} | Retry after 30s delay |" >> $GITHUB_STEP_SUMMARY - fi - - if [[ "${{ steps.test2.outcome }}" == "failure" ]]; then - echo "| **Test Run 3** | ${{ steps.test3.outcome == 'success' && '✅ Passed' || steps.test3.outcome == 'failure' && '❌ Failed' || '⏸️ Skipped' }} | Final retry after 60s delay |" >> $GITHUB_STEP_SUMMARY - fi - - echo "" >> $GITHUB_STEP_SUMMARY - - if [[ "$OVERALL_SUCCESS" == "true" ]]; then - echo "### ✅ Test Results" >> $GITHUB_STEP_SUMMARY - echo "- End-to-end tests completed successfully" >> $GITHUB_STEP_SUMMARY - echo "- Application is functioning as expected" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Test Results" >> $GITHUB_STEP_SUMMARY - echo "- All test attempts failed" >> $GITHUB_STEP_SUMMARY - echo "- Check the e2e-test/test job for detailed error information" >> $GITHUB_STEP_SUMMARY - fi \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/test-automation.yml b/archive-doc-gen/.github/workflows/test-automation.yml deleted file mode 100644 index f2b5049ea..000000000 --- a/archive-doc-gen/.github/workflows/test-automation.yml +++ /dev/null @@ -1,146 +0,0 @@ -name: Test Automation DocGen - -on: - workflow_call: - inputs: - DOCGEN_URL: - required: true - type: string - description: "Web URL for DocGen" - secrets: - EMAILNOTIFICATION_LOGICAPP_URL_TA: - required: false - description: "Logic App URL for email notifications" - outputs: - TEST_SUCCESS: - description: "Whether tests passed" - value: ${{ jobs.test.outputs.TEST_SUCCESS }} - TEST_REPORT_URL: - description: "URL to test report artifact" - value: ${{ jobs.test.outputs.TEST_REPORT_URL }} - -env: - url: ${{ inputs.DOCGEN_URL }} - accelerator_name: "DocGen" -permissions: - contents: read - actions: read - -jobs: - test: - runs-on: ubuntu-latest - outputs: - TEST_SUCCESS: ${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }} - TEST_REPORT_URL: ${{ steps.upload_report.outputs.artifact-url }} - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.13' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r tests/e2e-test/requirements.txt - - - name: Ensure browsers are installed - run: python -m playwright install --with-deps chromium - - - name: Open URL - run: | - echo "Opening URL: ${{ env.url }}" - python -m webbrowser "${{ env.url }}" - - - name: Sleep for 30 seconds - run: sleep 30s - shell: bash - - - name: Run tests(1) - id: test1 - run: | - xvfb-run pytest --headed --html=report/report.html --self-contained-html - working-directory: tests/e2e-test - continue-on-error: true - - - name: Sleep for 30 seconds - if: ${{ steps.test1.outcome == 'failure' }} - run: sleep 30s - shell: bash - - - name: Run tests(2) - if: ${{ steps.test1.outcome == 'failure' }} - id: test2 - run: | - xvfb-run pytest --headed --html=report/report.html --self-contained-html - working-directory: tests/e2e-test - continue-on-error: true - - - name: Sleep for 60 seconds - if: ${{ steps.test2.outcome == 'failure' }} - run: sleep 60s - shell: bash - - - name: Run tests(3) - if: ${{ steps.test2.outcome == 'failure' }} - id: test3 - run: | - xvfb-run pytest --headed --html=report/report.html --self-contained-html - working-directory: tests/e2e-test - - - name: Upload test report - id: upload_report - uses: actions/upload-artifact@v6 - if: ${{ !cancelled() }} - with: - name: test-report - path: tests/e2e-test/report/* - - - - - name: Generate E2E Test Summary - if: always() - run: | - echo "## 🧪 E2E Test Job Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY - echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY - - # Determine overall test result - OVERALL_SUCCESS="${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }}" - if [[ "$OVERALL_SUCCESS" == "true" ]]; then - echo "| **Job Status** | ✅ Success |" >> $GITHUB_STEP_SUMMARY - else - echo "| **Job Status** | ❌ Failed |" >> $GITHUB_STEP_SUMMARY - fi - - echo "| **Target URL** | [${{ env.url }}](${{ env.url }}) |" >> $GITHUB_STEP_SUMMARY - echo "| **Test Report** | [Download Artifact](${{ steps.upload_report.outputs.artifact-url }}) |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - - echo "### 📋 Test Execution Details" >> $GITHUB_STEP_SUMMARY - echo "| Attempt | Status | Notes |" >> $GITHUB_STEP_SUMMARY - echo "|---------|--------|-------|" >> $GITHUB_STEP_SUMMARY - echo "| **Test Run 1** | ${{ steps.test1.outcome == 'success' && '✅ Passed' || '❌ Failed' }} | Initial test execution |" >> $GITHUB_STEP_SUMMARY - - if [[ "${{ steps.test1.outcome }}" == "failure" ]]; then - echo "| **Test Run 2** | ${{ steps.test2.outcome == 'success' && '✅ Passed' || steps.test2.outcome == 'failure' && '❌ Failed' || '⏸️ Skipped' }} | Retry after 30s delay |" >> $GITHUB_STEP_SUMMARY - fi - - if [[ "${{ steps.test2.outcome }}" == "failure" ]]; then - echo "| **Test Run 3** | ${{ steps.test3.outcome == 'success' && '✅ Passed' || steps.test3.outcome == 'failure' && '❌ Failed' || '⏸️ Skipped' }} | Final retry after 60s delay |" >> $GITHUB_STEP_SUMMARY - fi - - echo "" >> $GITHUB_STEP_SUMMARY - - if [[ "$OVERALL_SUCCESS" == "true" ]]; then - echo "### ✅ Test Results" >> $GITHUB_STEP_SUMMARY - echo "- End-to-end tests completed successfully" >> $GITHUB_STEP_SUMMARY - echo "- Application is functioning as expected" >> $GITHUB_STEP_SUMMARY - else - echo "### ❌ Test Results" >> $GITHUB_STEP_SUMMARY - echo "- All test attempts failed" >> $GITHUB_STEP_SUMMARY - echo "- Check the e2e-test/test job for detailed error information" >> $GITHUB_STEP_SUMMARY - fi \ No newline at end of file diff --git a/archive-doc-gen/.github/workflows/tests.yml b/archive-doc-gen/.github/workflows/tests.yml deleted file mode 100644 index a4dc5ad07..000000000 --- a/archive-doc-gen/.github/workflows/tests.yml +++ /dev/null @@ -1,131 +0,0 @@ -name: Test Workflow with Coverage - -on: - push: - branches: - - main # Trigger on push to the main branch - - dev - paths: - - 'src/**/*.py' - - 'src/requirements*.txt' - - 'src/frontend/**/*.ts' - - 'src/frontend/**/*.tsx' - - 'src/frontend/**/*.js' - - 'src/frontend/**/*.jsx' - - 'src/frontend/**/*.json' - - '.github/workflows/tests.yml' - pull_request: - branches: - - main # Trigger on pull requests to the main branch - - dev - types: - - opened - - ready_for_review - - reopened - - synchronize - paths: - - 'src/**/*.py' - - 'src/requirements*.txt' - - 'src/frontend/**/*.ts' - - 'src/frontend/**/*.tsx' - - 'src/frontend/**/*.js' - - 'src/frontend/**/*.jsx' - - 'src/frontend/**/*.json' - - '.github/workflows/tests.yml' - -jobs: - backend_tests: - name: Backend Tests - runs-on: ubuntu-latest # Use the latest Ubuntu runner - - steps: - - uses: actions/checkout@v6 # Checkout the repository - - # Set up Python environment for Backend - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: "3.11" # Set Python version - - - name: Install Backend Dependencies - run: | - python -m pip install -r src/requirements.txt - python -m pip install coverage pytest-cov - python -m pip install azure-keyvault-secrets - - - name: Run Backend Tests with Coverage - run: | - if python -m pytest --cov=. --cov-report=xml --cov-report=html --cov-report=term-missing --junitxml=coverage-junit.xml ./src/tests; then - echo "Tests completed, checking coverage." - # Only fail if coverage does not meet criteria - if [ -f coverage.xml ]; then - COVERAGE=$(python -c "import xml.etree.ElementTree as ET; tree = ET.parse('coverage.xml'); root = tree.getroot(); coverage = root.find('coverage').get('lines').split('%')[0]; print(float(coverage))") - if (( $(echo "$COVERAGE < 80" | bc -l) )); then - echo "Coverage is below 80%, failing the job." - exit 1 - fi - fi - else - echo "No tests found, skipping coverage check." - fi - - - uses: actions/upload-artifact@v6 - with: - name: backend-coverage - path: | - coverage.xml # Correct path to backend coverage - coverage-junit.xml # Correct path to backend JUnit report - htmlcov/ # Correct path to backend HTML coverage report - - frontend_tests: - name: Frontend Tests - runs-on: ubuntu-latest # Use the latest Ubuntu runner - - steps: - - uses: actions/checkout@v6 # Checkout the repository - - # Set up Node.js environment for Frontend - - name: Set up Node.js - uses: actions/setup-node@v6 - with: - node-version: '20' # Set the Node.js version - - - name: Cache npm dependencies - uses: actions/cache@v5 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Navigate to frontend directory - run: cd src/frontend - - - name: Install Frontend Dependencies - run: | - cd src/frontend # Change to the frontend directory - npm install # Install dependencies from frontend/package.json - - - name: Run Frontend Tests with Coverage - run: | - cd src/frontend # Change to the frontend directory - if npm run test -- --coverage; then - echo "Tests completed, checking coverage." - # Check coverage report and ensure it meets threshold - if [ -f src/frontend/coverage/lcov-report/index.html ]; then - COVERAGE=$(cat src/frontend/coverage/lcov-report/index.html | grep -oP 'total: \K[0-9]+(\.[0-9]+)?') - if (( $(echo "$COVERAGE < 80" | bc -l) )); then - echo "Coverage is below 80%, failing the job." - exit 1 - fi - fi - else - echo "No tests found, skipping coverage check." - fi - - - uses: actions/upload-artifact@v6 - with: - name: frontend-coverage - path: | - src/frontend/coverage/ # Correct path to frontend coverage - src/frontend/coverage/lcov-report/ # Correct path to frontend lcov report \ No newline at end of file diff --git a/archive-doc-gen/.gitignore b/archive-doc-gen/.gitignore deleted file mode 100644 index 0abb7a034..000000000 --- a/archive-doc-gen/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -.venv - -.env -.azure/ -__pycache__/ -.ipynb_checkpoints/ - - -venv -myenv - -scriptsenv/ - -scriptenv -pdf \ No newline at end of file diff --git a/archive-doc-gen/.vscode/launch.json b/archive-doc-gen/.vscode/launch.json deleted file mode 100644 index d184e8ac0..000000000 --- a/archive-doc-gen/.vscode/launch.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Python: Sample App Backend", - "type": "python", - "request": "launch", - "module": "quart", - "cwd": "${workspaceFolder}/src", - "env": { - "QUART_APP": "app:app", - "QUART_ENV": "development", - "QUART_DEBUG": "0" - }, - "args": [ - "run", - "--no-reload", - "-p 50505" - ], - "console": "integratedTerminal", - "justMyCode": false - }, - { - "type": "chrome", - "request": "launch", - "name": "Frontend: Launch Chrome debugger", - "url": "http://127.0.0.1:50505", - "webRoot": "${workspaceFolder}/frontend", - "smartStep": true - } - ] - } \ No newline at end of file diff --git a/archive-doc-gen/.vscode/settings.json b/archive-doc-gen/.vscode/settings.json deleted file mode 100644 index 9e26dfeeb..000000000 --- a/archive-doc-gen/.vscode/settings.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/archive-doc-gen/CODE_OF_CONDUCT.md b/archive-doc-gen/CODE_OF_CONDUCT.md deleted file mode 100644 index f9ba8cf65..000000000 --- a/archive-doc-gen/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,9 +0,0 @@ -# Microsoft Open Source Code of Conduct - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). - -Resources: - -- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) -- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns diff --git a/archive-doc-gen/CONTRIBUTING.md b/archive-doc-gen/CONTRIBUTING.md deleted file mode 100644 index c282e9a1a..000000000 --- a/archive-doc-gen/CONTRIBUTING.md +++ /dev/null @@ -1,14 +0,0 @@ -# Contributing - -This project welcomes contributions and suggestions. Most contributions require you to -agree to a Contributor License Agreement (CLA) declaring that you have the right to, -and actually do, grant us the rights to use your contribution. For details, visit -https://cla.microsoft.com. - -When you submit a pull request, a CLA-bot will automatically determine whether you need -to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the -instructions provided by the bot. You will only need to do this once across all repositories using our CLA. - -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) -or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file diff --git a/archive-doc-gen/LICENSE b/archive-doc-gen/LICENSE deleted file mode 100644 index 9e841e7a2..000000000 --- a/archive-doc-gen/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE diff --git a/archive-doc-gen/README.md b/archive-doc-gen/README.md deleted file mode 100644 index 4db342838..000000000 --- a/archive-doc-gen/README.md +++ /dev/null @@ -1,228 +0,0 @@ -# Document generation solution accelerator - -This solution accelerator is a powerful tool that helps you create your own AI assistant for document generation. The accelerator can be used by any customer looking for reusable architecture and code snippets to build an AI assistant to generate a sample template and content grounded on their own enterprise data. - -This example focuses on a generic use case - chat with your own data, generate a document template using your own data, and exporting the document in a docx format. - -
- -
- -[**SOLUTION OVERVIEW**](#solution-overview) \| [**QUICK DEPLOY**](#quick-deploy) \| [**BUSINESS SCENARIO**](#business-scenario) \| [**SUPPORTING DOCUMENTATION**](#supporting-documentation) - -
-
- -**Note:** With any AI solutions you create using these templates, you are responsible for assessing all associated risks and for complying with all applicable laws and safety standards. Learn more in the transparency documents for [Agent Service](https://learn.microsoft.com/en-us/azure/ai-foundry/responsible-ai/agents/transparency-note) and [Agent Framework](https://github.com/microsoft/agent-framework/blob/main/TRANSPARENCY_FAQ.md). -
- -

-Solution overview -

- -It leverages Azure OpenAI Service and Azure AI Search, to identify relevant documents, summarize unstructured information, and generate document templates. - -The sample data is sourced from generic AI-generated promissory notes. The documents are intended for use as sample data only. - -### Solution architecture -|![image](./docs/images/DocGen_Azure_AI_Foundry_Architecture.png)| -|---| - - -
- -### Additional resources - -[Azure OpenAI Service](https://learn.microsoft.com/en-us/azure/ai-services/openai/) - -[Azure AI Search](https://learn.microsoft.com/en-us/azure/search/) - -[Azure AI Foundry](https://learn.microsoft.com/en-us/azure/ai-studio/) - - -
- -### Key features -
- Click to learn more about the key features this solution enables - - - **Semantic search**
- Azure AI Search to enable RAG and grounding of the application on the processed dataset.​ - - - **Summarization**
- Azure OpenAI Service and GPT models to help summarize the search content and answer questions.​ - - - **Content generation**
- Azure OpenAI Service and GPT models to help generate relevant content with Prompt Flow.​ - -
- - - -

-

-Quick deploy -

- -### How to install or deploy -Follow the quick deploy steps on the deployment guide to deploy this solution to your own Azure subscription. - -> **Note:** This solution accelerator requires **Azure Developer CLI (azd) version 1.18.0 or higher**. Please ensure you have the latest version installed before proceeding with deployment. [Download azd here](https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/install-azd). - -[Click here to launch the deployment guide](./docs/DeploymentGuide.md) -

- -**For Local Development** -- [Local Development Setup Guide](docs/LocalDevelopmentSetup.md) - Comprehensive setup instructions for Windows, Linux, and macOS - -| [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/microsoft/document-generation-solution-accelerator) | [![Open in Dev Containers](https://img.shields.io/static/v1?style=for-the-badge&label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/microsoft/document-generation-solution-accelerator) | [![Open in Visual Studio Code Web](https://img.shields.io/static/v1?style=for-the-badge&label=Visual%20Studio%20Code%20(Web)&message=Open&color=blue&logo=visualstudiocode&logoColor=white)](https://vscode.dev/azure/?vscode-azure-exp=foundry&agentPayload=eyJiYXNlVXJsIjogImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taWNyb3NvZnQvZG9jdW1lbnQtZ2VuZXJhdGlvbi1zb2x1dGlvbi1hY2NlbGVyYXRvci9yZWZzL2hlYWRzL21haW4vaW5mcmEvdnNjb2RlX3dlYiIsICJpbmRleFVybCI6ICIvaW5kZXguanNvbiIsICJ2YXJpYWJsZXMiOiB7ImFnZW50SWQiOiAiIiwgImNvbm5lY3Rpb25TdHJpbmciOiAiIiwgInRocmVhZElkIjogIiIsICJ1c2VyTWVzc2FnZSI6ICIiLCAicGxheWdyb3VuZE5hbWUiOiAiIiwgImxvY2F0aW9uIjogIiIsICJzdWJzY3JpcHRpb25JZCI6ICIiLCAicmVzb3VyY2VJZCI6ICIiLCAicHJvamVjdFJlc291cmNlSWQiOiAiIiwgImVuZHBvaW50IjogIiJ9LCAiY29kZVJvdXRlIjogWyJhaS1wcm9qZWN0cy1zZGsiLCAicHl0aG9uIiwgImRlZmF1bHQtYXp1cmUtYXV0aCIsICJlbmRwb2ludCJdfQ==) | -|---|---|---| - -
- -> ⚠️ **Important: Check Azure OpenAI Quota Availability** -
To ensure sufficient quota is available in your subscription, please follow [quota check instructions guide](./docs/QuotaCheck.md) before you deploy the solution. - -
- -### Prerequisites and costs - -To deploy this solution accelerator, ensure you have access to an [Azure subscription](https://azure.microsoft.com/free/) with the necessary permissions to create **resource groups, resources, app registrations, and assign roles at the resource group level**. This should include Contributor role at the subscription level and Role Based Access Control role on the subscription and/or resource group level. Follow the steps in [Azure Account Set Up](./docs/AzureAccountSetUp.md). - -Check the [Azure Products by Region](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/?products=all®ions=all) page and select a **region** where the following services are available. - -Pricing varies per region and usage, so it isn't possible to predict exact costs for your usage. The majority of the Azure resources used in this infrastructure are on usage-based pricing tiers. However, Azure Container Registry has a fixed cost per registry per day. - -Use the [Azure pricing calculator](https://azure.microsoft.com/en-us/pricing/calculator) to calculate the cost of this solution in your subscription. - -Review a [sample pricing sheet](https://azure.com/e/2402502429fc46429e395e0bb93d0711) in the event you want to customize and scale usage. - -_Note: This is not meant to outline all costs as selected SKUs, scaled use, customizations, and integrations into your own tenant can affect the total consumption of this sample solution. The sample pricing sheet is meant to give you a starting point to customize the estimate for your specific needs._ - -
- -| Product | Description | Cost | -|---|---|---| -| [Azure AI Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/) | Free tier. Build generative AI applications on an enterprise-grade platform. | [Pricing](https://azure.microsoft.com/pricing/details/ai-studio/) | -| [Azure AI Search](https://learn.microsoft.com/en-us/azure/search/) | Standard tier, S1. Pricing is based on the number of documents and operations. Information retrieval at scale for vector and text content in traditional or generative search scenarios. | [Pricing](https://azure.microsoft.com/pricing/details/search/) | -| [Azure Storage Account](https://learn.microsoft.com/en-us/azure/storage/blobs/) | Standard tier, LRS. Pricing is based on storage and operations. Blob storage in the clopud, optimized for storing massive amounts of unstructured data. | [Pricing](https://azure.microsoft.com/pricing/details/storage/blobs/) | -| [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/) | Standard tier. Pricing is based on the number of operations. Maintain keys that access and encrypt your cloud resources, apps, and solutions. | [Pricing](https://azure.microsoft.com/pricing/details/key-vault/) | -| [Azure AI Services](https://learn.microsoft.com/en-us/azure/ai-services/) | S0 tier, defaults to gpt-4.1 and text-embedding-ada-002 models. Pricing is based on token count. | [Pricing](https://azure.microsoft.com/pricing/details/cognitive-services/) | -| [Azure Container App](https://learn.microsoft.com/en-us/azure/container-apps/) | Consumption tier with 0.5 CPU, 1GiB memory/storage. Pricing is based on resource allocation, and each month allows for a certain amount of free usage. Allows you to run containerized applications without worrying about orchestration or infrastructure. | [Pricing](https://azure.microsoft.com/pricing/details/container-apps/) | -| [Azure Container Registry](https://learn.microsoft.com/en-us/azure/container-registry/) | Basic tier. Build, store, and manage container images and artifacts in a private registry for all types of container deployments | [Pricing](https://azure.microsoft.com/pricing/details/container-registry/) | -| [Log analytics](https://learn.microsoft.com/en-us/azure/azure-monitor/) | Pay-as-you-go tier. Costs based on data ingested. Collect and analyze on telemetry data generated by Azure. | [Pricing](https://azure.microsoft.com/pricing/details/monitor/) | -| [Azure Cosmos DB](https://learn.microsoft.com/en-us/azure/cosmos-db/) | Fully managed, distributed NoSQL, relational, and vector database for modern app development. | [Pricing](https://azure.microsoft.com/en-us/pricing/details/cosmos-db/autoscale-provisioned/) | - - - -
- ->⚠️ **Important:** To avoid unnecessary costs, remember to take down your app if it's no longer in use, -either by deleting the resource group in the Portal or running `azd down`. - -

-

-Business Scenario -

- - -|![image](./docs/images/landing_page.png)| -|---| - -
- -Put your data to work by reducing blank page anxiety, speeding up document drafting, improving draft document quality, and reference information quickly - keeping experts in their expertise. Draft document templates for your organization including Invoices, End-user Contracts, Purchase Orders, Investment Proposals, and Grant Submissions. - -⚠️ The sample data used in this repository is synthetic and generated using Azure OpenAI Service. The data is intended for use as sample data only. - - -### Business value -
- Click to learn more about what value this solution provides - - - **Draft templates quickly**
- Put your data to work to create any kind of document that is supported by a large data library. - - - **Share**
- Share with co-authors, contributors and approvers quickly. - - - **Contextualize information**
- Provide context using natural language. Primary and secondary queries allow for access to supplemental detail – reducing cognitive load, increasing efficiency, and enabling focus on higher value work. - - - **Gain confidence in responses**
- Trust responses to queries by customizing how data is referenced and returned to users, reducing the risk of hallucinated responses.

Access reference documents in the same chat window to get more detail and confirm accuracy. - - - **Secure data and responsible AI for innovation**
- Improve data security to minimize breaches, fostering a culture of responsible AI adoption, maximize innovation opportunities, and sustain competitive edge. - - -
- -

- -

-Supporting documentation -

- -### Security guidelines - -This template uses Azure Key Vault to store all connections to communicate between resources. - -This template also uses [Managed Identity](https://learn.microsoft.com/entra/identity/managed-identities-azure-resources/overview) for local development and deployment. - -To ensure continued best practices in your own repository, we recommend that anyone creating solutions based on our templates ensure that the [Github secret scanning](https://docs.github.com/code-security/secret-scanning/about-secret-scanning) setting is enabled. - -You may want to consider additional security measures, such as: - -* Enabling Microsoft Defender for Cloud to [secure your Azure resources](https://learn.microsoft.com/azure/defender-for-cloud). -* Protecting the Azure Container Apps instance with a [firewall](https://learn.microsoft.com/azure/container-apps/waf-app-gateway) and/or [Virtual Network](https://learn.microsoft.com/azure/container-apps/networking?tabs=workload-profiles-env%2Cazure-cli). - -
- -### Cross references -Check out similar solution accelerators - -| Solution Accelerator | Description | -|---|---| -| [Chat with your data](https://github.com/Azure-Samples/chat-with-your-data-solution-accelerator) | Chat with their own data by combining Azure Cognitive Search and Large Language Models (LLMs) to create a conversational search experience. It enables increased user efficiency by minimizing endpoints required to access internal company knowledgebases. | -| [Document knowledge mining](https://github.com/microsoft/Document-Knowledge-Mining-Solution-Accelerator) | Built on Azure OpenAI Service and Azure AI Document Intelligence to process and extract summaries, entities, and metadata from unstructured, multi-modal documents and enable searching and chatting over this data. | -| [Build your own copilot](https://github.com/microsoft/Build-your-own-copilot-Solution-Accelerator) | Helps client advisors to save time and prepare relevant discussion topics for scheduled meetings with overviews, client profile views, and chatting with structured data. | - - -
- - -## Provide feedback - -Have questions, find a bug, or want to request a feature? [Submit a new issue](https://github.com/microsoft/document-generation-solution-accelerator/issues) on this repo and we'll connect. - -
- -## Responsible AI Transparency FAQ -Please refer to [Transparency FAQ](./docs/TRANSPARENCY_FAQ.md) for responsible AI transparency details of this solution accelerator. - -
- -## Disclaimers - -This release is an artificial intelligence (AI) system that generates text based on user input. The text generated by this system may include ungrounded content, meaning that it is not verified by any reliable source or based on any factual data. The data included in this release is synthetic, meaning that it is artificially created by the system and may contain factual errors or inconsistencies. Users of this release are responsible for determining the accuracy, validity, and suitability of any content generated by the system for their intended purposes. Users should not rely on the system output as a source of truth or as a substitute for human judgment or expertise. - -This release only supports English language input and output. Users should not attempt to use the system with any other language or format. The system output may not be compatible with any translation tools or services, and may lose its meaning or coherence if translated. - -This release does not reflect the opinions, views, or values of Microsoft Corporation or any of its affiliates, subsidiaries, or partners. The system output is solely based on the system's own logic and algorithms, and does not represent any endorsement, recommendation, or advice from Microsoft or any other entity. Microsoft disclaims any liability or responsibility for any damages, losses, or harms arising from the use of this release or its output by any user or third party. - -This release does not provide any financial advice, and is not designed to replace the role of qualified client advisors in appropriately advising clients. Users should not use the system output for any financial decisions or transactions, and should consult with a professional financial advisor before taking any action based on the system output. Microsoft is not a financial institution or a fiduciary, and does not offer any financial products or services through this release or its output. - -This release is intended as a proof of concept only, and is not a finished or polished product. It is not intended for commercial use or distribution, and is subject to change or discontinuation without notice. Any planned deployment of this release or its output should include comprehensive testing and evaluation to ensure it is fit for purpose and meets the user's requirements and expectations. Microsoft does not guarantee the quality, performance, reliability, or availability of this release or its output, and does not provide any warranty or support for it. - -This Software requires the use of third-party components which are governed by separate proprietary or open-source licenses as identified below, and you must comply with the terms of each applicable license in order to use the Software. You acknowledge and agree that this license does not grant you a license or other right to use any such third-party proprietary or open-source components. - -To the extent that the Software includes components or code used in or derived from Microsoft products or services, including without limitation Microsoft Azure Services (collectively, “Microsoft Products and Services”), you must also comply with the Product Terms applicable to such Microsoft Products and Services. You acknowledge and agree that the license governing the Software does not grant you a license or other right to use Microsoft Products and Services. Nothing in the license or this ReadMe file will serve to supersede, amend, terminate or modify any terms in the Product Terms for any Microsoft Products and Services. - -You must also comply with all domestic and international export laws and regulations that apply to the Software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit https://aka.ms/exporting. - -You acknowledge that the Software and Microsoft Products and Services (1) are not designed, intended or made available as a medical device(s), and (2) are not designed or intended to be a substitute for professional medical advice, diagnosis, treatment, or judgment and should not be used to replace or as a substitute for professional medical advice, diagnosis, treatment, or judgment. Customer is solely responsible for displaying and/or obtaining appropriate consents, warnings, disclaimers, and acknowledgements to end users of Customer’s implementation of the Online Services. - -You acknowledge the Software is not subject to SOC 1 and SOC 2 compliance audits. No Microsoft technology, nor any of its component technologies, including the Software, is intended or made available as a substitute for the professional advice, opinion, or judgment of a certified financial services professional. Do not use the Software to replace, substitute, or provide professional financial advice or judgment. - -BY ACCESSING OR USING THE SOFTWARE, YOU ACKNOWLEDGE THAT THE SOFTWARE IS NOT DESIGNED OR INTENDED TO SUPPORT ANY USE IN WHICH A SERVICE INTERRUPTION, DEFECT, ERROR, OR OTHER FAILURE OF THE SOFTWARE COULD RESULT IN THE DEATH OR SERIOUS BODILY INJURY OF ANY PERSON OR IN PHYSICAL OR ENVIRONMENTAL DAMAGE (COLLECTIVELY, “HIGH-RISK USE”), AND THAT YOU WILL ENSURE THAT, IN THE EVENT OF ANY INTERRUPTION, DEFECT, ERROR, OR OTHER FAILURE OF THE SOFTWARE, THE SAFETY OF PEOPLE, PROPERTY, AND THE ENVIRONMENT ARE NOT REDUCED BELOW A LEVEL THAT IS REASONABLY, APPROPRIATE, AND LEGAL, WHETHER IN GENERAL OR IN A SPECIFIC INDUSTRY. BY ACCESSING THE SOFTWARE, YOU FURTHER ACKNOWLEDGE THAT YOUR HIGH-RISK USE OF THE SOFTWARE IS AT YOUR OWN RISK. diff --git a/archive-doc-gen/SECURITY.md b/archive-doc-gen/SECURITY.md deleted file mode 100644 index 96d73bc27..000000000 --- a/archive-doc-gen/SECURITY.md +++ /dev/null @@ -1,41 +0,0 @@ - - -## Security - -Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). - -If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. - -## Reporting Security Issues - -**Please do not report security vulnerabilities through public GitHub issues.** - -Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). - -If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). - -You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). - -Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: - - * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) - * Full paths of source file(s) related to the manifestation of the issue - * The location of the affected source code (tag/branch/commit or direct URL) - * Any special configuration required to reproduce the issue - * Step-by-step instructions to reproduce the issue - * Proof-of-concept or exploit code (if possible) - * Impact of the issue, including how an attacker might exploit the issue - -This information will help us triage your report more quickly. - -If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. - -## Preferred Languages - -We prefer all communications to be in English. - -## Policy - -Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). - - \ No newline at end of file diff --git a/archive-doc-gen/SUPPORT.md b/archive-doc-gen/SUPPORT.md deleted file mode 100644 index 2c42db0f8..000000000 --- a/archive-doc-gen/SUPPORT.md +++ /dev/null @@ -1,13 +0,0 @@ -# Support - -## How to file issues and get help - -This project uses GitHub Issues to track bugs and feature requests. Please search the existing -issues before filing new issues to avoid duplicates. For new issues, file your bug or -feature request as a new Issue. - -For help and questions about using this project, please submit an issue on this repository. - -## Microsoft Support Policy - -Support for this repository is limited to the resources listed above. \ No newline at end of file diff --git a/archive-doc-gen/app-azure.yaml b/archive-doc-gen/app-azure.yaml deleted file mode 100644 index a4f96371a..000000000 --- a/archive-doc-gen/app-azure.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json - -name: sample-app-aoai-chatgpt -metadata: - template: sample-app-aoai-chatgpt@0.0.1-beta -services: - backend: - project: . - language: py - host: appservice - hooks: - prepackage: - windows: - shell: pwsh - run: cd ./frontend;npm install;npm run build - interactive: true - continueOnError: false - posix: - shell: sh - run: cd ./frontend;npm install;npm run build - interactive: true - continueOnError: false -hooks: - preprovision: - windows: - shell: pwsh - run: ./scripts/auth_init.ps1 - interactive: true - continueOnError: false - posix: - shell: sh - run: ./scripts/auth_init.sh - interactive: true - continueOnError: false - postprovision: - windows: - shell: pwsh - run: ./scripts/auth_update.ps1; - interactive: true - continueOnError: false - posix: - shell: sh - run: ./scripts/auth_update.sh; - interactive: true - continueOnError: false diff --git a/archive-doc-gen/azure.yaml b/archive-doc-gen/azure.yaml deleted file mode 100644 index f38189ef6..000000000 --- a/archive-doc-gen/azure.yaml +++ /dev/null @@ -1,51 +0,0 @@ -environment: - name: document-generation - location: eastus - -name: document-generation -metadata: - template: document-generation@1.0 - -requiredVersions: - azd: '>= 1.18.0' - -parameters: - solutionPrefix: - type: string - default: bs-azdtest - otherLocation: - type: string - default: eastus2 - baseUrl: - type: string - default: 'https://github.com/microsoft/document-generation-solution-accelerator' - -deployment: - mode: Incremental - template: ./infra/main.bicep # Path to the main.bicep file inside the 'deployment' folder - parameters: - solutionPrefix: ${parameters.solutionPrefix} - otherLocation: ${parameters.otherLocation} - baseUrl: ${parameters.baseUrl} - -hooks: - postprovision: - windows: - run: | - Write-Host "Web app URL: " - Write-Host "$env:WEB_APP_URL" -ForegroundColor Cyan - Write-Host "`nIf you want to use the Sample Data, run the following command in the Bash terminal to process it:" - Write-Host "bash ./infra/scripts/process_sample_data.sh" -ForegroundColor Cyan - shell: pwsh - continueOnError: false - interactive: true - posix: - run: | - echo "Web app URL: " - echo $WEB_APP_URL - echo "" - echo "If you want to use the Sample Data, run the following command in the bash terminal to process it:" - echo "bash ./infra/scripts/process_sample_data.sh" - shell: sh - continueOnError: false - interactive: true \ No newline at end of file diff --git a/archive-doc-gen/azure_custom.yaml b/archive-doc-gen/azure_custom.yaml deleted file mode 100644 index af8bae654..000000000 --- a/archive-doc-gen/azure_custom.yaml +++ /dev/null @@ -1,48 +0,0 @@ -environment: - name: document-generation - location: eastus - -name: document-generation -metadata: - template: document-generation@1.0 - -requiredVersions: - azd: '>= 1.18.0' - -parameters: - solutionPrefix: - type: string - default: bs-azdtest - otherLocation: - type: string - default: eastus2 - baseUrl: - type: string - default: 'https://github.com/microsoft/document-generation-solution-accelerator' - -services: - webapp: - project: ./src - language: py - host: appservice - dist: ./dist - hooks: - prepackage: - windows: - shell: pwsh - run: ../infra/scripts/package_webapp.ps1 - interactive: true - continueOnError: false - posix: - shell: sh - run: bash ../infra/scripts/package_webapp.sh - interactive: true - continueOnError: false - -deployment: - mode: Incremental - template: ./infra/main.bicep # Path to the main.bicep file inside the 'deployment' folder - parameters: - solutionPrefix: ${parameters.solutionPrefix} - otherLocation: ${parameters.otherLocation} - baseUrl: ${parameters.baseUrl} diff --git a/archive-doc-gen/docs/ACRBuildAndPushGuide.md b/archive-doc-gen/docs/ACRBuildAndPushGuide.md deleted file mode 100644 index e37889ea9..000000000 --- a/archive-doc-gen/docs/ACRBuildAndPushGuide.md +++ /dev/null @@ -1,71 +0,0 @@ -# Azure Container Registry (ACR) – Build & Push Guide - -This guide provides step-by-step instructions to build and push Docker images for **WebApp** and **Backend** services into Azure Container Registry (ACR). - -## 📋 Prerequisites -Before starting, ensure you have: -- An active [Azure Subscription](https://portal.azure.com/) -- [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) installed and logged in -- [Docker Desktop](https://docs.docker.com/get-docker/) installed and running -- Access to your Azure Container Registry (ACR) -- To create an Azure Container Registry (ACR), you can refer to the following guides: - - - [Create Container Registry using Azure CLI](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-azure-cli) - - - [Create Container Registry using Azure Portal](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal?tabs=azure-cli) - - - [Create Container Registry using PowerShell](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-powershell) - - - [Create Container Registry using ARM Template](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-geo-replication-template) - - - [Create Container Registry using Bicep](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-bicep?tabs=CLI) - ---- - -Login to ACR : -``` bash -az acr login --name $ACR_NAME -``` - -## 🚀 Build and Push Images - -**Backend** / **WebApp :** - - ```bash -az acr login --name -docker build --no-cache -f WebApp.Dockerfile -t /: . -docker push /: - ``` - -If you want to update image tag and image manually you can follow below steps: -- Go to your App Service in the [Azure Portal](https://portal.azure.com/#home). -- In the left menu, select Deployment → Deployment Center -- Under Registry settings, you can configure: - - - Image Source → (e.g., Azure Container Registry / Docker Hub / Other). - - - Image Name → e.g., myapp/backend. - - - Tag → e.g., v1.2.3. - -![alt text](./images/AppServiceContainer.png) - -## ✅ Verification - -Run the following command to verify that images were pushed successfully: -```bash -az acr repository list --name $ACR_NAME --output table -``` - -You should see repositories in the output. - -## 📝 Notes - -- Always use meaningful tags (v1.0.0, staging, prod) instead of just latest. - -- If you are pushing from a CI/CD pipeline, make sure the pipeline agent has access to Docker and ACR. - -- For private images, ensure your services (e.g., Azure Container Apps, AKS, App Service) are configured with appropriate ACR pull permissions. - - - diff --git a/archive-doc-gen/docs/AppAuthentication.md b/archive-doc-gen/docs/AppAuthentication.md deleted file mode 100644 index 34ab4533a..000000000 --- a/archive-doc-gen/docs/AppAuthentication.md +++ /dev/null @@ -1,32 +0,0 @@ -# Set Up Authentication in Azure App Service - -This document provides step-by-step instructions to configure Azure App Registrations for a front-end application. - -## Prerequisites - -- Access to **Microsoft Entra ID** -- Necessary permissions to create and manage **App Registrations** - -## Step 1: Add Authentication in Azure App Service configuration -1. Click on `Authentication` from left menu. - - ![Authentication](images/AppAuthentication.png) - -2. Click on `+ Add identity provider` to see a list of identity providers. - - ![Authentication Identity](images/AppAuthenticationIdentity.png) - -3. Click on `Identity Provider` dropdown to see a list of identity providers. - - ![Add Provider](images/AppAuthIdentityProvider.png) - -4. Select the first option `Microsoft Entra Id` from the drop-down list and select `client secret expiration` under App registration. -> NOTE: If `Create new app registration` is disabled, then go to [Create new app registration](/docs/create_new_app_registration.md) and come back to this step to complete the app authentication. - - ![Add Provider](images/AppAuthIdentityProviderAdd.png) - -5. Accept the default values and click on `Add` button to go back to the previous page with the identity provider added. - - ![Add Provider](images/AppAuthIdentityProviderAdded.png) - -6. You have successfully added app authentication, and now required to log in to access the application. diff --git a/archive-doc-gen/docs/AzureAccountSetUp.md b/archive-doc-gen/docs/AzureAccountSetUp.md deleted file mode 100644 index 22ffa836f..000000000 --- a/archive-doc-gen/docs/AzureAccountSetUp.md +++ /dev/null @@ -1,14 +0,0 @@ -## Azure account setup - -1. Sign up for a [free Azure account](https://azure.microsoft.com/free/) and create an Azure Subscription. -2. Check that you have the necessary permissions: - * Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [Role Based Access Control Administrator](https://learn.microsoft.com/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview), [User Access Administrator](https://learn.microsoft.com/azure/role-based-access-control/built-in-roles#user-access-administrator), or [Owner](https://learn.microsoft.com/azure/role-based-access-control/built-in-roles#owner). - * Your Azure account also needs `Microsoft.Resources/deployments/write` permissions on the subscription level. - -You can view the permissions for your account and subscription by following the steps below: -- Navigate to the [Azure Portal](https://portal.azure.com/) and click on `Subscriptions` under 'Navigation' -- Select the subscription you are using for this accelerator from the list. - - If you try to search for your subscription and it does not come up, make sure no filters are selected. -- Select `Access control (IAM)` and you can see the roles that are assigned to your account for this subscription. - - If you want to see more information about the roles, you can go to the `Role assignments` - tab and search by your account name and then click the role you want to view more information about. \ No newline at end of file diff --git a/archive-doc-gen/docs/AzureGPTQuotaSettings.md b/archive-doc-gen/docs/AzureGPTQuotaSettings.md deleted file mode 100644 index a91be396a..000000000 --- a/archive-doc-gen/docs/AzureGPTQuotaSettings.md +++ /dev/null @@ -1,10 +0,0 @@ -## How to Check & Update Quota - -1. **Navigate** to the [Azure AI Foundry portal](https://ai.azure.com/). -2. **Select** the AI Project associated with this accelerator. -3. **Go to** the `Management Center` from the bottom-left navigation menu. -4. Select `Quota` - - Click on the `GlobalStandard` dropdown. - - Select the required **GPT model** (`GPT-4.1`) or **Embeddings model** (`text-embedding-ada-002`). - - Choose the **region** where the deployment is hosted. -5. Request More Quota or delete any unused model deployments as needed. diff --git a/archive-doc-gen/docs/AzureSemanticSearchRegion.md b/archive-doc-gen/docs/AzureSemanticSearchRegion.md deleted file mode 100644 index 6016dcd51..000000000 --- a/archive-doc-gen/docs/AzureSemanticSearchRegion.md +++ /dev/null @@ -1,7 +0,0 @@ -## Select a region where Semantic Search Availability is available before proceeding with the deployment. - -Steps to Check Semantic Search Availability -1. Open the [Semantic Search Availability](https://learn.microsoft.com/en-us/azure/search/search-region-support) page. -2. Scroll down to the **"Azure Public regions"** section. -3. Use the table to find supported regions for **Azure AI Search** and its **Semantic ranker** feature. -4. If your target region is not listed, choose a supported region for deployment. diff --git a/archive-doc-gen/docs/CustomizingAzdParameters.md b/archive-doc-gen/docs/CustomizingAzdParameters.md deleted file mode 100644 index 671848c5a..000000000 --- a/archive-doc-gen/docs/CustomizingAzdParameters.md +++ /dev/null @@ -1,42 +0,0 @@ -## [Optional]: Customizing resource names - -By default this template will use the environment name as the prefix to prevent naming collisions within Azure. The parameters below show the default values. You only need to run the statements below if you need to change the values. - - -> To override any of the parameters, run `azd env set ` before running `azd up`. On the first azd command, it will prompt you for the environment name. Be sure to choose 3-20 charaters alphanumeric unique name. - -## Parameters - -| Name | Type | Example Value | Purpose | -| -------------------------------------- | ------- | ---------------------------- | ----------------------------------------------------------------------------- | -| `AZURE_LOCATION` | string | `` | Sets the Azure region for resource deployment. | -| `AZURE_ENV_NAME` | string | `docgen` | Sets the environment name prefix for all Azure resources. | -| `AZURE_ENV_SECONDARY_LOCATION` | string | `eastus2` | Specifies a secondary Azure region. | -| `AZURE_ENV_MODEL_DEPLOYMENT_TYPE` | string | `Standard` | Defines the model deployment type (allowed: `Standard`, `GlobalStandard`). | -| `AZURE_ENV_MODEL_NAME` | string | `gpt-4.1` | Specifies the GPT model name (allowed: `gpt-4.1`). | -| `AZURE_ENV_MODEL_VERSION` | string | `2025-04-14` | Set the Azure model version. | -| `AZURE_ENV_OPENAI_API_VERSION` | string | `2025-01-01-preview` | Specifies the API version for Azure OpenAI. | -| `AZURE_ENV_MODEL_CAPACITY` | integer | `30` | Sets the GPT model capacity (based on what's available in your subscription). | -| `AZURE_ENV_EMBEDDING_MODEL_NAME` | string | `text-embedding-ada-002` | Sets the name of the embedding model to use. | -| `AZURE_ENV_ACR_NAME` | string | `byocgacontainerreg` | Sets the Azure Container Registry name (allowed value: `byocgacontainerreg`)| -| `AZURE_ENV_IMAGETAG` | string | `latest_waf` | Set the Image tag Like (allowed values: latest_waf, dev, hotfix) | -| `AZURE_ENV_EMBEDDING_MODEL_CAPACITY` | integer | `80` | Sets the capacity for the embedding model deployment. | -| `AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID` | string | Guide to get your [Existing Workspace ID](/docs/re-use-log-analytics.md) | Reuses an existing Log Analytics Workspace instead of creating a new one. | -| `AZURE_EXISTING_AI_PROJECT_RESOURCE_ID` | string | Guid to get your existing AI Foundry Project resource ID | Reuses an existing AIFoundry and AIFoundryProject instead of creating a new one. | -| `AZURE_ENV_OPENAI_LOCATION` | string | `` | Sets the Azure region for OpenAI resource deployment. | - - -## How to Set a Parameter - - -To customize any of the above values, run the following command **before** `azd up`: - -```bash -azd env set -``` - -**Example:** - -```bash -azd env set AZURE_LOCATION westus2 -``` diff --git a/archive-doc-gen/docs/DeleteResourceGroup.md b/archive-doc-gen/docs/DeleteResourceGroup.md deleted file mode 100644 index aebe0adb6..000000000 --- a/archive-doc-gen/docs/DeleteResourceGroup.md +++ /dev/null @@ -1,53 +0,0 @@ -# Deleting Resources After a Failed Deployment in Azure Portal - -If your deployment fails and you need to clean up the resources manually, follow these steps in the Azure Portal. - ---- - -## **1. Navigate to the Azure Portal** -1. Open [Azure Portal](https://portal.azure.com/). -2. Sign in with your Azure account. - ---- - -## **2. Find the Resource Group** -1. In the search bar at the top, type **"Resource groups"** and select it. -2. Locate the **resource group** associated with the failed deployment. - -![Resource Groups](images/resourcegroup.png) - -![Resource Groups](images/resource-groups.png) - ---- - -## **3. Delete the Resource Group** -1. Click on the **resource group name** to open it. -2. Click the **Delete resource group** button at the top. - -![Delete Resource Group](images/DeleteRG.png) - -3. Type the resource group name in the confirmation box and click **Delete**. - -📌 **Note:** Deleting a resource group will remove all resources inside it. - ---- - -## **4. Delete Individual Resources (If Needed)** -If you don’t want to delete the entire resource group, follow these steps: - -1. Open **Azure Portal** and go to the **Resource groups** section. -2. Click on the specific **resource group**. -3. Select the **resource** you want to delete (e.g., App Service, Storage Account). -4. Click **Delete** at the top. - -![Delete Individual Resource](images/deleteservices.png) - ---- - -## **5. Verify Deletion** -- After a few minutes, refresh the **Resource groups** page. -- Ensure the deleted resource or group no longer appears. - -📌 **Tip:** If a resource fails to delete, check if it's **locked** under the **Locks** section and remove the lock. - - diff --git a/archive-doc-gen/docs/DeploymentGuide.md b/archive-doc-gen/docs/DeploymentGuide.md deleted file mode 100644 index a6b4c2789..000000000 --- a/archive-doc-gen/docs/DeploymentGuide.md +++ /dev/null @@ -1,509 +0,0 @@ -# Deployment Guide - -## Overview - -This guide walks you through deploying the Document Generation Solution Accelerator to Azure. The deployment process takes approximately 7-10 minutes for the default Development/Testing configuration and includes both infrastructure provisioning and application setup. - -🆘 **Need Help?** If you encounter any issues during deployment, check our [Troubleshooting Guide](./TroubleShootingSteps.md) for solutions to common problems. - -## Step 1: Prerequisites & Setup - -### 1.1 Azure Account Requirements - -Ensure you have access to an [Azure subscription](https://azure.microsoft.com/free/) with the following permissions: - -| **Required Permission/Role** | **Scope** | **Purpose** | -|------------------------------|-----------|-------------| -| **Contributor** | Subscription level | Create and manage Azure resources | -| **User Access Administrator** | Subscription level | Manage user access and role assignments | -| **Role Based Access Control** | Subscription/Resource Group level | Configure RBAC permissions | -| **App Registration Creation** | Azure Active Directory | Create and configure authentication | - -**🔍 How to Check Your Permissions:** - -1. Go to [Azure Portal](https://portal.azure.com/) -2. Navigate to **Subscriptions** (search for "subscriptions" in the top search bar) -3. Click on your target subscription -4. In the left menu, click **Access control (IAM)** -5. Scroll down to see the table with your assigned roles - you should see: - - **Contributor** - - **User Access Administrator** - - **Role Based Access Control Administrator** (or similar RBAC role) - -**For App Registration permissions:** -1. Go to **Microsoft Entra ID** → **Manage** → **App registrations** -2. Try clicking **New registration** -3. If you can access this page, you have the required permissions -4. Cancel without creating an app registration - -📖 **Detailed Setup:** Follow [Azure Account Set Up](./AzureAccountSetUp.md) for complete configuration. - -### 1.2 Check Service Availability & Quota - -⚠️ **CRITICAL:** Before proceeding, ensure your chosen region has all required services available: - -**Required Azure Services:** -- [Azure AI Foundry](https://learn.microsoft.com/en-us/azure/ai-foundry/) -- [Azure OpenAI Service](https://learn.microsoft.com/en-us/azure/ai-services/openai/) -- [Azure Cosmos DB](https://learn.microsoft.com/en-us/azure/cosmos-db/) -- [Azure AI Search](https://learn.microsoft.com/en-us/azure/search/) -- [Azure Semantic Search](./AzureSemanticSearchRegion.md) - -**Recommended Regions:** East US, East US2, Australia East, UK South, France Central. - -🔍 **Check Availability:** Use [Azure Products by Region](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/) to verify service availability. - -### 1.3 Quota Check (Optional) - -💡 **RECOMMENDED:** Check your Azure OpenAI quota availability before deployment for optimal planning. - -📖 **Follow:** [Quota Check Instructions](./QuotaCheck.md) to ensure sufficient capacity. - -**Recommended Configuration:** - -- **Minimum:** 150k tokens for Global Standard GPT-4.1 -- **Optimal:** More 150k tokens (for best performance) - -> **Note:** When you run `azd up`, the deployment will automatically show you regions with available quota, so this pre-check is optional but helpful for planning purposes. You can customize these settings later in [Step 3.3: Advanced Configuration](#33-advanced-configuration-optional). - -📖 **Adjust Quota:** Follow [Azure AI Model Quota Settings](./AzureGPTQuotaSettings.md) if needed. - -## Step 2: Choose Your Deployment Environment - -Select one of the following options to deploy the Document Generation Solution Accelerator: - -### Environment Comparison - -| **Option** | **Best For** | **Prerequisites** | **Setup Time** | -|------------|--------------|-------------------|----------------| -| **GitHub Codespaces** | Quick deployment, no local setup required | GitHub account | ~5-7 minutes | -| **VS Code Dev Containers** | Fast deployment with local tools | Docker Desktop, VS Code | ~6-10 minutes | -| **VS Code Web** | Quick deployment, no local setup required | Azure account | ~6-8 minutes | -| **Local Environment** | Enterprise environments, full control | All tools individually | ~7-10 minutes | - -**💡 Recommendation:** For fastest deployment, start with **GitHub Codespaces** - no local installation required. - ---- - -
-Option A: GitHub Codespaces (Easiest) - -[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/microsoft/document-generation-solution-accelerator) - -1. Click the badge above (may take several minutes to load) -2. Accept default values on the Codespaces creation page -3. Wait for the environment to initialize (includes all deployment tools) -4. Proceed to [Step 3: Configure Deployment Settings](#step-3-configure-deployment-settings) - -
- -
-Option B: VS Code Dev Containers - -[![Open in Dev Containers](https://img.shields.io/static/v1?style=for-the-badge&label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/microsoft/document-generation-solution-accelerator) - -**Prerequisites:** -- [Docker Desktop](https://www.docker.com/products/docker-desktop/) installed and running -- [VS Code](https://code.visualstudio.com/) with [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) - -**Steps:** -1. Start Docker Desktop -2. Click the badge above to open in Dev Containers -3. Wait for the container to build and start (includes all deployment tools) -4. Proceed to [Step 3: Configure Deployment Settings](#step-3-configure-deployment-settings) - -
- -
-Option C: Visual Studio Code Web - - [![Open in Visual Studio Code Web](https://img.shields.io/static/v1?style=for-the-badge&label=Visual%20Studio%20Code%20(Web)&message=Open&color=blue&logo=visualstudiocode&logoColor=white)](https://vscode.dev/azure/?vscode-azure-exp=foundry&agentPayload=eyJiYXNlVXJsIjogImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taWNyb3NvZnQvZG9jdW1lbnQtZ2VuZXJhdGlvbi1zb2x1dGlvbi1hY2NlbGVyYXRvci9yZWZzL2hlYWRzL21haW4vaW5mcmEvdnNjb2RlX3dlYiIsICJpbmRleFVybCI6ICIvaW5kZXguanNvbiIsICJ2YXJpYWJsZXMiOiB7ImFnZW50SWQiOiAiIiwgImNvbm5lY3Rpb25TdHJpbmciOiAiIiwgInRocmVhZElkIjogIiIsICJ1c2VyTWVzc2FnZSI6ICIiLCAicGxheWdyb3VuZE5hbWUiOiAiIiwgImxvY2F0aW9uIjogIiIsICJzdWJzY3JpcHRpb25JZCI6ICIiLCAicmVzb3VyY2VJZCI6ICIiLCAicHJvamVjdFJlc291cmNlSWQiOiAiIiwgImVuZHBvaW50IjogIiJ9LCAiY29kZVJvdXRlIjogWyJhaS1wcm9qZWN0cy1zZGsiLCAicHl0aG9uIiwgImRlZmF1bHQtYXp1cmUtYXV0aCIsICJlbmRwb2ludCJdfQ==) - -1. Click the badge above (may take a few minutes to load) -2. Sign in with your Azure account when prompted -3. Select the subscription where you want to deploy the solution -4. Wait for the environment to initialize (includes all deployment tools) -5. Once the solution opens, the **AI Foundry terminal** will automatically start running the following command to install the required dependencies: - - ```shell - sh install.sh - ``` - During this process, you’ll be prompted with the message: - ``` - What would you like to do with these files? - - Overwrite with versions from template - - Keep my existing files unchanged - ``` - Choose “**Overwrite with versions from template**” and provide a unique environment name when prompted. - -6. **Authenticate with Azure** (VS Code Web requires device code authentication): - - ```shell - az login --use-device-code - ``` - > **Note:** In VS Code Web environment, the regular `az login` command may fail. Use the `--use-device-code` flag to authenticate via device code flow. Follow the prompts in the terminal to complete authentication. - -7. Proceed to [Step 3: Configure Deployment Settings](#step-3-configure-deployment-settings) - -
- -
-Option D: Local Environment - -**Required Tools:** -- [PowerShell 7.0+](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell) -- [Azure Developer CLI (azd) 1.18.0+](https://aka.ms/install-azd) -- [Python 3.9+](https://www.python.org/downloads/) -- [Docker Desktop](https://www.docker.com/products/docker-desktop/) -- [Git](https://git-scm.com/downloads) - -**Setup Steps:** -1. Install all required deployment tools listed above -2. Clone the repository: - ```shell - azd init -t microsoft/document-generation-solution-accelerator/ - ``` -3. Open the project folder in your terminal -4. Proceed to [Step 3: Configure Deployment Settings](#step-3-configure-deployment-settings) - -**PowerShell Users:** If you encounter script execution issues, run: -```powershell -Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -``` - -
- -## Step 3: Configure Deployment Settings - -Review the configuration options below. You can customize any settings that meet your needs, or leave them as defaults to proceed with a standard deployment. - -### 3.1 Choose Deployment Type (Optional) - -| **Aspect** | **Development/Testing (Default)** | **Production** | -|------------|-----------------------------------|----------------| -| **Configuration File** | `main.parameters.json` (sandbox) | Copy `main.waf.parameters.json` to `main.parameters.json` | -| **Security Controls** | Minimal (for rapid iteration) | Enhanced (production best practices) | -| **Cost** | Lower costs | Cost optimized | -| **Use Case** | POCs, development, testing | Production workloads | -| **Framework** | Basic configuration | [Well-Architected Framework](https://learn.microsoft.com/en-us/azure/well-architected/) | -| **Features** | Core functionality | Reliability, security, operational excellence | - -**To use production configuration:** - -Copy the contents from the production configuration file to your main parameters file: - -1. Navigate to the `infra` folder in your project -2. Open `main.waf.parameters.json` in a text editor (like Notepad, VS Code, etc.) -3. Select all content (Ctrl+A) and copy it (Ctrl+C) -4. Open `main.parameters.json` in the same text editor -5. Select all existing content (Ctrl+A) and paste the copied content (Ctrl+V) -6. Save the file (Ctrl+S) - -### 3.2 Set VM Credentials (Optional - Production Deployment Only) - -> **Note:** This section only applies if you selected **Production** deployment type in section 3.1. VMs are not deployed in the default Development/Testing configuration. - -By default, random GUIDs are generated for VM credentials. To set custom credentials: - -```shell -azd env set AZURE_ENV_VM_ADMIN_USERNAME -azd env set AZURE_ENV_VM_ADMIN_PASSWORD -``` - -### 3.3 Advanced Configuration (Optional) - -
-Configurable Parameters - -You can customize various deployment settings before running `azd up`, including Azure regions, AI model configurations (deployment type, version, capacity), container registry settings, and resource names. - -📖 **Complete Guide:** See [Parameter Customization Guide](./CustomizingAzdParameters.md) for the full list of available parameters and their usage. - -
- -
-Reuse Existing Resources - -To optimize costs and integrate with your existing Azure infrastructure, you can configure the solution to reuse compatible resources already deployed in your subscription. - -**Supported Resources for Reuse:** - -- **Log Analytics Workspace:** Integrate with your existing monitoring infrastructure by reusing an established Log Analytics workspace for centralized logging and monitoring. [Configuration Guide](./re-use-log-analytics.md) - -- **Azure AI Foundry Project:** Leverage your existing AI Foundry project and deployed models to avoid duplication and reduce provisioning time. [Configuration Guide](./re-use-foundry-project.md) - -**Key Benefits:** -- **Cost Optimization:** Eliminate duplicate resource charges -- **Operational Consistency:** Maintain unified monitoring and AI infrastructure -- **Faster Deployment:** Skip resource creation for existing compatible services -- **Simplified Management:** Reduce the number of resources to manage and monitor - -**Important Considerations:** -- Ensure existing resources meet the solution's requirements and are in compatible regions -- Review access permissions and configurations before reusing resources -- Consider the impact on existing workloads when sharing resources - -
- -## Step 4: Deploy the Solution - -💡 **Before You Start:** If you encounter any issues during deployment, check our [Troubleshooting Guide](./TroubleShootingSteps.md) for common solutions. - -⚠️ **Critical: Redeployment Warning:** If you have previously run `azd up` in this folder (i.e., a `.azure` folder exists), you must [create a fresh environment](#creating-a-new-environment) to avoid conflicts and deployment failures. - -### 4.1 Authenticate with Azure - -```shell -azd auth login -``` - -**For specific tenants:** -```shell -azd auth login --tenant-id -``` - -> **Finding Tenant ID:** - > 1. Open the [Azure Portal](https://portal.azure.com/). - > 2. Navigate to **Microsoft Entra ID** from the left-hand menu. - > 3. Under the **Overview** section, locate the **Tenant ID** field. Copy the value displayed. - -### 4.2 Start Deployment - -```shell -azd up -``` - -**During deployment, you'll be prompted for:** -1. **Environment name** (e.g., "docgen") - Must be 3-16 characters long, alphanumeric only -2. **Azure subscription** selection -3. **Azure AI Foundry deployment region** - Select a region with available OpenAI model quota for AI operations -4. **Primary location** - Select the region where your infrastructure resources will be deployed -5. **Resource group** selection (create new or use existing) - -**Expected Duration:** 6-8 minutes for default configuration - -**⚠️ Deployment Issues:** If you encounter errors or timeouts, try a different region as there may be capacity constraints. For detailed error solutions, see our [Troubleshooting Guide](./TroubleShootingSteps.md). - -### 4.3 Get Application URL - -After successful deployment: - -1. Open [Azure Portal](https://portal.azure.com/) -2. Navigate to your resource group -3. Find the App Service with "app" in the name -4. Copy the **Application URI** - -⚠️ **Important:** Complete [Post-Deployment Steps](#step-5-post-deployment-configuration) before accessing the application. - -## Step 5: Post-Deployment Configuration - -### 5.1 Sample Data Import - -1. Once the deployment has completed successfully and you would like to use the sample data, please open a **Git Bash** terminal and run the bash command printed below. The bash command will look like the following: - ```shell - bash ./infra/scripts/process_sample_data.sh - ``` - If you don't have azd env then you need to pass parameters along with the command. Then the command will look like the following: - ```shell - bash ./infra/scripts/process_sample_data.sh - ``` - -### 5.2 Configure Authentication (Optional) - -1. Follow [App Authentication Configuration](./AppAuthentication.md) -2. Wait up to 10 minutes for authentication changes to take effect - -### 5.3 Verify Deployment - -1. Access your application using the URL from Step 4.3 -2. Confirm the application loads successfully -3. Verify you can sign in with your authenticated account - -## Step 6: Clean Up (Optional) - -### Remove All Resources - -```shell -azd down -``` - -> **Note:** To purge resources and clean up after deployment, use the `azd down` command or follow the [Delete Resource Group Guide](./DeleteResourceGroup.md) for manual cleanup through Azure Portal. If you deployed with `enableRedundancy=true` and Log Analytics workspace replication is enabled, you must first disable replication before running `azd down` else resource group delete will fail. Follow the steps in [Handling Log Analytics Workspace Deletion with Replication Enabled](./LogAnalyticsReplicationDisable.md), wait until replication returns `false`, then run `azd down`. - -### Manual Cleanup (if needed) - -If deployment fails or you need to clean up manually: - -- Follow [Delete Resource Group Guide](./DeleteResourceGroup.md) -- See section below for "Deleting Resources After a Failed Deployment" - -## Local Development & Debugging - -After deploying the solution to Azure, you can run and debug the application locally by connecting to your deployed Azure resources. - -### Configure Environment Variables - -1. Create a `.env` file in the `src` directory of your project -2. Set the `APP_ENV` variable to match your deployed environment name: - ``` - APP_ENV= - ``` -3. Authenticate with Azure CLI to access deployed resources: - ```shell - az login - ``` - -The application will use the Azure CLI credentials to connect to the deployed Azure resources (Azure AI Search, Cosmos DB, etc.) using the environment name specified in `APP_ENV`. - -For complete local development setup instructions, see the [Local Development Setup Guide](./LocalDevelopmentSetup.md). - -## 🛠️ Troubleshooting - -If you encounter issues during deployment, see our comprehensive [Troubleshooting Guide](./TroubleShootingSteps.md) for solutions to common problems. - -## Managing Multiple Environments - -### Recover from Failed Deployment - -If your deployment failed or encountered errors, here are the steps to recover: - -
-Recover from Failed Deployment - -**If your deployment failed or encountered errors:** - -1. **Try a different region:** Create a new environment and select a different Azure region during deployment -2. **Clean up and retry:** Use `azd down` to remove failed resources, then `azd up` to redeploy -3. **Check troubleshooting:** Review [Troubleshooting Guide](./TroubleShootingSteps.md) for specific error solutions -4. **Fresh start:** Create a completely new environment with a different name - -**Example Recovery Workflow:** -```shell -# Remove failed deployment (optional) -azd down - -# Create new environment (3-16 chars, alphanumeric only) -azd env new docgenretry - -# Deploy with different settings/region -azd up -``` - -
- -### Creating a New Environment - -If you need to deploy to a different region, test different configurations, or create additional environments: - -
-Create a New Environment - -**Create Environment Explicitly:** -```shell -# Create a new named environment (3-16 characters, alphanumeric only) -azd env new - -# Select the new environment -azd env select - -# Deploy to the new environment -azd up -``` - -**Example:** -```shell -# Create a new environment for production (valid: 3-16 chars) -azd env new docgenprod - -# Switch to the new environment -azd env select docgenprod - -# Deploy with fresh settings -azd up -``` - -> **Environment Name Requirements:** -> - **Length:** 3-16 characters -> - **Characters:** Alphanumeric only (letters and numbers) -> - **Valid examples:** `docgen`, `test123`, `myappdev`, `prod2024` -> - **Invalid examples:** `co` (too short), `my-very-long-environment-name` (too long), `test_env` (underscore not allowed), `myapp-dev` (hyphen not allowed) - -
- -
-Switch Between Environments - -**List Available Environments:** -```shell -azd env list -``` - -**Switch to Different Environment:** -```shell -azd env select -``` - -**View Current Environment:** -```shell -azd env get-values -``` - -
- -### Best Practices for Multiple Environments - -- **Use descriptive names:** `docgendev`, `docgenprod`, `docgentest` (remember: 3-16 chars, alphanumeric only) -- **Different regions:** Deploy to multiple regions for testing quota availability -- **Separate configurations:** Each environment can have different parameter settings -- **Clean up unused environments:** Use `azd down` to remove environments you no longer need - -## Next Steps - -Now that your deployment is complete and tested, explore these resources to enhance your experience: - -🚀 **Get Started:** - -- [Sample Questions](./SampleQuestions.md) - Try these sample questions to explore the solution's capabilities -- Test the application with your own documents and queries - -🔧 **Development & Customization:** - -- [Local Development Setup](./LocalDevelopmentSetup.md) - Set up your local development environment -- Review [Test Case Flows](../src/TEST_CASE_FLOWS.md) for detailed testing scenarios - -📚 **Learn More:** - -- Explore the architecture and design principles -- Understand the solution's components and workflows - -## Need Help? - -- 🐛 **Issues:** Check [Troubleshooting Guide](./TroubleShootingSteps.md) -- 💬 **Support:** Review [Support Guidelines](../SUPPORT.md) -- 🔧 **Development:** See [Contributing Guide](../CONTRIBUTING.md) - -## Advanced: Deploy Local Changes - -If you've made local modifications to the code and want to deploy them to Azure, follow these steps to swap the configuration files: - -> **Note:** To set up and run the application locally for development, see the [Local Development Setup Guide](./LocalDevelopmentSetup.md). - -### Step 1: Rename Azure Configuration Files - -**In the root directory:** -1. Rename `azure.yaml` to `azure_custom2.yaml` -2. Rename `azure_custom.yaml` to `azure.yaml` - -### Step 2: Rename Infrastructure Files - -**In the `infra` directory:** -1. Rename `main.bicep` to `main_custom2.bicep` -2. Rename `main_custom.bicep` to `main.bicep` - -### Step 3: Deploy Changes - -Run the deployment command: -```shell -azd up -``` - -> **Note:** These custom files are configured to deploy your local code changes instead of pulling from the GitHub repository. diff --git a/archive-doc-gen/docs/LocalDevelopmentSetup.md b/archive-doc-gen/docs/LocalDevelopmentSetup.md deleted file mode 100644 index 4635b89e8..000000000 --- a/archive-doc-gen/docs/LocalDevelopmentSetup.md +++ /dev/null @@ -1,506 +0,0 @@ -# Local Development Setup Guide - -This guide provides comprehensive instructions for setting up the Document Generation Solution Accelerator for local development across Windows and Linux platforms. - -## Important Setup Notes - -### Multi-Service Architecture - -This application consists of **two separate services** that run independently: - -1. **Backend API** - REST API server for the frontend -2. **Frontend** - React-based user interface - -> **⚠️ Critical: Each service must run in its own terminal/console window** -> -> - **Do NOT close terminals** while services are running -> - Open **2 separate terminal windows** for local development -> - Each service will occupy its terminal and show live logs - - -### Path Conventions - -**All paths in this guide are relative to the repository root directory:** - -```bash -document-generation-solution-accelerator/ ← Repository root (start here) -├── src/ -│ ├── backend/ -│ │ ├── api/ ← API endpoints and routes -│ │ ├── auth/ ← Authentication modules -│ │ ├── helpers/ ← Utility and helper functions -│ │ ├── history/ ← Chat/session history management -│ │ ├── security/ ← Security-related modules -│ │ └── settings.py ← Backend configuration -│ ├── frontend/ -│ │ ├── src/ ← React/TypeScript source -│ │ └── package.json ← Frontend dependencies -│ ├── static/ ← Static web assets -│ ├── tests/ ← Unit and integration tests -│ ├── app.py ← Main Flask application entry point -│ ├── .env ← Main application config file -│ └── requirements.txt ← Python dependencies -├── scripts/ -│ ├── prepdocs.py ← Document processing script -│ ├── auth_init.py ← Authentication setup -│ ├── data_preparation.py ← Data pipeline scripts -│ └── config.json ← Scripts configuration -├── infra/ -│ ├── main.bicep ← Main infrastructure template -│ ├── scripts/ ← Infrastructure scripts -│ └── main.parameters.json ← Deployment parameters -├── docs/ ← Documentation (you are here) -└── tests/ ← End-to-end tests - └── e2e-test/ -``` - -**Before starting any step, ensure you are in the repository root directory:** - -```bash -# Verify you're in the correct location -pwd # Linux/macOS - should show: .../document-generation-solution-accelerator -Get-Location # Windows PowerShell - should show: ...\document-generation-solution-accelerator - -# If not, navigate to repository root -cd path/to/document-generation-solution-accelerator -``` - -## Step 1: Prerequisites - Install Required Tools - -Install these tools before you start: -- [Visual Studio Code](https://code.visualstudio.com/) with the following extensions: - - [Azure Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) - - [Bicep](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-bicep) - - [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) -- [Python 3.11](https://www.python.org/downloads/). **Important:** Check "Add Python to PATH" during installation. -- [PowerShell 7.0+](https://github.com/PowerShell/PowerShell#get-powershell). -- [Node.js (LTS)](https://nodejs.org/en). -- [Git](https://git-scm.com/downloads). -- [Azure Developer CLI (azd) v1.18.0+](https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/install-azd). -- [Microsoft ODBC Driver 17](https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16) for SQL Server. - - -### Windows Development - -#### Option 1: Native Windows (PowerShell) - -```powershell -# Install Python 3.11+ and Git -winget install Python.Python.3.11 -winget install Git.Git - -# Install Node.js for frontend -winget install OpenJS.NodeJS.LTS - -# Install uv package manager -py -3.11 -m pip install uv -``` - -**Note**: On Windows, use `py -3.11 -m uv` instead of `uv` for all commands to ensure you're using Python 3.11. - -#### Option 2: Windows with WSL2 (Recommended) - -```bash -# Install WSL2 first (run in PowerShell as Administrator): -# wsl --install -d Ubuntu - -# Then in WSL2 Ubuntu terminal: -sudo apt update && sudo apt install python3.11 python3.11-venv git curl nodejs npm -y - -# Install uv -curl -LsSf https://astral.sh/uv/install.sh | sh -source ~/.bashrc -``` - -### Linux Development - -#### Ubuntu/Debian - -```bash -# Install prerequisites -sudo apt update && sudo apt install python3.11 python3.11-venv git curl nodejs npm -y - -# Install uv package manager -curl -LsSf https://astral.sh/uv/install.sh | sh -source ~/.bashrc -``` - -#### RHEL/CentOS/Fedora - -```bash -# Install prerequisites -sudo dnf install python3.11 python3.11-devel git curl gcc nodejs npm -y - -# Install uv -curl -LsSf https://astral.sh/uv/install.sh | sh -source ~/.bashrc -``` - - -## Step 2: Clone the Repository - -Choose a location on your local machine where you want to store the project files. We recommend creating a dedicated folder for your development projects. - -#### Using Command Line/Terminal - -1. **Open your terminal or command prompt. Navigate to your desired directory and Clone the repository:** - ```bash - git clone https://github.com/microsoft/document-generation-solution-accelerator.git - ``` - -2. **Navigate to the project directory:** - ```bash - cd document-generation-solution-accelerator - ``` - -3. **Open the project in Visual Studio Code:** - ```bash - code . - ``` - - -## Step 3: Development Tools Setup - -### Visual Studio Code (Recommended) - -#### Required Extensions - -Create `.vscode/extensions.json` in the workspace root and copy the following JSON: - -```json -{ - "recommendations": [ - "ms-python.python", - "ms-python.pylint", - "ms-python.black-formatter", - "ms-python.isort", - "ms-vscode-remote.remote-wsl", - "ms-vscode-remote.remote-containers", - "redhat.vscode-yaml", - "ms-vscode.azure-account", - "ms-python.mypy-type-checker" - ] -} -``` - -VS Code will prompt you to install these recommended extensions when you open the workspace. - -#### Settings Configuration - -Create `.vscode/settings.json` and copy the following JSON: - -```json -{ - "python.defaultInterpreterPath": "./.venv/bin/python", - "python.terminal.activateEnvironment": true, - "python.formatting.provider": "black", - "python.linting.enabled": true, - "python.linting.pylintEnabled": true, - "python.testing.pytestEnabled": true, - "python.testing.unittestEnabled": false, - "files.associations": { - "*.yaml": "yaml", - "*.yml": "yaml" - } -} -``` - -## Step 4: Azure Authentication Setup - -Before configuring services, authenticate with Azure: - -```bash -# Login to Azure CLI -az login - -# Set your subscription -az account set --subscription "your-subscription-id" - -# Verify authentication -az account show -``` - -## Step 5: Local Setup/Deployment - -Follow these steps to set up and run the application locally: - -## Local Deployment: - -You can refer the local deployment guide here: [Local Deployment Guide](https://github.com/microsoft/document-generation-solution-accelerator/blob/main/docs/DeploymentGuide.md) - -### 5.1. Open the App Folder -Navigate to the `src` directory of the repository using Visual Studio Code. - -### 5.2. Configure Environment Variables -- Copy the `.env.sample` file to a new file named `.env`. -- Update the `.env` file with the required values from your Azure resource group in Azure Portal App Service environment variables. -- You can get all env value in your deployed resource group under App Service: -![Environment Variables](images/Enviorment_variables.png) -- Alternatively, if resources were -provisioned using `azd provision` or `azd up`, a `.env` file is automatically generated in the `.azure//.env` -file. To get your `` run `azd env list` to see which env is default. - -> **Note**: After adding all environment variables to the .env file, update the value of **'APP_ENV'** from: -``` -APP_ENV="Prod" -``` -**to:** -``` -APP_ENV="Dev" -``` - -This change is required for running the application in local development mode. - - -### 5.3. Required Azure RBAC Permissions - -To run the application locally, your Azure account needs the following role assignments on the deployed resources: - -#### 5.3.1. App Configuration Access -```bash -# Get your principal ID -PRINCIPAL_ID=$(az ad signed-in-user show --query id -o tsv) - -# Assign App Configuration Data Reader role -az role assignment create \ - --assignee $PRINCIPAL_ID \ - --role "App Configuration Data Reader" \ - --scope "/subscriptions//resourceGroups//providers/Microsoft.AppConfiguration/configurationStores/" -``` - -#### 5.3.2. Cosmos DB Access -```bash -# Assign Cosmos DB Built-in Data Contributor role -az cosmosdb sql role assignment create \ - --account-name \ - --resource-group \ - --role-definition-name "Cosmos DB Built-in Data Contributor" \ - --principal-id $PRINCIPAL_ID \ - --scope "/" -``` -> **Note**: After local deployment is complete, you need to execute the post-deployment script so that all the required roles will be assigned automatically. - -### 5.4. Running with Automated Script - -For convenience, you can use the provided startup scripts that handle environment setup and start both services: - -**Windows:** -```cmd -cd src -.\start.cmd -``` - -**macOS/Linux:** -```bash -cd src -chmod +x start.sh -./start.sh -``` -### 5.5. Start the Application -- Run `start.cmd` (Windows) or `start.sh` (Linux/Mac) to: - - Install backend dependencies. - - Install frontend dependencies. - - Build the frontend. - - Start the backend server. -- Alternatively, you can run the backend in debug mode using the VS Code debug configuration defined in `.vscode/launch.json`. - - -## Step 6: Running Backend and Frontend Separately - -> **📋 Terminal Reminder**: This section requires **two separate terminal windows** - one for the Backend API and one for the Frontend. Keep both terminals open while running. All commands assume you start from the **repository root directory**. - -### 6.1. Create Virtual Environment (Recommended) - -Open your terminal and navigate to the root folder of the project, then create the virtual environment: - -```bash -# Navigate to the project root folder -cd document-generation-solution-accelerator - -# Create virtual environment in the root folder -python -m venv .venv - -# Activate virtual environment (Windows) -.venv/Scripts/activate - -# Activate virtual environment (macOS/Linux) -source .venv/bin/activate -``` - -> **Note**: After activation, you should see `(.venv)` in your terminal prompt indicating the virtual environment is active. - -### 6.2. Install Dependencies and Run - -To develop and run the backend API locally: - -```bash -# Navigate to the API folder (while virtual environment is activated) -cd src/ - -# Upgrade pip -python -m pip install --upgrade pip - -# Install Python dependencies -pip install -r requirements.txt - -# Install Frontend Packages -cd frontend - -npm install -npm run build - -# Run the backend API (Windows) -cd .. - -start http://127.0.0.1:50505 -call python -m uvicorn app:app --port 50505 --reload - -# Run the backend API (MacOs) -cd .. - -open http://127.0.0.1:50505 -python -m uvicorn app:app --port 50505 --reload - -# Run the backend API (Linux) -cd .. - -xdg-open http://127.0.0.1:50505 -python -m uvicorn app:app --port 50505 --reload - -``` - -> **Note**: Make sure your virtual environment is activated before running these commands. You should see `(.venv)` in your terminal prompt when the virtual environment is active. - -The App will run on `http://127.0.0.1:50505/#/` by default. - -## Step 7: Verify All Services Are Running - -Before using the application, confirm all services are running correctly: - -### 7.1. Terminal Status Checklist - -| Terminal | Service | Command | Expected Output | URL | -|----------|---------|---------|-----------------|-----| -| **Terminal 1** | Backend API | `python -m uvicorn app:app --port 50505 --reload` | `INFO: Application startup complete` | http://127.0.0.1:50505 | -| **Terminal 2** | Frontend (Dev) | `npm run dev` | `Local: http://localhost:5173/` | http://localhost:5173 | - -### 7.2. Quick Verification - -**1. Check Backend API:** -```bash -# In a new terminal -curl http://127.0.0.1:50505/health -# Expected: {"status":"healthy"} or similar JSON response -``` - -**2. Check Frontend:** -- Open browser to http://127.0.0.1:50505 (production build) or http://localhost:5173 (dev server) -- Should see the Document Generation UI -- If authentication is configured, you'll be redirected to Azure AD login - -### 7.3. Common Issues - -**Service not starting?** -- Ensure you're in the correct directory (`src/` for backend) -- Verify virtual environment is activated (you should see `(.venv)` in prompt) -- Check that port is not already in use (50505 for API, 5173 for frontend dev) -- Review error messages in the terminal - -**Can't access services?** -- Verify firewall isn't blocking ports 50505 or 5173 -- Try `http://localhost:port` instead of `http://127.0.0.1:port` -- Ensure services show "startup complete" messages - -## Step 8: Next Steps - -Once all services are running (as confirmed in Step 7), you can: - -1. **Access the Application**: Open `http://127.0.0.1:50505` in your browser to explore the Document Generation UI -2. **Explore Sample Questions**: Follow [SampleQuestions.md](SampleQuestions.md) for example prompts and use cases -3. **Understand the Architecture**: Review the codebase starting with `src/backend/` directory - -## Troubleshooting - -### Common Issues - -#### Python Version Issues - -```bash -# Check available Python versions -python3 --version -python3.11 --version - -# If python3.11 not found, install it: -# Ubuntu: sudo apt install python3.11 -# macOS: brew install python@3.11 -# Windows: winget install Python.Python.3.11 -``` - -#### Virtual Environment Issues - -```bash -# Recreate virtual environment -rm -rf .venv # Linux/macOS -# or Remove-Item -Recurse .venv # Windows PowerShell - -uv venv .venv -# Activate and reinstall -source .venv/bin/activate # Linux/macOS -# or .\.venv\Scripts\Activate.ps1 # Windows -uv sync --python 3.11 -``` - -#### Permission Issues (Linux/macOS) - -```bash -# Fix ownership of files -sudo chown -R $USER:$USER . - -# Fix uv permissions -chmod +x ~/.local/bin/uv -``` - -#### Windows-Specific Issues - -```powershell -# PowerShell execution policy -Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -# Long path support (Windows 10 1607+, run as Administrator) -New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force - -# SSL certificate issues -python -m pip install uv -``` - -### Azure Authentication Issues - -```bash -# Login to Azure CLI -az login - -# Set subscription -az account set --subscription "your-subscription-id" - -# Test authentication -az account show -``` - -### Environment Variable Issues - -```bash -# Check environment variables are loaded -env | grep AZURE # Linux/macOS -Get-ChildItem Env:AZURE* # Windows PowerShell - -# Validate .env file format -cat .env | grep -v '^#' | grep '=' # Should show key=value pairs -``` - -## Related Documentation - -- [Deployment Guide](DeploymentGuide.md) - Instructions for production deployment. -- [Delete Resource Group](DeleteResourceGroup.md) - Steps to safely delete the Azure resource group created for the solution. -- [App Authentication Setup](AppAuthentication.md) - Guide to configure application authentication and add support for additional platforms. -- [Powershell Setup](PowershellSetup.md) - Instructions for setting up PowerShell and required scripts. -- [Quota Check](QuotaCheck.md) - Steps to verify Azure quotas and ensure required limits before deployment. diff --git a/archive-doc-gen/docs/LogAnalyticsReplicationDisable.md b/archive-doc-gen/docs/LogAnalyticsReplicationDisable.md deleted file mode 100644 index f4379a84a..000000000 --- a/archive-doc-gen/docs/LogAnalyticsReplicationDisable.md +++ /dev/null @@ -1,28 +0,0 @@ -# 🛠 Handling Log Analytics Workspace Deletion with Replication Enabled - -If redundancy (replication) is enabled for your Log Analytics workspace, you must disable it before deleting the workspace or resource group. Otherwise, deletion will fail. - -## ✅ Steps to Disable Replication Before Deletion -Run the following Azure CLI command. Note: This operation may take about 5 minutes to complete. - -```bash -az resource update --ids "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{logAnalyticsName}" --set properties.replication.enabled=false -``` - -Replace: -- `{subscriptionId}` → Your Azure subscription ID -- `{resourceGroupName}` → The name of your resource group -- `{logAnalyticsName}` → The name of your Log Analytics workspace - -Optional: Verify replication disabled (should output `false`): -```bash -az resource show --ids "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{logAnalyticsName}" --query properties.replication.enabled -o tsv -``` - -## ✅ After Disabling Replication -You can safely delete: -- The Log Analytics workspace (manual) -- The resource group (manual), or -- All provisioned resources via `azd down` - -Return to: [Deployment Guide](./DeploymentGuide.md) diff --git a/archive-doc-gen/docs/PowershellSetup.md b/archive-doc-gen/docs/PowershellSetup.md deleted file mode 100644 index 76d3de4c1..000000000 --- a/archive-doc-gen/docs/PowershellSetup.md +++ /dev/null @@ -1,45 +0,0 @@ -# Add PowerShell 7 to PATH in Windows - -This guide will help you add **PowerShell 7** (PowerShell Core) to your system’s PATH variable on Windows, so you can easily run it from any Command Prompt or Run dialog. - -## Prerequisites - -- You should have **PowerShell 7** installed on your machine. If you haven’t installed it yet, you can download it following the guide here: [Installing PowerShell on Windows | Microsoft Learn](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5). -- **Administrative privileges are not required** unless you're modifying system-wide environment variables. You can modify your **user-specific PATH** without admin rights. - -## Steps to Add PowerShell 7 to PATH - -### 1. Open **System Properties** - - Press `Win + X` and choose **System**. - - Click on **Advanced system settings** on the left sidebar. This will open the **System Properties** window. - - In the **System Properties** window, click on the **Environment Variables** button at the bottom. - -### 2. Edit User Environment Variables - - In the **Environment Variables** window, under **User variables**, find the `Path` variable. - - Select the `Path` variable and click **Edit**. (If the `Path` variable doesn’t exist, click **New** and name it `Path`.) - -### 3. Check if PowerShell 7 Path is Already in PATH - - Before adding the path, make sure the following path is not already present in the list: - ``` - C:\Program Files\PowerShell\7\ - ``` - - If the path is already there, you don't need to add it again. -### 4. Add PowerShell 7 Path - - If the path is not already in the list, click **New** in the **Edit Environment Variable** window. - - Add the following path to the list: - ``` - C:\Program Files\PowerShell\7\ - ``` - > **Note:** If you installed PowerShell 7 in a custom location, replace the above path with the correct one. -### 5. Save Changes - - After adding the path, click **OK** to close the **Edit Environment Variable** window. - - Click **OK** again to close the **Environment Variables** window. - - Finally, click **OK** to exit the **System Properties** window. -### 6. Verify PowerShell 7 in PATH - - Open **Command Prompt** or **Run** (press `Win + R`). - - Type `pwsh` and press Enter. - - If PowerShell 7 opens, you've successfully added it to your PATH! ---- -## Troubleshooting -- **PowerShell 7 not opening:** Ensure the path to PowerShell 7 is entered correctly. If you're using a custom installation folder, check that the correct path is added to the `Path` variable. -- **Changes not taking effect:** Try restarting your computer or logging out and logging back in for the changes to apply. \ No newline at end of file diff --git a/archive-doc-gen/docs/QuotaCheck.md b/archive-doc-gen/docs/QuotaCheck.md deleted file mode 100644 index 7cde62681..000000000 --- a/archive-doc-gen/docs/QuotaCheck.md +++ /dev/null @@ -1,103 +0,0 @@ -## Check Quota Availability Before Deployment - -Before deploying the accelerator, **ensure sufficient quota availability** for the required model. - -> **For Global Standard |GPT-4.1- the capacity to at least 150k tokens post-deployment for optimal performance.** - -> **For Standard | GPT-4 - ensure a minimum of 30k–40k tokens for best results.** - -### Login if you have not done so already -``` -azd auth login -``` - - -### 📌 Default Models & Capacities: -``` -gpt4.1:150, text-embedding-ada-002:80, gpt-4:150 -``` -### 📌 Default Regions: -``` -francecentral, australiaeast, uksouth, eastus2, northcentralus, swedencentral, westus, westus2, southcentralus -``` -### Usage Scenarios: -- No parameters passed → Default models and capacities will be checked in default regions. -- Only model(s) provided → The script will check for those models in the default regions. -- Only region(s) provided → The script will check default models in the specified regions. -- Both models and regions provided → The script will check those models in the specified regions. -- `--verbose` passed → Enables detailed logging output for debugging and traceability. - -### **Input Formats** -> Use the --models, --regions, and --verbose options for parameter handling: - -✔️ Run without parameters to check default models & regions without verbose logging: - ``` - ./quota_check_params.sh - ``` -✔️ Enable verbose logging: - ``` - ./quota_check_params.sh --verbose - ``` -✔️ Check specific model(s) in default regions: - ``` - ./quota_check_params.sh --models gpt4.1:150,text-embedding-ada-002:80 - ``` -✔️ Check default models in specific region(s): - ``` -./quota_check_params.sh --regions eastus2,westus - ``` -✔️ Passing Both models and regions: - ``` - ./quota_check_params.sh --models gpt4.1:150 --regions eastus2,westus2 - ``` -✔️ All parameters combined: - ``` - ./quota_check_params.sh --models gpt-4:150,text-embedding-ada-002:80 --regions eastus2,westus --verbose - ``` - -### **Sample Output** -The final table lists regions with available quota. You can select any of these regions for deployment. - -![quota-check-ouput](images/quota-check-output.png) - ---- -### **If using Azure Portal and Cloud Shell** - -1. Navigate to the [Azure Portal](https://portal.azure.com). -2. Click on **Azure Cloud Shell** in the top right navigation menu. -3. Run the appropriate command based on your requirement: - - **To check quota for the deployment** - - ```sh - curl -L -o quota_check_params.sh "https://raw.githubusercontent.com/microsoft/document-generation-solution-accelerator/main/scripts/quota_check_params.sh" - chmod +x quota_check_params.sh - ./quota_check_params.sh - ``` - - Refer to [Input Formats](#input-formats) for detailed commands. - -### **If using VS Code or Codespaces** -1. Open the terminal in VS Code or Codespaces. -2. If you're using VS Code, click the dropdown on the right side of the terminal window, and select `Git Bash`. - ![git_bash](images/git_bash.png) -3. Navigate to the `scripts` folder where the script files are located and make the script as executable: - ```sh - cd scripts - chmod +x quota_check_params.sh - ``` -4. Run the appropriate script based on your requirement: - - **To check quota for the deployment** - - ```sh - ./quota_check_params.sh - ``` - - Refer to [Input Formats](#input-formats) for detailed commands. - -5. If you see the error `_bash: az: command not found_`, install Azure CLI: - - ```sh - curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash - az login - ``` -6. Rerun the script after installing Azure CLI. diff --git a/archive-doc-gen/docs/README_LOCAL.md b/archive-doc-gen/docs/README_LOCAL.md deleted file mode 100644 index 26def2e2c..000000000 --- a/archive-doc-gen/docs/README_LOCAL.md +++ /dev/null @@ -1,218 +0,0 @@ -### Deploy from your local machine - -#### Local Setup: Basic Chat Experience -1. Copy `.env.sample` present in `src` folder to a new file called `.env` and configure the settings as described in the [Environment variables](#environment-variables) section. - - These variables are required: - - `AZURE_OPENAI_RESOURCE` - - `AZURE_OPENAI_MODEL` - - These variables are optional: - - `AZURE_OPENAI_TEMPERATURE` - - `AZURE_OPENAI_TOP_P` - - `AZURE_OPENAI_MAX_TOKENS` - - `AZURE_OPENAI_STOP_SEQUENCE` - - `AZURE_OPENAI_SYSTEM_MESSAGE` - - See the [documentation](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference#example-response-2) for more information on these parameters. - -2. Start the app with `start.cmd` or `start.sh`. This will build the frontend, install backend dependencies, and then start the app. Or, just run the backend in debug mode using the VSCode debug configuration in `.vscode/launch.json`. - -3. You can see the local running app at http://127.0.0.1:50505. If you experience a port conflict and the app does not load, stop the application in the terminal (CTRL-C on Windows), edit the `start.cmd` file and change the port to a value not in use (i.e., 5000). - -NOTE: You may find you need to set: MacOS: `export NODE_OPTIONS="--max-old-space-size=8192"` or Windows: `set NODE_OPTIONS=--max-old-space-size=8192` to avoid running out of memory when building the frontend. - -#### Local Setup: Chat with your data using Azure Cognitive Search -[More information about Azure OpenAI on your data](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data) - -1. Update the `AZURE_OPENAI_*` environment variables as described above. -2. To connect to your data, you need to specify an Azure Cognitive Search index to use. You can [create this index yourself](https://learn.microsoft.com/en-us/azure/search/search-get-started-portal) or use the [Azure AI Foundry](https://oai.azure.com/portal/chat) to create the index for you. - - These variables are required when adding your data with Azure AI Search: - - `DATASOURCE_TYPE` (should be set to `AzureCognitiveSearch`) - - `AZURE_SEARCH_SERVICE` - - `AZURE_SEARCH_INDEX` - - These variables are optional: - - `AZURE_SEARCH_USE_SEMANTIC_SEARCH` - - `AZURE_SEARCH_SEMANTIC_SEARCH_CONFIG` - - `AZURE_SEARCH_INDEX_TOP_K` - - `AZURE_SEARCH_ENABLE_IN_DOMAIN` - - `AZURE_SEARCH_CONTENT_COLUMNS` - - `AZURE_SEARCH_FILENAME_COLUMN` - - `AZURE_SEARCH_TITLE_COLUMN` - - `AZURE_SEARCH_URL_COLUMN` - - `AZURE_SEARCH_VECTOR_COLUMNS` - - `AZURE_SEARCH_QUERY_TYPE` - - `AZURE_SEARCH_PERMITTED_GROUPS_COLUMN` - - `AZURE_SEARCH_STRICTNESS` - - `AZURE_OPENAI_EMBEDDING_NAME` - -3. Start the app with `start.cmd` or `start.sh`. This will build the frontend, install backend dependencies, and then start the app. Or, just run the backend in debug mode using the VSCode debug configuration in `.vscode/launch.json`. -4. You can see the local running app at http://127.0.0.1:50505. If you experience a port conflict and the app does not load, stop the application in the terminal (CTRL-C on Windows), edit the `start.cmd` file and change the port to a value not in use (i.e., 5000). - -NOTE: You may find you need to set: MacOS: `export NODE_OPTIONS="--max-old-space-size=8192"` or Windows: `set NODE_OPTIONS=--max-old-space-size=8192` to avoid running out of memory when building the frontend. - -#### Local Setup: Enable Chat History -To enable chat history, you will need to set up CosmosDB resources. The ARM template in the `infrastructure` folder can be used to deploy an app service and a CosmosDB with the database and container configured. Then specify these additional environment variables: -- `AZURE_COSMOSDB_ACCOUNT` -- `AZURE_COSMOSDB_DATABASE` -- `AZURE_COSMOSDB_CONVERSATIONS_CONTAINER` -- `AZURE_COSMOSDB_ACCOUNT_KEY` - -As above, start the app with `start.cmd` or `start.sh`, then visit the local running app at http://127.0.0.1:50505. Or, just run the backend in debug mode using the VSCode debug configuration in `.vscode/launch.json`. If you experience a port conflict and the app does not load, stop the application in the terminal (CTRL-C on Windows), edit the `start.cmd` file and change the port to a value not in use (i.e., 5000). - -#### Local Setup: Enable Message Feedback -To enable message feedback, you will need to set up CosmosDB resources. Then specify these additional environment variable: - -/.env -- `AZURE_COSMOSDB_ENABLE_FEEDBACK=True` - -#### Deploy with the Azure CLI -**NOTE**: If you've made code changes, be sure to **build the app code** with `start.cmd` or `start.sh` before you deploy, otherwise your changes will not be picked up. If you've updated any files in the `frontend` folder, make sure you see updates to the files in the `static` folder before you deploy. - -You can use the [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) to deploy the app from your local machine. Make sure you have version 2.48.1 or later. - -If this is your first time deploying the app, you can use [az webapp up](https://learn.microsoft.com/en-us/cli/azure/webapp?view=azure-cli-latest#az-webapp-up). Run the following two commands from the `src` folder of the repo, updating the placeholder values to your desired app name, resource group, location, and subscription. You can also change the SKU if desired. - -1. `az webapp up --runtime PYTHON:3.11 --sku B1 --name --resource-group --location --subscription ` -1. `az webapp config set --startup-file "python3 -m gunicorn app:app" --name --resource-group ` - -If you've deployed the app previously, first run this command to update the appsettings to allow local code deployment: - -`az webapp config appsettings set -g -n --settings WEBSITE_WEBDEPLOY_USE_SCM=false` - -Check the runtime stack for your app by viewing the app service resource in the Azure Portal. If it shows "Python - 3.10", use `PYTHON:3.10` in the runtime argument below. If it shows "Python - 3.11", use `PYTHON:3.11` in the runtime argument below. - -Check the SKU in the same way. Use the abbreviated SKU name in the argument below, e.g. for "Basic (B1)" the SKU is `B1`. - -Then, use these commands from `src` folder to deploy your local code to the existing app: - -1. `az webapp up --runtime --sku --name --resource-group ` -1. `az webapp config set --startup-file "python3 -m gunicorn app:app" --name --resource-group ` - -Make sure that the app name and resource group match exactly for the app that was previously deployed. - -Deployment will take several minutes. When it completes, you should be able to navigate to your app at {app-name}.azurewebsites.net. - -### Add an identity provider -After deployment, you will need to add an identity provider to provide authentication support in your app. See [this tutorial](https://learn.microsoft.com/en-us/azure/app-service/scenario-secure-app-authentication-app-service) for more information. - -If you don't add an identity provider, the chat functionality of your app will be blocked to prevent unauthorized access to your resources and data. - -To remove this restriction, you can add `AUTH_ENABLED=False` to the environment variables. This will disable authentication and allow anyone to access the chat functionality of your app. **This is not recommended for production apps.** - -To add further access controls, update the logic in `getUserInfoList` in `frontend/src/pages/chat/Chat.tsx`. - -### Common Customization Scenarios (e.g. updating the default chat logo and headers) - -The interface allows for easy adaptation of the UI by modifying certain elements, such as the title and logo, through the use of [environment variables](#environment-variables). - -- `UI_TITLE` -- `UI_LOGO` -- `UI_CHAT_TITLE` -- `UI_CHAT_LOGO` -- `UI_CHAT_DESCRIPTION` -- `UI_FAVICON` -- `UI_SHOW_SHARE_BUTTON` - -Feel free to fork this repository and make your own modifications to the UX or backend logic. You can modify the source (`frontend/src`). For example, you may want to change aspects of the chat display, or expose some of the settings in `app.py` in the UI for users to try out different behaviors. After your code changes, you will need to rebuild the front-end via `start.sh` or `start.cmd`. - -### Scalability -You can configure the number of threads and workers in `gunicorn.conf.py`. After making a change, redeploy your app using the commands listed above. - -See the [Oryx documentation](https://github.com/microsoft/Oryx/blob/main/doc/configuration.md) for more details on these settings. - -### Debugging your deployed app -First, add an environment variable on the app service resource called "DEBUG". Set this to "true". - -Next, enable logging on the app service. Go to "App Service logs" under Monitoring, and change Application logging to File System. Save the change. - -Now, you should be able to see logs from your app by viewing "Log stream" under Monitoring. - -### Configuring vector search -When using your own data with a vector index, ensure these settings are configured on your app: -- `AZURE_SEARCH_QUERY_TYPE`: can be `vector`, `vectorSimpleHybrid`, or `vectorSemanticHybrid`, -- `AZURE_OPENAI_EMBEDDING_NAME`: the name of your Ada (text-embedding-ada-002) model deployment on your Azure OpenAI resource. -- `AZURE_SEARCH_VECTOR_COLUMNS`: the vector columns in your index to use when searching. Join them with `|` like `contentVector|titleVector`. - -### Changing Citation Display -The Citation panel is defined at the end of `frontend/src/pages/chat/Chat.tsx`. The citations returned from Azure OpenAI On Your Data will include `content`, `title`, `filepath`, and in some cases `url`. You can customize the Citation section to use and display these as you like. For example, the title element is a clickable hyperlink if `url` is not a blob URL. - -``` -
onViewSource(activeCitation)} - >{activeCitation.title}
- - const onViewSource = (citation: Citation) => { - if (citation.url && !citation.url.includes("blob.core")) { - window.open(citation.url, "_blank"); - } - }; - -``` - - -### Best Practices -We recommend keeping these best practices in mind: - -- Reset the chat session (clear chat) if the user changes any settings. Notify the user that their chat history will be lost. -- Clearly communicate to the user what impact each setting will have on their experience. -- When you rotate API keys for your AOAI or ACS resource, be sure to update the app settings for each of your deployed apps to use the new key. -- Pull in changes from `main` frequently to ensure you have the latest bug fixes and improvements, especially when using Azure OpenAI on your data. - -**A note on Azure OpenAI API versions**: The application code in this repo will implement the request and response contracts for the most recent preview API version supported for Azure OpenAI. To keep your application up-to-date as the Azure OpenAI API evolves with time, be sure to merge the latest API version update into your own application code and redeploy using the methods described in this document. - -## Environment variables - -Note: settings starting with `AZURE_SEARCH` are only needed when using Azure OpenAI on your data with Azure AI Search. If not connecting to your data, you only need to specify `AZURE_OPENAI` settings. - -| App Setting | Value | Note | -| --- | --- | ------------- | -|AZURE_AI_AGENT_API_VERSION|2025-01-01-preview| API version when using the Azure Foundry agent on your data.| -|AZURE_AI_AGENT_ENDPOINT||The endpoint of the Azure AI foundry project| -|AZURE_AI_AGENT_MODEL_DEPLOYMENT_NAME||The name of the gpt model| -|AZURE_SEARCH_SERVICE||The name of your Azure AI Search resource| -|AZURE_SEARCH_INDEX||The name of your Azure AI Search Index| -|AZURE_SEARCH_USE_SEMANTIC_SEARCH|False|Whether or not to use semantic search| -|AZURE_SEARCH_QUERY_TYPE|simple|Query type: simple, semantic, vector, vectorSimpleHybrid, or vectorSemanticHybrid. Takes precedence over AZURE_SEARCH_USE_SEMANTIC_SEARCH| -|AZURE_SEARCH_SEMANTIC_SEARCH_CONFIG||The name of the semantic search configuration to use if using semantic search.| -|AZURE_SEARCH_TOP_K|5|The number of documents to retrieve from Azure AI Search.| -|AZURE_SEARCH_ENABLE_IN_DOMAIN|True|Limits responses to only queries relating to your data.| -|AZURE_SEARCH_CONTENT_COLUMNS||List of fields in your Azure AI Search index that contains the text content of your documents to use when formulating a bot response. Represent these as a string joined with "|", e.g. `"product_description|product_manual"`| -|AZURE_SEARCH_FILENAME_COLUMN|| Field from your Azure AI Search index that gives a unique identifier of the source of your data to display in the UI.| -|AZURE_SEARCH_TITLE_COLUMN||Field from your Azure AI Search index that gives a relevant title or header for your data content to display in the UI.| -|AZURE_SEARCH_URL_COLUMN||Field from your Azure AI Search index that contains a URL for the document, e.g. an Azure Blob Storage URI. This value is not currently used.| -|AZURE_SEARCH_VECTOR_COLUMNS||List of fields in your Azure AI Search index that contain vector embeddings of your documents to use when formulating a bot response. Represent these as a string joined with "|", e.g. `"product_description|product_manual"`| -|AZURE_SEARCH_PERMITTED_GROUPS_COLUMN||Field from your Azure AI Search index that contains AAD group IDs that determine document-level access control.| -|AZURE_SEARCH_STRICTNESS|3|Integer from 1 to 5 specifying the strictness for the model limiting responses to your data.| -|AZURE_OPENAI_RESOURCE||the name of your Azure OpenAI resource| -|AZURE_OPENAI_MODEL||The name of your model deployment| -|AZURE_OPENAI_ENDPOINT||The endpoint of your Azure OpenAI resource.| -|AZURE_OPENAI_MODEL_NAME|gpt-35-turbo-16k|The name of the model| -|AZURE_OPENAI_TEMPERATURE|0|What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. A value of 0 is recommended when using your data.| -|AZURE_OPENAI_TOP_P|1.0|An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. We recommend setting this to 1.0 when using your data.| -|AZURE_OPENAI_MAX_TOKENS|1000|The maximum number of tokens allowed for the generated answer.| -|AZURE_OPENAI_STOP_SEQUENCE||Up to 4 sequences where the API will stop generating further tokens. Represent these as a string joined with "|", e.g. `"stop1|stop2|stop3"`| -|AZURE_OPENAI_SYSTEM_MESSAGE|You are an AI assistant that helps people find information.|A brief description of the role and tone the model should use| -|AZURE_OPENAI_PREVIEW_API_VERSION|2024-02-15-preview|API version when using Azure OpenAI on your data| -|AZURE_OPENAI_STREAM|True|Whether or not to use streaming for the response| -|AZURE_OPENAI_EMBEDDING_NAME||The name of your embedding model deployment if using vector search. -|UI_TITLE|Contoso| Chat title (left-top) and page title (HTML) -|UI_LOGO|| Logo (left-top). Defaults to Contoso logo. Configure the URL to your logo image to modify. -|UI_CHAT_LOGO|| Logo (chat window). Defaults to Contoso logo. Configure the URL to your logo image to modify. -|UI_CHAT_TITLE|Start chatting| Title (chat window) -|UI_CHAT_DESCRIPTION|This chatbot is configured to answer your questions| Description (chat window) -|UI_FAVICON|| Defaults to Contoso favicon. Configure the URL to your favicon to modify. -|UI_SHOW_SHARE_BUTTON|True|Share button (right-top) -|SANITIZE_ANSWER|False|Whether to sanitize the answer from Azure OpenAI. Set to True to remove any HTML tags from the response.| -|USE_PROMPTFLOW|False|Use existing Promptflow deployed endpoint. If set to `True` then both `PROMPTFLOW_ENDPOINT` and `PROMPTFLOW_API_KEY` also need to be set.| -|PROMPTFLOW_ENDPOINT||URL of the deployed Promptflow endpoint e.g. https://pf-deployment-name.region.inference.ml.azure.com/score| -|PROMPTFLOW_API_KEY||Auth key for deployed Promptflow endpoint. Note: only Key-based authentication is supported.| -|PROMPTFLOW_RESPONSE_TIMEOUT|120|Timeout value in seconds for the Promptflow endpoint to respond.| -|PROMPTFLOW_REQUEST_FIELD_NAME|query|Default field name to construct Promptflow request. Note: chat_history is auto constucted based on the interaction, if your API expects other mandatory field you will need to change the request parameters under `promptflow_request` function.| -|PROMPTFLOW_RESPONSE_FIELD_NAME|reply|Default field name to process the response from Promptflow request.| -|PROMPTFLOW_CITATIONS_FIELD_NAME|documents|Default field name to process the citations output from Promptflow request.| diff --git a/archive-doc-gen/docs/SampleQuestions.md b/archive-doc-gen/docs/SampleQuestions.md deleted file mode 100644 index 6c569607b..000000000 --- a/archive-doc-gen/docs/SampleQuestions.md +++ /dev/null @@ -1,37 +0,0 @@ -# Sample Questions - -To help you get started, here are some **Sample Prompts** you can ask in the app: - -> _Note: Average response time is 07 -16 seconds._
- -## **Sections** - -### **Browse** -The Browse section allows users to explore and retrieve information related to promissory notes. Key functionalities include: - -_Sample Questions:_ - -- What are typical sections in a promissory note? -- List the details of two promissory notes governed by the laws of the state of California. - -### **Generate** -The Generate section enables users to create new promissory notes with customizable options. Key features include: - -_Sample Questions:_ - -- Generate a promissory note with a proposed $100,000 for Washington State. -- Remove (section) (Any displayed section you can add). -- Add a Payment acceleration clause after the payment terms section. -- Click on Generate Draft. - -![GenerateDraft](images/GenerateDraft.png) - -### **Draft** -The Draft section ensures accuracy and completeness of the generated promissory notes. Key tasks include: - -_Sample operation:_ - -- Task: Re-generate text boxes if they did not populate for any section. -- Task: Re-generate text box for Borrower with the name: Jane Smith. - -This structured approach ensures that users can efficiently browse, create, and refine promissory notes while maintaining legal compliance and document accuracy. diff --git a/archive-doc-gen/docs/TRANSPARENCY_FAQ.md b/archive-doc-gen/docs/TRANSPARENCY_FAQ.md deleted file mode 100644 index ace333547..000000000 --- a/archive-doc-gen/docs/TRANSPARENCY_FAQ.md +++ /dev/null @@ -1,17 +0,0 @@ -## Document Generation Solution Accelerator: Responsible AI FAQ -- ### What is Build your own copilot - Generic Solution Accelerator? - This solution accelerator is an open-source GitHub Repository to help create AI assistants using Azure OpenAI Service and Azure AI Search. This can be used by anyone looking for reusable architecture and code snippets to build AI assistants with their own enterprise data. The repository showcases a generic scenario of a user who wants to generate a document template based on a sample set of data. - -- ### What can Document Generation Solution Accelerator do? - The sample solution included focuses on a generic use case - chat with your own data, generate a document template using your own data, and exporting the document in a docx format. The sample data is sourced from generic AI-generated promissory notes. The documents are intended for use as sample data only. The sample solution takes user input in text format and returns LLM responses in text format up to 800 tokens. It uses prompt flow to search data from AI search vector store, summarize the retrieved documents with Azure OpenAI. - -- ### What is/are Document Generation Solution Accelerator’s intended use(s)? - This repository is to be used only as a solution accelerator following the open-source license terms listed in the GitHub repository. The example scenario’s intended purpose is to help users generate a document template to perform their work more efficiently. - -- ### How was Document Generation Solution Accelerator evaluated? What metrics are used to measure performance? - We have used AI Foundry Prompt flow evaluation SDK to test for harmful content, groundedness, and potential security risks. - -- ### What are the limitations of Document Generation Solution Accelerator? How can users minimize the impact of Document Generation Solution Accelerator’s limitations when using the system? - This solution accelerator can only be used as a sample to accelerate the creation of AI assistants. The repository showcases a sample scenario of a user generating a document template. Users should review the system prompts provided and update as per their organizational guidance. Users should run their own evaluation flow either using the guidance provided in the GitHub repository or their choice of evaluation methods. AI-generated content may be inaccurate and should be manually reviewed. Currently, the sample repo is available in English only. -- ### What operational factors and settings allow for effective and responsible use of Document Generation Solution Accelerator? - Users can try different values for some parameters like system prompt, temperature, max tokens etc. shared as configurable environment variables while running run evaluations for AI assistants. Please note that these parameters are only provided as guidance to start the configuration but not as a complete available list to adjust the system behavior. Please always refer to the latest product documentation for these details or reach out to your Microsoft account team if you need assistance. diff --git a/archive-doc-gen/docs/TroubleShootingSteps.md b/archive-doc-gen/docs/TroubleShootingSteps.md deleted file mode 100644 index 28eb59885..000000000 --- a/archive-doc-gen/docs/TroubleShootingSteps.md +++ /dev/null @@ -1,157 +0,0 @@ -# 🛠️ Troubleshooting - -When deploying Azure resources, you may come across different error codes that stop or delay the deployment process. This section lists some of the most common errors along with possible causes and step-by-step resolutions. - -Use these as quick reference guides to unblock your deployments. - -## ⚡ Most Frequently Encountered Errors - -| Error Code | Common Cause | Full Details | -|------------|--------------|--------------| -| **InsufficientQuota** | Not enough quota available in subscription | [View Solution](#quota--capacity-limitations) | -| **MissingSubscriptionRegistration** | Required feature not registered in subscription | [View Solution](#subscription--access-issues) | -| **ResourceGroupNotFound** | RG doesn't exist or using old .env file | [View Solution](#resource-group--deployment-management) | -| **DeploymentModelNotSupported** | Model not available in selected region | [View Solution](#regional--location-issues) | -| **DeploymentNotFound** | Deployment record not found or was deleted | [View Solution](#resource-group--deployment-management) | -| **ResourceNotFound** | Resource does not exist or cannot be found | [View Solution](#resource-identification--references) | -| **SpecialFeatureOrQuotaIdRequired** | Subscription lacks access to specific model | [View Solution](#subscription--access-issues) | -| **ContainerAppOperationError** | Improperly built container image | [View Solution](#miscellaneous) | -| **ServiceUnavailable** | Service not available in selected region | [View Solution](#regional--location-issues) | -| **BadRequest - DatabaseAccount is in a failed provisioning state** | Previous deployment failed | [View Solution](#resource-state--provisioning) | -| **Unauthorized - Operation cannot be completed
without additional quota** | Insufficient quota for requested operation | [View Solution](#subscription--access-issues) | -| **ResourceGroupBeingDeleted** | Resource group deletion in progress | [View Solution](#resource-group--deployment-management) | -| **FlagMustBeSetForRestore** | Soft-deleted resource requires restore flag or purge | [View Solution](#miscellaneous) | -| **ParentResourceNotFound** | Parent resource does not exist or cannot be found | [View Solution](#resource-identification--references) | -| **AccountProvisioningStateInvalid** | Resource used before provisioning completed | [View Solution](#resource-state--provisioning) | -| **InternalSubscriptionIsOverQuotaForSku** | Subscription quota exceeded for the requested SKU | [View Solution](#quota--capacity-limitations) | -| **InvalidResourceGroup** | Invalid resource group configuration | [View Solution](#resource-group--deployment-management) | -| **RequestDisallowedByPolicy** | Azure Policy blocking the requested operation | [View Solution](#subscription--access-issues) | - -## 📖 Table of Contents - -- [Subscription & Access Issues](#subscription--access-issues) -- [Quota & Capacity Limitations](#quota--capacity-limitations) -- [Regional & Location Issues](#regional--location-issues) -- [Resource Naming & Validation](#resource-naming--validation) -- [Resource Identification & References](#resource-identification--references) -- [Network & Infrastructure Configuration](#network--infrastructure-configuration) -- [Configuration & Property Errors](#configuration--property-errors) -- [Resource State & Provisioning](#resource-state--provisioning) -- [Miscellaneous](#miscellaneous) - -## Subscription & Access Issues - -| Issue/Error Code | Description | Steps to Resolve | -|-----------|-------------|------------------| -| **ReadOnlyDisabledSubscription** | Subscription is disabled or in read-only state |
  • Check if you have an active subscription before starting the deployment
  • Depending on the type of the Azure Subscription, the expiration date might have been reached
  • You have to activate the Azure Subscription before creating any Azure resource
  • Refer to [Reactivate a disabled Azure subscription](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/subscription-disabled) documentation
| -| **MissingSubscriptionRegistration/
AllowBringYourOwnPublicIpAddress** | Required feature not registered in subscription | **Enable `AllowBringYourOwnPublicIpAddress` Feature**

Before deploying the resources, you may need to enable the **Bring Your Own Public IP Address** feature in Azure. This is required only once per subscription.

**Steps:**
  • Run the following command to register the feature:
    `az feature register --namespace Microsoft.Network --name AllowBringYourOwnPublicIpAddress`
  • Wait for the registration to complete. Check the status using:
    `az feature show --namespace Microsoft.Network --name AllowBringYourOwnPublicIpAddress --query properties.state`
  • The output should show: "Registered"
  • Once the feature is registered, refresh the provider:
    `az provider register --namespace Microsoft.Network`
💡 Note: Feature registration may take several minutes to complete. This needs to be done only once per Azure subscription. | -| **Unauthorized - Operation cannot be completed without additional quota** | Insufficient quota for requested operation |
  • Check your quota usage using:
    `az vm list-usage --location "" -o table`
  • To request more quota refer to [VM Quota Request](https://techcommunity.microsoft.com/blog/startupsatmicrosoftblog/how-to-increase-quota-for-specific-types-of-azure-virtual-machines/3792394)
| -| **CrossTenantDeploymentNotPermitted** | Deployment across different Azure AD tenants not allowed |
  • **Check tenant match:** Ensure your deployment identity (user/SP) and the target resource group are in the same tenant:
    `az account show`
    `az group show --name `
  • **Verify pipeline/service principal:** If using CI/CD, confirm the service principal belongs to the same tenant and has permissions on the resource group
  • **Avoid cross-tenant references:** Make sure your Bicep doesn't reference subscriptions, resource groups, or resources in another tenant
  • **Test minimal deployment:** Deploy a simple resource to the same resource group to confirm identity and tenant are correct
  • **Guest/external accounts:** Avoid using guest users from other tenants; use native accounts or SPs in the tenant
| -| **RequestDisallowedByPolicy** | Azure Policy blocking the requested operation |
  • This typically indicates that an Azure Policy is preventing the requested action due to policy restrictions in your subscription
  • For more details and guidance on resolving this issue, refer to: [RequestDisallowedByPolicy](https://learn.microsoft.com/en-us/troubleshoot/azure/azure-kubernetes/create-upgrade-delete/error-code-requestdisallowedbypolicy)
| -| **SpecialFeatureOrQuotaIdRequired** | Subscription lacks access to specific Azure OpenAI models | This error occurs when your subscription does not have access to certain Azure OpenAI models.

**Example error message:**
`SpecialFeatureOrQuotaIdRequired: The current subscription does not have access to this model 'Format:OpenAI,Name:o3,Version:2025-04-16'.`

**Resolution:**
To gain access, submit a request using the official form:
👉 [Azure OpenAI Model Access Request](https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUQ1VGQUEzRlBIMVU2UFlHSFpSNkpOR0paRSQlQCN0PWcu)

You'll need to use this form if you require access to the following restricted models:
  • gpt-5
  • o3
  • o3-pro
  • deep research
  • reasoning summary
  • gpt-image-1
Once your request is approved, redeploy your resource. | -| **ResourceProviderError** | Resource provider not registered in subscription |
  • This error occurs when the resource provider is not registered in your subscription
  • To register it, refer to [Register Resource Provider](https://learn.microsoft.com/en-us/azure/azure-resource-manager/troubleshooting/error-register-resource-provider?tabs=azure-cli) documentation
| - --------------------------------- - -## Quota & Capacity Limitations - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **InternalSubscriptionIsOverQuotaForSku/
ManagedEnvironmentProvisioningError** | Subscription quota exceeded for the requested SKU | Quotas are applied per resource group, subscriptions, accounts, and other scopes. For example, your subscription might be configured to limit the number of vCPUs for a region. If you attempt to deploy a virtual machine with more vCPUs than the permitted amount, you receive an error that the quota was exceeded.

For PowerShell, use the `Get-AzVMUsage` cmdlet to find virtual machine quotas:
`Get-AzVMUsage -Location "West US"`

Based on available quota you can deploy application otherwise, you can request for more quota | -| **InsufficientQuota** | Not enough quota available in subscription |
  • Check if you have sufficient quota available in your subscription before deployment
  • To verify, refer to the [quota_check](../docs/QuotaCheck.md) file for details
| -| **MaxNumberOfRegionalEnvironmentsInSubExceeded** | Maximum Container App Environments limit reached for region |This error occurs when you attempt to create more **Azure Container App Environments** than the regional quota limit allows for your subscription. Each Azure region has a specific limit on the number of Container App Environments that can be created per subscription.

**Common Causes:**
  • Deploying to regions with low quota limits (e.g., Sweden Central allows only 1 environment)
  • Multiple deployments without cleaning up previous environments
  • Exceeding the standard limit of 15 environments in most major regions

**Resolution:**
  • **Delete unused environments** in the target region, OR
  • **Deploy to a different region** with available capacity, OR
  • **Request quota increase** via [Azure Support](https://go.microsoft.com/fwlink/?linkid=2208872)

**Reference:**
  • [Azure Container Apps quotas](https://learn.microsoft.com/en-us/azure/container-apps/quotas)
  • [Azure subscription and service limits](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits)
| -| **SkuNotAvailable** | Requested SKU not available in selected location or zone | You receive this error in the following scenarios:
  • When the resource SKU you've selected, such as VM size, isn't available for a location or zone
  • If you're deploying an Azure Spot VM or Spot scale set instance, and there isn't any capacity for Azure Spot in this location. For more information, see Spot error messages
| -| **Conflict - No available instances to satisfy this request** | Azure App Service has insufficient capacity in the region | This error occurs when Azure App Service doesn't have enough available compute instances in the selected region to provision or scale your app.

**Common Causes:**
  • High demand in the selected region (e.g., East US, West Europe)
  • Specific SKUs experiencing capacity constraints (Free, Shared, or certain Premium tiers)
  • Multiple rapid deployments in the same region

**Resolution:**
  • **Wait and Retry** (15-30 minutes): `azd up`
  • **Deploy to a New Resource Group** (Recommended for urgent cases):
    ```
    azd down --force --purge
    azd up
    ```
  • **Try a Different Region:**
    Update region in `main.bicep` or `azure.yaml` to a less congested region (e.g., `westus2`, `centralus`, `northeurope`)
  • **Use a Different SKU/Tier:**
    If using Free/Shared tier, upgrade to Basic or Standard
    Check SKU availability: `az appservice list-locations --sku `

**Reference:** [Azure App Service Plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) | - --------------------------------- - -## Resource Group & Deployment Management - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **ResourceGroupNotFound** | Specified resource group does not exist | **Option 1:**
  • Go to [Azure Portal](https://portal.azure.com/#home)
  • Click on **"Resource groups"** option
    ![alt text](../docs/images/AzureHomePage.png)
  • Search for the resource group in the search bar. If it exists, you can proceed
    ![alt text](../docs/images/resourcegroup1.png)

**Option 2:**
  • This error can occur if you deploy using the same .env file from a previous deployment
  • Create a new environment before redeploying:
    `azd env new `
| -| **ResourceGroupBeingDeleted** | Resource group is currently being deleted | **Steps:**
  • Go to [Azure Portal](https://portal.azure.com/#home)
  • Go to resource group option and search for targeted resource group
  • If the resource group is being deleted, you cannot use it. Create a new one or use a different resource group
| -| **DeploymentActive** | Another deployment is already in progress in this resource group |
  • This occurs when a deployment is already in progress and another deployment is triggered in the same resource group
  • Cancel the ongoing deployment before starting a new one
  • Do not initiate a new deployment until the previous one is completed
| -| **DeploymentCanceled** | Deployment was canceled before completion |
  • **Check deployment history:**
    Go to Azure Portal → Resource Group → Deployments
    Review the detailed error message
  • **Identify the root cause:**
    Dependent resource failed to deploy
    Validation error occurred
    Manual cancellation was triggered
  • **Validate template:**
    `az deployment group validate --resource-group --template-file main.bicep`
  • **Check resource limits/quotas**
  • **Fix the failed dependency**
  • **Retry deployment:**
    `az deployment group create --resource-group --template-file main.bicep`

💡 **Note:** DeploymentCanceled is a wrapper error — check inner errors in deployment logs | -| **DeploymentCanceled(user.canceled)** | User manually canceled the deployment |
  • Deployment was manually canceled by the user (Portal, CLI, or pipeline)
  • Check deployment history and logs to confirm who/when it was canceled
  • If accidental, retry the deployment
  • For pipelines, ensure no automation or timeout is triggering cancellation
  • Use deployment locks or retry logic to prevent accidental cancellations
| -| **DeploymentNotFound** | Deployment record not found or was deleted |
  • This occurs when the user deletes a previous deployment along with the resource group, then redeploys the same RG with the same environment name but in a different location
  • Do not change the location when redeploying a deleted RG, OR
  • Use new names for the RG and environment during redeployment
| -| **ResourceGroupDeletionTimeout** | Resource group deletion exceeded timeout limit |
  • Some resources may be stuck deleting or have dependencies; check RG resources and status
  • Ensure no resource locks or Azure Policies are blocking deletion
  • Retry deletion via CLI/PowerShell:
    `az group delete --name --yes --no-wait`
  • Check Activity Log to identify failing resources
  • Escalate to Azure Support if deletion is stuck
| - --------------------------------- - -## Regional & Location Issues - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **LocationNotAvailableForResourceType** | Resource type not supported in selected region | This error occurs when you attempt to deploy a resource to a region that does not support that specific resource type or SKU.

**Resolution:**
  • **Verify resource availability by region:**
    `az provider show --namespace --query "resourceTypes[?resourceType==''].locations" -o table`
  • **Check Azure Products by Region:**
    [Azure Products by Region](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/)
  • **Supported regions for this deployment:**
    • `australiaeast`
    • `centralus`
    • `eastasia`
    • `eastus2`
    • `japaneast`
    • `northeurope`
    • `southeastasia`
    • `uksouth`
  • **Redeploy:**
    `azd up`
| -| **InvalidResourceLocation** | Cannot change region for already deployed resources | This error occurs when you attempt to modify the location/region of a resource that has already been deployed. Azure resources **cannot change regions** after creation.

**Resolution:**
  • **Option 1: Delete and Redeploy:**
    `azd down --force --purge`
    after purge redeploy app `azd up`
  • **Option 2: Create new environment with different region:**
    `azd env new `
    `azd env set AZURE_LOCATION `
    `azd up`
  • **Option 3: Keep existing deployment:**
    Revert configuration files to use the original region

⚠️ **Important:** Backup critical data before deleting resources.

**Reference:** [Move Azure resources across regions](https://learn.microsoft.com/en-us/azure/resource-mover/overview) | -| **ServiceUnavailable/ResourceNotFound** | Service unavailable or restricted in selected region |
  • Regions are restricted to guarantee compatibility with paired regions and replica locations for data redundancy and failover scenarios based on articles [Azure regions list](https://learn.microsoft.com/en-us/azure/reliability/regions-list) and [Azure Database for MySQL Flexible Server - Azure Regions](https://learn.microsoft.com/azure/mysql/flexible-server/overview#azure-regions)
  • You can request more quota, refer [Quota Request](https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/create-support-request-quota-increase) Documentation
| -| **ResourceOperationFailure/
ProvisioningDisabled** | Resource provisioning restricted or disabled in region |
  • This error occurs when provisioning of a resource is restricted in the selected region. It usually happens because the service is not available in that region or provisioning has been temporarily disabled
  • Regions are restricted to guarantee compatibility with paired regions and replica locations for data redundancy and failover scenarios based on articles [Azure regions list](https://learn.microsoft.com/en-us/azure/reliability/regions-list) and [Azure Database for MySQL Flexible Server - Azure Regions](https://learn.microsoft.com/azure/mysql/flexible-server/overview#azure-regions)
  • If you need to use the same region, you can request a quota or provisioning exception. Refer [Quota Request](https://docs.microsoft.com/en-us/azure/sql-database/quota-increase-request) for more details
| -| **RedundancyConfigurationNotAvailableInRegion** | Redundancy configuration not supported in selected region |
  • This issue happens when you try to create a **Storage Account** with a redundancy configuration (e.g., `Standard_GRS`) that is **not supported in the selected Azure region**
  • Example: Creating a storage account with **GRS** in **italynorth** will fail with error:
    `az storage account create -n mystorageacct123 -g myResourceGroup -l italynorth --sku Standard_GRS --kind StorageV2`
  • To check supported SKUs for your region:
    `az storage account list-skus -l italynorth -o table`
  • Use a supported redundancy option (e.g., Standard_LRS) in the same region or deploy the Storage Account in a region that supports your chosen redundancy
  • For more details, refer to [Azure Storage redundancy documentation](https://learn.microsoft.com/en-us/azure/storage/common/storage-redundancy?utm_source=chatgpt.com)
| - --------------------------------- - -## Resource Naming & Validation - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **ResourceNameInvalid** | Resource name violates naming convention rules |
  • Ensure the resource name is within the allowed length and naming rules defined for that specific resource type, you can refer [Resource Naming Convention](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/resource-name-rules) document
| -| **Workspace Name - InvalidParameter** | Workspace name does not meet required format | To avoid this errors in workspace ID follow below rules:
  • Must start and end with an alphanumeric character (letter or number)
  • Allowed characters: `a–z`, `0–9`, `- (hyphen)`
  • Cannot start or end with a hyphen -
  • No spaces, underscores (_), periods (.), or special characters
  • Must be unique within the Azure region & subscription
  • Length: 3–33 characters (for AML workspaces)
| -| **VaultNameNotValid** | Key Vault name does not meet naming requirements | In this template Vault name will be unique everytime, but if you trying to hard code the name then please make sure below points:
  • **Check name length** - Ensure the Key Vault name is between 3 and 24 characters
  • **Validate allowed characters** - The name can only contain letters (a–z, A–Z) and numbers (0–9). Hyphens are allowed, but not at the beginning or end, and not consecutive (--)
  • **Ensure proper start and end** - The name must start with a letter. The name must end with a letter or digit (not a hyphen)
  • **Test with a new name** - Example of a valid vault name: ✅ `cartersaikeyvault1`, ✅ `securevaultdemo`, ✅ `kv-project123`
| -| **BadRequest: Dns record under zone Document is already taken** | DNS record name already in use | This error can occur only when user hardcoding the CosmosDB Service name. To avoid this you can try few below suggestions:
  • Verify resource names are globally unique
  • If you already created an account/resource with same name in another subscription or resource group, check and delete it before reusing the name
  • By default in this template we are using unique prefix with every resource/account name to avoid this kind for errors
| - ---------------------------------- - -## Resource Identification & References - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **LinkedInvalidPropertyId/
ResourceNotFound/
DeploymentOutputEvaluationFailed/
CanNotRestoreANonExistingResource/
The language expression property array index is out of bounds** | Invalid or non-existent resource ID reference |
  • Before using any resource ID, ensure it follows the correct format
  • Verify that the resource ID you are passing actually exists
  • Make sure there are no typos in the resource ID
  • Verify that the provisioning state of the existing resource is `Succeeded` by running the following command to avoid this error while deployment or restoring the resource:
    `az resource show --ids --query "properties.provisioningState"`
  • Sample Resource IDs format:
    Log Analytics Workspace Resource ID: `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.OperationalInsights/workspaces/{workspaceName}`
    Azure AI Foundry Project Resource ID: `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.MachineLearningServices/workspaces/{name}`
  • You may encounter the error `The language expression property array index '8' is out of bounds` if the resource ID is incomplete. Please ensure your resource ID is correct and contains all required information, as shown in sample resource IDs
  • For more information refer [Resource Not Found errors solutions](https://learn.microsoft.com/en-us/azure/azure-resource-manager/troubleshooting/error-not-found?tabs=bicep)
| -| **ParentResourceNotFound** | Parent resource does not exist or cannot be found |
  • You can refer to the [Parent Resource Not found](https://learn.microsoft.com/en-us/azure/azure-resource-manager/troubleshooting/error-parent-resource?tabs=bicep) documentation if you encounter this error
| -| **PrincipalNotFound** | Principal ID does not exist in Azure AD tenant | This error occurs when the **principal ID** (Service Principal, User, or Group) specified in a role assignment or deployment does not exist in the Azure Active Directory tenant. It can also happen due to **replication delays** right after creating a new principal.

**Example causes:**
  • The specified **Object ID** is invalid or belongs to another tenant
  • The principal was recently created but Azure AD has not yet replicated it
  • Attempting to assign a role to a non-existing or deleted Service Principal/User/Group

**How to fix:**
  • Verify that the **principal ID is correct** and exists in the same directory/tenant:
    `az ad sp show --id `
  • If the principal was just created, wait a few minutes and retry
  • Explicitly set the principalType property (ServicePrincipal, User, or Group) in your ARM/Bicep template to avoid replication delays
  • If the principal does not exist, create it again before assigning roles
  • For more details, see [Azure PrincipalType documentation](https://learn.microsoft.com/en-us/azure/role-based-access-control/troubleshooting?tabs=bicep)
| -| **SubscriptionDoesNotHaveServer** | Referenced SQL Server does not exist in subscription | This issue happens when you try to reference an **Azure SQL Server** (`Microsoft.Sql/servers`) that does not exist in the selected subscription.

**It can occur if:**
  • The SQL server name is typed incorrectly
  • The SQL server was **deleted** but is still being referenced
  • You are working in the **wrong subscription context**
  • The server exists in a **different subscription/tenant** where you don't have access

**Reproduce:**
Run an Azure CLI command with a non-existent server name:
`az sql db list --server sql-doesnotexist --resource-group myResourceGroup`
or
`az sql server show --name sql-caqfrhxr4i3hyj --resource-group myResourceGroup`

**Resolution:**
  • Verify the SQL Server name exists in your subscription:
    `az sql server list --output table`
  • Make sure you are targeting the correct subscription:
    `az account show`
    `az account set --subscription `
  • If the server was deleted, either restore it (if possible) or update references to use a valid existing server
| - ---------------------------------- - -## Network & Infrastructure Configuration - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **NetcfgSubnetRangeOutsideVnet** | Subnet IP range outside virtual network address space |
  • Ensure the subnet's IP address range falls within the virtual network's address space
  • Always validate that the subnet CIDR block is a subset of the VNet range
  • For Azure Bastion, the AzureBastionSubnet must be at least /27
  • Confirm that the AzureBastionSubnet is deployed inside the VNet
| -| **DisableExport_PublicNetworkAccessMustBeDisabled** | Public network access must be disabled when export is disabled |
  • **Check container source:** Confirm whether the deployment is using a Docker image or Azure Container Registry (ACR)
  • **Verify ACR configuration:** If ACR is included, review its settings to ensure they comply with Azure requirements
  • **Check export settings:** If export is disabled in ACR, make sure public network access is also disabled
  • **Redeploy after fix:** Correct the configuration and redeploy. This will prevent the Conflict error during deployment
  • For more information refer [ACR Data Loss Prevention](https://learn.microsoft.com/en-us/azure/container-registry/data-loss-prevention) document
| - ---------------------------------- - -## Configuration & Property Errors - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **InvalidRequestContent** | Deployment contains unrecognized or missing required values |
  • The deployment values either include values that aren't recognized, or required values are missing. Confirm the values for your resource type
  • You can refer [Invalid Request Content error](https://learn.microsoft.com/en-us/azure/azure-resource-manager/troubleshooting/common-deployment-errors#:~:text=InvalidRequestContent,Template%20reference) documentation
| -| **Conflict - Cannot use the SKU Basic with File Change Audit for site** | File Change Audit not supported on Basic SKU |
  • This error happens because File Change Audit logs aren't supported on Basic SKU App Service Plans
  • Upgrading to Premium/Isolated SKU (supports File Change Audit), or
  • Disabling File Change Audit in Diagnostic Settings if you must stay on Basic
  • Always cross-check the [supported log types](https://aka.ms/supported-log-types) before adding diagnostic logs to your Bicep templates
| -| **AccountPropertyCannotBeUpdated** | Read-only property cannot be modified after creation | The property **`isHnsEnabled`** (Hierarchical Namespace for Data Lake Gen2) is **read-only** and can only be set during **storage account creation**. Once a storage account is created, this property **cannot be updated**. Trying to update it via ARM template, Bicep, CLI, or Portal will fail.

**Resolution:**
  • Create a **new storage account** with `isHnsEnabled=true` if you require hierarchical namespace
  • Migration may be needed if you already have data
  • Refer to [Storage Account Update Restrictions](https://aka.ms/storageaccountupdate) for more details
| - - ----------------------------------- - -## Resource State & Provisioning - -| Issue/Error Code | Description | Steps to Resolve | -|-----------------|-------------|------------------| -| **AccountProvisioningStateInvalid** | Resource used before provisioning completed |
  • The AccountProvisioningStateInvalid error occurs when you try to use resources while they are still in the Accepted provisioning state
  • This means the deployment has not yet fully completed
  • To avoid this error, wait until the provisioning state changes to Succeeded
  • Only use the resources once the deployment is fully completed
| -| **BadRequest - DatabaseAccount is in a failed provisioning state because the previous attempt to create it was not successful** | Database account failed to provision previously |
  • This error occurs when a user attempts to redeploy a resource that previously failed to provision
  • To resolve the issue, delete the failed deployment first, then start a new deployment
  • For guidance on deleting a resource from a Resource Group, refer to the following link: [Delete an Azure Cosmos DB account](https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/manage-with-powershell#delete-account:~:text=%3A%24enableMultiMaster-,Delete%20an%20Azure%20Cosmos%20DB%20account,-This%20command%20deletes)
| -| **ServiceDeleting** | Cannot provision service because deletion is still in progress | This error occurs when you attempt to create an Azure Search service with the same name as one that is currently being deleted. Azure Search services have a **soft-delete period** during which the service name remains reserved.

**Common causes:**
  • Deleting a Search service and immediately trying to recreate it with the same name
  • Rapid redeployments using the same service name in Bicep/ARM templates
  • The deletion operation is asynchronous and takes several minutes to complete

**Resolution:**
  • **Wait for deletion to complete** (10-15 minutes) before redeploying
  • **Use a different service name** - append timestamp or unique identifier to the name
  • **Implement retry logic** with exponential backoff as suggested in the error message
  • **Check deletion status** before recreating:
    `az search service show --name --resource-group `
  • For Bicep deployments, ensure your naming strategy includes unique suffixes to avoid conflicts
  • For more details, refer to [Azure Search service limits](https://learn.microsoft.com/en-us/azure/search/search-limits-quotas-capacity)
| - ---------------------------------- - -## Miscellaneous - -| Issue/Error Code | Description | Steps to Resolve | -|-------------|-------------|------------------| -| **DeploymentModelNotSupported/
ServiceModelDeprecated/
InvalidResourceProperties** | Model not supported or deprecated in selected region |
  • The updated model may not be supported in the selected region. Please verify its availability in the [Azure AI Foundry models](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions) document
| -| **FlagMustBeSetForRestore/
NameUnavailable/
CustomDomainInUse** | Soft-deleted resource requires restore flag or purge | This error occurs when you try to deploy a Cognitive Services resource that was **soft-deleted** earlier. Azure requires you to explicitly set the **`restore` flag** to `true` if you want to recover the soft-deleted resource. If you don't want to restore the resource, you must **purge the deleted resource** first before redeploying.

**Example causes:**
  • Trying to redeploy a Cognitive Services account with the same name as a previously deleted one
  • The deleted resource still exists in a **soft-delete retention state**

**How to fix:**
  • If you want to restore → add `"restore": true` in your template properties
  • If you want a fresh deployment → purge the resource using:
    `az cognitiveservices account purge --name --resource-group --location `
  • For more details, refer to [Soft delete and resource restore](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/delete-resource-group?tabs=azure-powershell)
| -| **ContainerAppOperationError** | Container image build or deployment issue |
  • The error is likely due to an improperly built container image. For resolution steps, refer to the [Azure Container Registry (ACR) – Build & Push Guide](./ACRBuildAndPushGuide.md)
| - ---------------------------------- - -💡 Note: If you encounter any other issues, you can refer to the [Common Deployment Errors](https://learn.microsoft.com/en-us/azure/azure-resource-manager/troubleshooting/common-deployment-errors) documentation. -If the problem persists, you can also raise an bug in our [Document Generation Github Issues](https://github.com/microsoft/document-generation-solution-accelerator/issues) for further support. \ No newline at end of file diff --git a/archive-doc-gen/docs/container_registry_migration.md b/archive-doc-gen/docs/container_registry_migration.md deleted file mode 100644 index f78784716..000000000 --- a/archive-doc-gen/docs/container_registry_migration.md +++ /dev/null @@ -1,81 +0,0 @@ -# Guide: Migrating Azure Web App Service to a New Container Registry - -## Overview - -### Current Problem: -- The **Document Generator Container Image** is being published in the **External ACR** (Azure Container Registry). - -### Goal: -- The goal is to **migrate container images** from various applications to a common **CSA CTO Production Azure Container Registry**, ensuring all the different images are consolidated in one centralized location. - ---- - -## Step-by-Step Guide: Migrating Azure Web App Service to a New Container Registry - -This guide will help you seamlessly switch the container registry for your **Azure Web App Service** from Azure Container Registry (ACR) to the new registry **`byocgacontainerreg`**. - -Follow the steps below to ensure a smooth migration. - -### Prerequisites: -Before you begin, ensure you have the following: -- Access to the **Azure Portal**. -- The **container image** in the new registry is ready and accessible. - ---- - -### Step 1: Obtain Details for the New Registry - -Before you begin, ensure you have the following information: -- **Registry URL**: The URL of the new registry (`https://byocgacontainerreg.azurecr.io`). -- **Image Name and Tag**: The full name and tag of the image you want to use: - - **Web App Image**: `webapp:latest` ---- - -### Step 2: Update Azure Web App Service Configuration Using Azure Portal - -1. **Log in to Azure Portal**: - - Open [Azure Portal](https://portal.azure.com/). - -2. **Locate Your Resource Group and Web App Service**: - - Navigate to resource group which you have created for Document Generator. - - Navigate to **Web App Service**: From the list of resources, find and select **App Service** - -3. **Go to the Deployment Center**: - - In the left-hand menu, click on **Deployment**. - - ![Resource Menu](images/resource_menu.png) - - -4. **Update Image Source**: - - Change the **Registry Source** to **Private**. - - Set the **Server URL** to the new container registry (`https://byocgacontainerreg.azurecr.io`), as shown in the screenshot below. - - Set the **Full Image name** to the relevant image name and tag: - - For Web App: `webapp:latest` - - ![Deployment Center](images/deployment_center.png) - -5. **Save Changes**: - - Click **Save** to save the configuration. - ---- - -### Step 3: Restart the Web App Service - -After updating the configuration, restart your **Web App Service** to apply the changes: - -1. In the **Web App Service overview page**, click on **Restart**. -2. Confirm the restart operation. - ---- - -### Step 8: Validate the Deployment - -1. **Access Your Web App**: - - Open the **Web App URL** in a browser to ensure it’s running correctly. ---- - -By following these steps, your **Azure Web App Service** will now use the new container from the **Document Generator registry**. - -For further assistance, feel free to reach out to your support team or log an issue on GitHub. - ---- diff --git a/archive-doc-gen/docs/create_new_app_registration.md b/archive-doc-gen/docs/create_new_app_registration.md deleted file mode 100644 index 5de59f879..000000000 --- a/archive-doc-gen/docs/create_new_app_registration.md +++ /dev/null @@ -1,35 +0,0 @@ -# Creating a new App Registration - -1. Click on `Home` and select `Microsoft Entra ID`. - -![Microsoft Entra ID](images/MicrosoftEntraID.png) - -2. Click on `App registrations`. - -![App registrations](images/Appregistrations.png) - -3. Click on `+ New registration`. - -![New Registrations](images/NewRegistration.png) - -4. Provide the `Name`, select supported account types as `Accounts in this organizational directory only(Contoso only - Single tenant)`, select platform as `Web`, enter/select the `URL` and register. - -![Add Details](images/AddDetails.png) - -5. After application is created successfully, then click on `Add a Redirect URL`. - -![Redirect URL](images/AddRedirectURL.png) - -6. Click on `+ Add a platform`. - -![+ Add platform](images/AddPlatform.png) - -7. Click on `Web`. - -![Web](images/Web.png) - -8. Enter the `web app URL` (Provide the app service name in place of XXXX) and Save. Then go back to [Set Up Authentication in Azure App Service](/docs/AppAuthentication.md) Step 1 page and follow from _Point 4_ choose `Pick an existing app registration in this directory` from the Add an Identity Provider page and provide the newly registered App Name. - -E.g. <>.azurewebsites.net/.auth/login/aad/callback>> - -![Add Details](images/WebAppURL.png) diff --git a/archive-doc-gen/docs/images/AddDetails.png b/archive-doc-gen/docs/images/AddDetails.png deleted file mode 100644 index f36b596f208c376d8dbe5dd70e947a0edbaa728a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358587 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 z 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¥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 NG6b3GR%$!F`X4!mbjJVy diff --git a/archive-doc-gen/docs/images/AddPlatform.png b/archive-doc-gen/docs/images/AddPlatform.png deleted file mode 100644 index 6c74919b4a388d5f71d9bc1a2ed5dff1072551fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199104 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 z 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

  • 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
  • 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

    }Y&8?ESA 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%0D*7lva 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

    -T-f)XdQ&U6 z|5-bo9}!_M^o%|hX8zleNii2spxg1pdN9PznL%?==zZXn`$l12Mh1l`xOuVpu_(^L z2uoAk0E%#QQ;U#qScg{vgHl zNM)mJP}CQX8hsR1ulB$(#Jqbm5RS4si>hmo@*fOpkIrc?C=ofR?gkdHq~s05IQB~D zAt*hu^lHC6Esnjoy_W{wTZ{5vIAd*>#o1+ax)TfbokR;GNm2W-pZt&u+m2~JMfcwV z`E`pbTq-H_Jcv<>cB!x%pJ2W{=GYj!q6aI50a(o!9e2c@ERv!xMn!&q#4LssDj2P|o zOT`!|zp^848d7AGiiQt&mnP)w_R77)b2C}2XBCS$l)`Xf!uCI~^eh>4K>zZsBxK}T zEY66d;B8**x+j@>WGKvhalu#&b{{IP^5In^6o21xc^DZK)}P8=*S&781%18PO&F~H zk9U0*%QJBL@;i|H3VVFzKPn7d^n+t4SsN^kQ7xXq>hHLZzDJM2n%@YcfQK0rKBo|I z>SmY61ZKc}fY=x4R7~6o`>RR6h*=l9TWZ&T{Br5vwQn5X@l0tAl-{xA;P_&&@+wAg z`3<054VwEN;?_5YLfpI=H|IDK813{+#TY5Svb)QvOeB_AQ~)3W8T5!wauGJ$Ufop&U_m#7zQeGh4H| zkH$Va8&mp*Rvx;uj`&eA^NZyRtzNOnUMQRKVYn;cIKmZGN7o2tlZD>*z9UUvICkNWHv5JCT_X%N ze0iW)+OZ{lDJZNj*9b!`0qf5$i0lbJ*aFF;fE!Wo1bU9;jKO3a={$^f`mYd_<#*ir zhuoOHh)K5?v@^2F!m;djD}d|8IXznRO2Mqb*Gg*}p~}RK)3GtX-6%|O(3jhJV;sm? zD2l!}-1z0Gz~f+X7DGY%3Nv8Z9z2vg-2TxYiuz5t;b{ADUl=HRrN%!N#)ne!*kAq> z=UB-5uwj4<4^+N`mXQJv7Qrj3pgnjvu`p2g9t{Y9(=B!zr)&H+4%bD0xEL2AXVD7y@2>mc*1obE|B=j0s375^e5;Jx&%&FE| z*X~fgF80D6v;|iqisTLzdjo9(e*Mwtt;QnyC2B~LMElV@H%>8IB>LzMc4Z_2U?gm} z79d4vZ`R&Tgm@pU;OJ@JWg`p4M!ycA0W(9w_r&a7 z?j`%aL6tvTJmr48W?z++Vc8so3Q>tT5?MMO43iRgsQ_JElE$urAr3P%e8a>@>*lYe z3gvZ=bn&rX=uu7Ie#ZQNZzPs~5a7tLhw7FjowkldyiV@oG~bH|*@}*png6?nMcfcE zr;!e6stH|YbI@zXliLzgA)8knmFjnyX$)GdB0UJPB?)_ULmxP3^zq+cM}si>ql)=Q zal3NC1&2Xrtmt*W%5_uJhU0xVpVnRn=n*}v@=hE|zJzyg+x9#Vt7jWbR%2154`G5ADx?+ztaI$1BFpd&_?vHIW9Ul&0sbLtz%(9mD%PbXsyN zHXcY|#QcMbVNoSRc0La7h5qxL(MD5Smwf?ElT(?U##@;9(lg-$N13om$UUADwzV4T zdzGke48fC8G4Z#oOo!f%?S^}vRgGtp34zG#?~V@je*^+ukZ+bW5@Zwx56^roKhM5p zTs&_395n2*b-E?Fg{a){9h|dCEw;hhSuXPg1)xRfe#tOFITp+Oir2?Dkeu&6U@m?< zhsU{~+gxs1_F_OXHIWzbSM*u*-h^Sr*2{{xI!ZO`U~L`spWgl7E|s~{7?P|F^J;v& z=JO7xC71KO)v5Eml%AG^j*m)yZ&K6{x^}~=4mt9@xra6q-1{CfT?hq%W_!Zje%oT# zGXbRN9g4@T?R2HJ#m?@-|KLaD*>^~O1kX>TZ#yYJMd-V_e1CY_Gge?X%M@EIANEd- zdcO*Q%P%+hXp`Qnb9$&_-$Ib|YZvALjsB>qi(2RRM1S-T)4hX7}9yt1T&RpBwBOBbRs79 z$UKQ6j%4#?6G#cS!mv@uktDo1{f0Uyv-ZSRc1~zgQJ$<#Q5BXGHI3p-v+KrEd6#p%SC}p_noH_{ z-@t9(O?5OmA^vwQ>0cj<9qslEPpKP9nIJibb8fj@IDf`FAY&eir9z>eO;*eH9SEBfJ9wxF>D->1*%f>UGTAXP% zqV!`lk6AcH-Vn;HD!s8SG(IscKaEIJ`G;X3zR8WQK#~?=Gaw$pQkyRXrDR=Nx0a!} zbsY{1TRKaAoXBfl7I7#dUUsr9S;YrYTAOB z7QcPWB<0u4g!H#^ff~Io6!}-w6{%>jd25GI{1qK5-6>FXiD*i}OJcO{e7@H++e(KXsZ`q`@8Nt!WmLaVyS-y4t`%~ z?NmXAP>(++@lf#PbC;jjI#I*W*9!l$8$}x?uSaL8%v^*6U0ACC$3O9MGTZT^C2Cz9x`yHjOmf^$gEGn^B$}Pg>(vS8BZ35=|!UIkSavoqc5F zS)?>s`^KY1GJErSCcKSCMe);b6-8NaxKoe{{1>5#^kVrPJ2RLOBD8&WSA86O!p9Yx zKlw_W(S>HXTvL_ zS{5kFTQ7?!9aQ!+;tZGzopwB zjkYo}3yw`H?8&K3HH@DRS3#|o$D~(8BZN*xM$1r6Ij~n}&QsgpCDD-Q6ot+Cf-ik{ zU&EEN&$U~O&r_?Ul#j=yBj(PM3!yXJcW4{(`jxKWa;b{$IrE&26YyyrWN*JB(lW8Xi;18DnNw`*OcKFi> z8``-1U_>n5EcWm2M{$lQ=f+d1X(A2+d;2Vp^9Y4gvm2xL7K+a!|K=bhDkEt8 zc#hR?Rty7_Q00$W+*^zTL~pVQd=H@h`|!tdl|x#dEbtp&Mq9mHYBoTuz&@h08~tc3 zk?5J>D8QE{ON?(${F|bX3-_(M8Q1ayT@zHu_(9@u!Wx(e$F7Mpe}C55E|LvNute(dV3S}> zw~7ZVOn@MP$W)l|&a7**1)IpS~|cXF^8PAeRM`n!TMD$A}DTd4Jg;Oz)@ajPWDzW36; zhxl>RpMk6Ai6z(bgj|fiV!~S&>^+Dj^s&+O^v|_t@Fpyc-!sjul;%LK+e8?8K|r_^ zqs{QujblFKx@0jsmPwn-U_h4tm@{07I!5YOB<+0zAf?FzsSNd1Ip++DZ#BL^rD8u$ zA_-CHSeAQxs~6H^E1$-3wES@Av-?KXG zDQ?1eEOz2&&ohAlGBcx&$; zF}MI}Aq%K;c4yDj=5v_pa^LQBo*Z=V@#F;FOusNR4}My%4MeUurXb;T-zd7i!?E=J}<(& z7y$R0YciuUge9#8fz1;PN8s6czFm5CH_B;d>45uAPt0V=LFS3ItkQ}Tj2~J*duDgs zH_@^dgS%MC?d&$e@k*!d{Owm7_xTWI955vI0VNh0{pPQh%U*$$(l4J_hzzO$0!c~^?G>aXp$$LdGJ z5@jqBQk5!q?Wp)(J&zAU`GrmB`Q_kRPCq_niq7DA#<3B>{DsJhTMrCw_9srZ_r)oz z^QcbesjbFV9jra*g-QGBZ)g|KerJOcuH8UE(&6_00aRuKc3D|&u!gP|Ji(v_dnB2w z0_nzkb4!7t2omBXANH;yFC=cZD@rwwDSEx_>-3Jbcw{hp3LGUt#xE&xK_@^sxjrmC zrR99TXxX1XBG%>v>N9+DkqX~|BX1`3O2n1@`BnU77DKg9O&SzHKLI`G3%Yb|Qc27a zO~8*R#7ze(J?HCV9!ononu)x~6m5d?y+I}6khiOCD2QtW_L&0HEc^x=xvTjFr{MK; z(cmC#oXYR9uB{c2t?wiMmfXq`Y`K0}OvnAG&sFq&hanPJi%=?=lZ$q(mr1hP>PA9& zEm$J{)89R5wKs>pxBP*^@^Q{VXz4cB_$>ADX4v4U6zJQWb3hh!nVpr zs_u?MJEkX`@9m>xnsNTiMCjbL-wa@%=qUdZ)z@lYy85tXLnNa?nU2El7|SbH8FPI> z;ch$EZakr8)z+}%nAtUp18}~c;rw5mr2HyLOh+nZIrlA5J>_fX{-4DiTYG;@>>7r; zt)c-Q4#jY41-=`my-9(^g6{uvqg- zjy;TqJucw$@ulwrErN1)KC?O+RTzUppUWyWytqMg{@)@67R}dab;E&|oTofyKWx(1 zX;?>4jepF67|cf`Ui~vmpq5>RB4yenIZ@enwM9)mRbe|sv8^ev09Zr|bDS;X2Yn-a zFi1UIg2C~h_C|>L4}qXKzdcBg?Y15=9nF{)y?Y#iw`tL*aT=j8b%sTdBo!A?xddCz zck0#9l@+W09oO*|tXa6hIKr@lLEYhm@FrEu`(pl#51?F*N*LEDw|%dVj_dQP19;X* zK#ku$OlK>T;YR!|H2%h4bwj~q%sYo(n^OB!%6b_~u^-J%gVRU$-`S6&%qIDUjrjU@ zr!x`jCK6ogs%&}TDp%Gcn_g8zEh2)+c>;>4!-I7HMx6urISAcLYjdM*5OX+#iZ7_x z7Gyrz2#1%r8X=ey9BoTJbpc`(4-lt#Jthfqwl;FBD9^QK{t(vqZE!!+gX;s0tV4_f z6J#cvglXi zBOKM7g=Z;8CV$P50u^!>%Eb`37CJSmb3f)kj^=( zvl3i4T2#OyxzDCEVGOxoyArwAtLt$vVtyS(csan13XF!{Myb^IV-5^pq*lxbobtbr zeR{w23#suvUu7hx4@SxxI}L*LBBU0smpE7A51f{Ny`|#IoSs<;t&ZhddmYYWJ)L)^ z6T!pH>4wsOyZhXEIrWdrvVWlhe&$`yJdh3pRNzeC!e8j6RyeZqbI6;-m}CYL`wk(8 z!wpO+uS{>kRhTBt`4eWHSg2Q73@Lz*|7vz`_21a4KNdKpxM*0M2N``{t@Q_~YPz9N zf!A1C?HpMN5^UdNn!ZIfi>^-BSyIj+889@R-+QAPjjqu#77~fHv4{XC6kg&-l^RSl z!ZP0G*}n}mZT8?`{`qsYb8;xx!A44{(MwW6hnt+lC>gYKBhUx+(>GJQKCRNXXj$jB zw;Vvh8A_JW@H^z*yOupn^q9=e{rP%6O8e@ygS0mWwW|N|QZMX2%ogg|gh1IJ@07b` zC#~fT-f+-)&*3r>DRYVFt?2H={6%7Q*WVAnr}e@A`ft~m#Dm#O1pK{?dEA8M|Jc7qg%1BEj0z64mINH)PLV6@k8Am>GS) zoL;_A=61ceEOiUUWTo2njmCr}*vlFWkfs{Vt;=4YL0Vs}oj_WgB2Z+-;0Hc|_(^+% zP&XsYFS;|XD|nin6T-9L@J)uPM+Njq<6r(vpwN1L^>aeXplIiQYda;pkk~%*J#Cg0d$A5& zIdov8=K_Ub?9%h^EOgCRbR?fE#2;q!;il<3uu+Vd?X709m>W@jBe&%Dyk=~Wq2GU; zQ=&5oplvLa&^F&tdAgE!HI-DI)Dx#}g8c7zGjjZy znZH*36nc8vzdnCU?7U_@P`{L9{WK=Fo11m4%peDQuVvK`W@3Y2Q8{<6hkoqfBo=Qn z`r@=~Het(8oZC17&jix@N98*lR>aeGNH<>j#@lJ zby$e={64j>P&GR72^UEFdm+Dn5vI)a5=-tk^%5uXcOMAxSmb9GyR8-kyM>DRyg}CV zy@{J|we<*ufnXnYL(-bJ_cZciTYAjlzj=bRuh1ega%I!QhtE(NYBt`%u88I%norXm z8<7=y?&uWxaIfEqI^4m>HD+t&}A%a0*$GE)1$H%x$_SE-GKo?yl9*ZZfZjt_!M zzxU#@*sy6CimX^Q!+$HT-&cWekKP{ypDz!ptlkGuF7=8n4aY*AZjes*u1~N29+(?< zCEUA86fwAuPCCl4tN{7F=;HDT?Z#@gJh&rjTYA&|4Pr|eHc9meuu@Pvn2)527kyg4 z`~NLHVId4<Z_Oc!{vC7_*7`eB-( z+hOU1BI3m6#L_p?5|WLIFO=z32s$t)U~ss*ZPEav;oy2#~r;bGED z^xloADyjC~;s5j*l~nnu&5iC{IzCvm!Z#?^w|^-H+>CJ5=C6G3x^w)KZEMqjdM6gBZ(mZ*O$pOu${LH34Acye7Hl2JL=PwF$Wr9dNd)*A7?Y0IVe`VzToP3pr90|Kcqr> zOdLB0c%boTG5i8)*BSUgp$has`!D17jdH@)-iJt{om%u)Oz}a_e4&c{s+|exadez^ zy|BnEtlNq)!gD)~^*30FK)0jC;5jtM!^j_FOv6re_kp-9JXX|O1IgJc=qHhW}?kS=WvqlIxkxhx?_-F%izPfAPs^@D(`A@val@3^^j$CYQ|`hN%T4KHhXbs0!~`H4?AbK zlP6${V4BW0v1!`s=W_EiTRjRqrf{}dCxE5ajo%yC)5y?~GVnvvDU6K*f(+>-e?JNd8=Ze0Duol#-zvyfkYuV;cyqg1_yAX}i1jJfv|P zr4GC8RZmmy*}(%gi{9G5gakX`?Ym7#4w7z3O{}zZ+uWA<09=A0-2Pkd9;vDRA0Uv& zC*hQ&g#@&n4_nyTAk9@Od+F{)OinlxFMiUWUtXi!oQb`RiPg0|x-l51TJ%@`JwHR4 zeeRmdOxYLf2R4B&XlV&j>gRf4F(&T!xOve$uX}(J!fHdUsjnlcx*kLNilR)W^NC|k z$+s`wZriTra=pF(9u0JS;c9%>_swn-CG{aPxo!G4^|(kkyPh4#+nzAene_kx^jx== zt}K@9Ru;iXS^J46&TNg-kkq=)NURRhYrkx>W2-;ASqzp8MR;32^Y{EY_DN%3@TH&Q zBww$=m3Ic*;%NOsLBCwGUCO3dr;vQ`aEgK=fHG*#y)5vmeg4r8XyB6wh*a&Spc))-;h|R#a)0k)8hQ&N}m8bDRnB66J`WO#@Hd` zp8UVEnhHsA)4!dP0AGb{deNRpMW2WTq*Te_nzmlXI4`eD?gwgJ4JAn~s>1A7Vngwy z{z8{>dpkND{wgWT@Y)QXv!-RFI95U{sze%h?05>UL0%dpOUgz7hvY1EhR?TN)y6?m z|Lh_u?q_WX%UcJczYE5|cKO#0 zE?#ee4OO2}a*r7?{0Rlqx8{=rvB+7|-)Fh)*;sPS6rddzpb}eBv>i$D_hdpnE!bd7Nj0NN`J|!ft{RwKe>WVXQM2TkkLQK0UTVj{BsNK#1ga7+UcYYF zT!7dxI+6KRpSD}NgC@c=XObQE9jm4UJtJ2x5Fp(l+Rw`}|#q}VcFJ_p)G9f|%FsIc)%Iuct_#1F% z%Rsy@D$_!x$OV)(>l>NH(;F$6PKR8lZIKtQWpx8(^EG(FOv+Ks$WmjZ76h+<2 z&GL&Yz3jooEX|F5dEwFGI`3UZEH%K*Sjsg)SzWyNE7;?W7PjiX`~K;Lec}VJ)?jM3 z^zu*V!FFS^AH{Gc!@MA9-Q;s{;wPIwHAITA&006^wF#o0^8%6@x7XJDkN0ee_0PKb5m&c7qz{AC5|5-Vvqe>Mi?zd`o`OhJtc9O9R zz0i9G{k}@a+YALPSFjsV2lqFSF)9$Yk#vv_(d>7^@i(jRoyN9%sbH(C!Yq=$(L(}O zR-C_Ws`L(n^IGHS`Z0oGv#r~Qs9PgpKMG9`QL^P8+P#N> zic5GBIeayFdZpQt5A>ceK$-=kV?2l@k~Gd&`oxRf&_xApQZIbcVnL)@PWJeog-EM7 ze$tH`i%eBEDRD+H-`;p83y^fDrA+s8mYQ;h61s*tA{@fncmC%{#NIRUa=Q?l+_PAn z4LsK2blZh2>%2nz`iD3YXGh693lp;2+;QxTpke+B7O~JeiOl!%?J&sEp$LT3nsREI zIIFmvN(*1FTE0Q+8+-R=4ekBK2G--cnAF?mSqshIB;PF-eiAw#-L7YTo0}b6U8wF0 z+jRVDHa9A%7@hcWKOp1@pZR!vV!0;-p2rc!I2cTyQ3715Do%ds7gy(tvf=r~<;qkl zNSmWXZ%QHqC4$awTq=pGd#5-VhOOIShlYCZUg#=&zQJ%^ogvUqDN(NS?G7n zKD62s4k^q5F6U2Z-DiBg&u2WR_nbEqqc4P7*YTtU`dHrIvX~;I`$6b|XV(q~i-hk5 znNgBAP-{{BDeiAKgT{&#mqey{M;E8NiQx!M{G3Vl=Q%M4>h3S*HDsjZMXk!Qt5=RP%w3mnc(5TDJO+wT2RK+27zp*M=osQ<6R61rsS1xa{jREt=A zdcI05a$NKm(yHCxFqaZ+@~Q@GbEho(jhE>w3WZykj>v=YUWu$K>ah;tc{rR+#mqJ1S#Bn{)Nv&uUEoia|G+z zkaWl1odj=zOGGAniZ%L8h3nZIaT1n6?kzwE0a(XQWw)d3=c2|Np8E&&W{tz_#rTQn zwJuI<++6R;lPd~f;mY)r)X&^U*_~rAad1#R(QM-|nRx;$?5G-_C4n0=aRI653!7JM z!9?_Uv220UZ~__q{qN;I{XyjK5qCxv%WuOGQ}Kc!$&T+Gd-8@l{?+^-tK(+rsUn`{ ze8yA;iFOazu~&=I%Y2UPFY9wbVanok#`6w$Jzxqjl2QqnmMJBCR^B3_iD2E}k6)~( z*#oARvFPac_s2{k8^x+992ed8vCWh#qd-e~p1W~t2wvZX1eSSuGdke0bP}!Kh3KJU zD0~np#|Dosb|;w&-T}=1IfatazV}X>XAa>P4-2h0jMi+Pu+zHyYg-AbHg!2C2r!|o z$k6$i8I4Ev?U``iTaJHR3ho*A4J))Y+ zu@au914TgozDFCO^-3Mi{?2e&>-x|m)~Vl5`fP7Hr(x(`lKh4FhqdC*SeXTlf9-iK;9nN?R`O0BY3xib#%eIgF z3v>MN4UjOn@!ub)B>f)*d8l`OAYmp8$;cdv_sfs9A?))MjK9dNh%?uOkRTGlATdjV z^`zD;KR?!LLmX{I&c4JibNNtH+pRvt;1h}5p6GhqSi7vTI*-~UGQ^K;5 zG>)^122$ZNVYnFA1HC~pllPQ({udz`beKelRUIzEan1gxjq!e(OZb9>DhJ^UjF;50 zBzL2vmc>(4R=(sl`^l4@`bU(0!V5G=Fr)sw1^`5FT2IpRJ3%6Tg|gU_UJ&i?WL7Jl zmraXOeHgsL{_~|7(Y2S}_;79IC(3Yb`$uCMyLW@XS58F3Aha8eqNT@B$u$XVsjKwRsbZv@w%yRO=B#RDeRA)H>$mx1)Sq4SKsk@tvjT`dp9KGogV9jQ5}3 zJX%=)B$o{V44(hJi_WioL1D8>qj;P|@AhEMFQi9*6`m-$-N4bilzxcG6fqVC@2-j! zK8o5G5=TO!|Dc7o?G46~6uMuY5F%rd8~Rbo+&u`BlQTkQ{M)np<8>JR8fDc0uhmO}lu{E~bmTwy-(I>#IO+x$ zc4=ks3quP(W87X$e|>N!vx$7(tBD|!pf@HjIAHN8j1Ub43q(s}wZu`b%5q!I8ECL< zWyrR-Ed*t3@XVH=$<*`sAAhie35a_i#8seHG&v35;cjqWhdvr!IO#4ox_)h$YX{Tv4%(; zu!A4ccNg0C4>mL5NO0G2o|g3#6!;$;CF}V4HpPk5zIROC{JG1f-o?qvY^ao1WuJ~X z%`juZhjk`}Si|ZNcbGQ6WV-8bl%>?K`Ni9!5@}wBf7qxgh__7oH6j)?B zd{blpZxcvmw<|DNNt(QnEnUB`u{`x`(ShV}+qHe1O62jrF#5H^nX8*8VC9)^Ei*tC zGdeOF-uLakUV^Gn_ruE!sWSW>AC-o0{)_j@P(tW?WgOR^iJNu#_X(TT8Lm{3Pd?@W ztnV06m2GCUN_j_9Wj-(;w=92X|9lz_8DI;n9DCCuQ|kKvr{}}chu4MAEv|v5KGReI zILX02YLJ_sR{0=;NCw%Y8ype#vY4gugrOfBNXsa?EC;S*?5S@iBxbQv6U9V~=kmQ+ zZ#ul+!-kMzL5i~#!NCMOWlhyq2KoUq9k1JVMEf;8Nw`1&S4?)1mfVwQm?Dr^5DTFnf|`RcSAeu-M?h;4dGp3JDK|Y z4H3%%Gv?20%rjb={6-pgCo5ez-!4dUZci5Nwn}vVmWHT?s;Aj`!vY39#}M;2ltoLS z=o$>eTOVLggE7|4Qz#!^#!PG}1JV)LAl_toWW zK)urWllE>E7h#_{5c$t0$uj~g(bS#%8U6vsk!YlNf|*}3)nh~7F~@q2KpAadD6#gD z=&-5cngsv5ic;j6Ncl}#X146F9!&4H;nVKlKu$angpnA8RYNL7m?Y^I8A)F+=2yJZn9? z!7n=2Z)6muaSv+?h^M?BXQ{ITu~_0uRNQu_M%?$+B5MUvxty^yL>ko!WG+ij{7kIe zx2WexKs(ngVM9-7HXKWWMfEk_)9Uyy%@xD|3Fhu27&dld#c>pwQm75aLW%kmWt^R{ z!0VW&_Q!~cHQ2_o$Bc={0Z`VQiO*rbLY?+}ak+361k<3PMjex(nB*{BhBJq&M&->| z3Ql`LwL8H_2LEd)4w3GIv#YdX?@-BCBW)llnJXe?{8-_$65@~ZN5i@8FTCr(@jvoA zd&lf7ZOsU93Bl>6$t!_{+)mF#BHdqRJqPy?3xcG>{|+06&#RY?sKIQ>GWfQk6M_+OqO#ZtylX6pnfZSFmKJACx?K5J zqR{x2WPPA$LuCYAg03F1cvRo&MTCwGOxPCfm1?PRvhM*YOBP1VTu@SGd^pVex3%>2 zvSgk&5Zwr^;GOP*Pou^}U>&{1D>RH|QhnWR1vOfbHZhzgfvjgS*z z+0ui>=EeNg8wn3_-I2rh_Tj~{Yn77R6Bh=Ir$o18`evf&ISH1QY4Xpk7?vjqpOLBA z3-QeL+%U*XOBtnZi8GlFXwo11Xsmusin8f6J7qVe2JjfXkAmFF8d>!|WB)?D&(T{F z{|8g0NTkA?4<(k_^NO|AONaRx3!}!@VX2b;!P5;4Pc}UH==Kw=_QQ6*sbWD>6LuAod^)c+-^Oijk7x)_p7g{>9v25IyJ9LI zzP9d-SmU5w=*~|UQ0rZ@)3(_%8n^8OIY*=O>+Qjm zn5-l&m;J^sXvBkp=8{BKR>9j-^cHl{|9^mlY}4k=RObcE3ZdU<&<{GjGGgmJdtY5e zhK6_XD5N5)+WZQ}anM4V+We&o}*NHbWY3;COhvFy`wKn(zj8NGU=@T)B6brIEk)=EdzNFsF zD%k7sQBIGek75f`ASj zhuxPlDt_G*W*n#yO|r)Idshjp3=q7F+Xz~^9dPp>e~Eb%lf^7o za6lqXG6q_68&xLXOh&2w}S&~sMGm-Zs2cv%ef=D9*=_ zphfSwRXmDIh45Yy6^SdRKP+yQE<8zO@yZzEV6W+^-V^L#g9h|b&Xw5i%oSWZF>a2) zyTDggq|B!o;m6{DXtVBMYPJl?mapEv?5vN`V-63As#h1>JqXv4JefzucEI@ZuM1pX zwb|xsd$~z_^kxDj7cJ~$YwKL&4z={sWm!R*?1(7}fN?SW+4Jy$3Wt9c%meK1o3ZAf zH;gLRj_G~}bW3TmTlqplL1WAvNbc*7goAN4gZ18@P>sZWvqEdJ_Z_G^3t&rIW`8dx zu1ftd^B*?7kf>e1aDPNuod^EQzmX}-ThIS0 zDh*!Fz80Uzn8nMyI&20#?g$Cpd)jC{65VL$iJF@;RJVPgKK=cCW%0XDy3FsYg7o)$ z`O=O@zZJ)7F^JX@`yjfsJ}Y9xg@~Ku%}3&~C2WEwN}VA=yB;WY!6L#KWYCOEj?o?N zW_}HwFk+EAHK{<5X%-bj+bxQv?~RA?~QaA~;3?A61gDLTwX)d|SsP7%x)gGRLT*P)F8hkM+ai92zG;)0(6WX=DuhjGM z6+zXE$(Qf~+Ty&dF{R=F8f+|87>8;Eb*?;_zLdY`ip!68HN8Vuv)_c%+k#-N_<}l_NXRat~LwB?Ap;UN)@ma7*T-R z{*IHxa37mNQ6ply4h2xP{mJ1@z47?yAD8#JBcbCCVp?i4=Z47Os(cy4Y`sof++894 zgyKg%lPqJ4?G%FRVFjLT`hVfxa1ivnzRlZh;r_tsaJwiO28v1VSV`61U6Aacm#9X0 z&>}I}H4#S4LoVZcc)lx~Z9WNb_1rP)ZFD9)C^L3kLhsFeb!l$d&6gzYZ4&x~ZjM*_ zn35EVv;ah#q;gD@PC>C?0&Ic!n5F-FYT(5vJh%oYM(mVM0<%$9gn%5Nz^LCv$Ss%) zYCD%EyA^IMz9~a8Q%+ls3tlsjOsHh`|SH_^~8}C?=L}JAmipVj6X<6tip=L zS%>NelXj%iA53CmOPe)UwC#3jxRAouy+FjPrm1(*62l^{z83J!B7UEfD7TkEL5nLi8s3896|DBD&3p~B((E|WvFO?lS zMrOu6_VB?wk4G7HRZK?$PbcimxS^UU%5Un9xFHEOGn9O4XS7?8e5;EYo_)K)SLy{G zQY!ZP7Z0-MnXs-oT?>25p(^*an3O4C9N0Sz%inXya6Cg0Tc~T_F54SSM*GmDG5lxj zZtU|9s*%Ih@E%dIpxhJHuEU=f#XaQeC2DG@F%*F@SBP-zq60Nf=mU^i^E2dSWX|y= z!@SV((CzK*brS?a6$;Q93|s6zA^TOa%veXZA+QVyJRc)ik52MOiYp)q1i1QN2= zGa-xFOZ>PNV zG9S10gc)^fbHkeog{HoYh#Q%GP=f+Tc@#*r)`rXfz)g-<)7uJ2kIXn3oft5r>-E9tF+c)i<_kpv56(nhkcE_ea>5^&zys&675Xc|vDM%DjnU^} z8`1?m1yEd}X0j2CACeKCe2Fc1lSL?SCEr_FP606vWWlK*-6I=2(B23p2Xa`W(AdqG z!DXyqxW*#o*c$A+Fvq+^qgJxzeuDIz;zAgte2fL2M%<_ao}U>*-c%p18Zy$a0D1?O z&YPgp)#g`H+GB)9W>&>c+4>AWamDB$K)AS=!+DZFutg? zM~Zk}%F{Jtg*p_tI}<8_xUT|hTn=tRvZx`Mp3xSsqYf?g-+A8#?S9$Ulz{Iz3>j>C zi~=0X0T^fku@97G`7FgIr80-l&Xhy)btT0@#mvWZADV+1Eiv&V$rN@&U59hY9sMxp z6LXO0v{8f;(=(9O%P^8KIQUCj`_Jx-h~VSk6);QisHKOZ0{U@#ozLETLaW<0nz2#erKCpZyE9!-kpDyqoZxw(EVLgL4F^q2K(v37V$KiE279g5jSz7Rht5Kv19GFGc zvr>R_cJMhhsJ;h9^-}VBwFa`;(WLZlhk6zp0Zw`c(rH)gHonM|{Y|L!M(w}0&@NmL zP~5wdBsBK5AwcL99u5ja4+xFx9nQ$ur~O)tq^vMY1Lv3|H?Y`6K1)qXVSACGD{)-Q z#@)&sCr2Idiy0=5-`2DXQ!Bd+Gt}{1j)$8?SqZqV%s14#EvAK*6JjiM7cPM#IsAwK zl3Ea5PGf@Rm>c_F959Af*?>{nDq2YvbcFoyzY}~>%!biU{Q~|-iz|p#ix>p{Kf55; A$^ZZW diff --git a/archive-doc-gen/docs/images/AddRedirectURL.png b/archive-doc-gen/docs/images/AddRedirectURL.png deleted file mode 100644 index d5cbcfac4d16c84ce83b5dfdd0bb9d72d9b45d8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42553 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%0DD`x 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 diff --git a/archive-doc-gen/docs/images/AppAuthIdentityProvider.png b/archive-doc-gen/docs/images/AppAuthIdentityProvider.png deleted file mode 100644 index ca9ea30fb9a753d323628018ee5e7834a8bad684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49121 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