feat(infrastructure): add conversion pipeline Terraform module#542
Conversation
- add diagnostic settings for storage account and blob service - create private endpoints for blob and dfs subresources - define outputs for storage account, containers, and event grid - set up role assignments for Event Grid and Fabric workspace - add tests for conversion pipeline module functionality 🔧 - Generated by Copilot
Dependency ReviewThe following issues were found:
Snapshot WarningsEnsure that dependencies are being submitted on PR branches and consider enabling retry-on-snapshot-warnings. See the documentation for more information and troubleshooting advice. License Issues.github/workflows/terraform-security.yml
OpenSSF Scorecard
Scanned Files
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #542 +/- ##
==========================================
+ Coverage 65.16% 66.59% +1.42%
==========================================
Files 251 262 +11
Lines 15597 16611 +1014
Branches 2193 2294 +101
==========================================
+ Hits 10164 11062 +898
- Misses 5142 5262 +120
+ Partials 291 287 -4
*This pull request uses carry forward flags. Click here to find out more. 🚀 New features to boost your workflow:
|
rezatnoMsirhC
left a comment
There was a problem hiding this comment.
Good module structure and conventions throughout. Four comments below: one high-severity bug in the staging tfvars that will fail at plan time, one least-privilege RBAC issue, one Event Grid reliability concern, and one stale TODO to remove.
WilliamBerryiii
left a comment
There was a problem hiding this comment.
Review Summary — Conversion Pipeline IaC
Thanks for this; the module structure (Edge → Raw blob → Event Grid → Function App → Converted blob → Fabric Lakehouse) is coherent and easy to follow. Requesting changes for the items below — most are small, but RI-03 and RI-04 are blockers in my view.
Acknowledgements
- Existing reviewer @rezatnoMsirhC has already covered E1–E4 (Function App SKU/runtime, identity, network ACLs, retention defaults). I've intentionally left those alone to avoid duplicate noise; please address them in the same revision pass.
- I withdrew several internal candidates (provider version pinning, blob CORS, etc.) after confirming they were either already raised or non-issues against repo conventions.
Blocking items (inline)
- RI-03 🟧 Medium —
main.tf:64— Fourcheckov:skipdirectives reference unresolvedWI-01placeholder. File the real follow-up issue(s) and replaceWI-01with the issue reference before merge. - RI-04 🟧 Medium —
infrastructure/terraform/variables.tf(root, ~lines 547–573) andinfrastructure/terraform/main.tf(~lines 217–260) — Theconversion_pipeline_configobject exposed at the root does not surface every meaningful module variable. Operators today cannot, for example, override Function App SKU, blob retention windows, or Event Grid retry policy without editing the module directly. Either: (a) widen the root config object to mirror the module's full variable surface, or (b) document explicitly which knobs are intentionally fixed at the module layer and why. As-is the partial passthrough is a hidden footgun.
Non-blocking items (inline)
- RI-02 🟨 Low —
fabric.tf:23— Fabric capacity name lacks separators; align with hyphenated convention (fc-${local.resource_name_suffix}). - RI-06 🟨 Low —
README.md:121— Two-pass deployment with manual GUID copy is UX-fragile; suggest-targetfirst pass or wrapper script. - RI-09 🟨 Low —
versions.tf:43— Add precondition or doc note forFABRIC_TENANT_ID/FABRIC_CLIENT_ID/FABRIC_CLIENT_SECRETenv vars so missing values fail fast. - RI-07 🟦 Trivial —
README.md:4—author: Edge AI Teaminconsistent with sibling module READMEs. - RI-10 ℹ️ Verify-only —
event-grid.tf:11— Confirmevgt(vs.egst) is the intended Event Grid System Topic abbreviation.
Body-only finding
- RI-05 🟨 Low —
infrastructure/terraform/variables.tf(root, ~lines 547–573) duplicates module-level defaults (Function App SKUF2, storageZRS, raw retention30 days, converted retention90 days). Each default now lives in two places and will drift. Recommendation: drop the defaults from the root variable block and let the module own them, or remove them from the module and centralize at the root — either is fine, but not both.
Validation evidence
- All 6 inline anchors verified against the PR diff hunks for commit
01de39ebf3db4eff0eba0cf7966b44e4d71c1f22before posting. - Findings cross-checked against
.github/copilot-instructions.md(Terraform Conventions section) and existing PR conversation to avoid duplication of @rezatnoMsirhC's review.
Happy to re-review once RI-03 and RI-04 are addressed.
…d letter support - implement dynamic dead letter identity based on configuration - update role assignment scope for event grid dead letter queue - modify staging variables for PostgreSQL high availability 🔒 - Generated by Copilot
…loyment details - correct author attribution to Microsoft Robotics-AI Team - clarify two-pass deployment process in README - add lifecycle precondition for fabric workspace in fabric.tf - update Checkov control tracking references in main.tf 🔒 - Generated by Copilot
… pipeline module - eliminate unused virtual network variable and references - update tests to reflect changes in module dependencies 🔧 - Generated by Copilot
🔒 - Generated by Copilot
…ile paths 🔧 - Generated by Copilot
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
katriendg
left a comment
There was a problem hiding this comment.
Thanks @nguyena2 for this great addition and integrating Fabric into the picture.
Reviewing the work, I have two generic notes which were based on reflections as I was looking through your updates. I'll let you decide being able to integrate these. For the first one I believe it's valuable, the second one I'll leave to you to assess if relevant.
Comment 1 — Can we drop the two-pass deploy and FABRIC_* env vars
Files referenced:
infrastructure/terraform/modules/conversion-pipeline/fabric.tfinfrastructure/terraform/modules/conversion-pipeline/variables.tfinfrastructure/terraform/modules/conversion-pipeline/README.mdinfrastructure/terraform/versions.tfinfrastructure/README.md
Comment body
The two-pass workflow and the FABRIC_TENANT_ID / FABRIC_CLIENT_ID / FABRIC_CLIENT_SECRET prerequisite are avoidable. microsoft/edge-ai already solves the same azurerm_fabric_capacity "GUID not exposed" problem in a single apply and uses Azure CLI auth — no SP secret required. We should align with that pattern, if possible.
Wdty?
Reference: edge-ai/src/000-cloud/031-fabric/terraform/main.tf and versions.tf.
Edge-ai resolves the capacity GUID via a deferred data "fabric_capacity" lookup keyed by display_name. The terraform_data indirection prevents plan-time queries (handles the same testing/build-system constraint that prompted the two-pass design here):
resource "terraform_data" "defer_fabric_capacity_created" {
count = var.should_create_fabric_capacity ? 1 : 0
input = { display_name = local.fabric_capacity_name }
depends_on = [module.fabric_capacity]
}
data "fabric_capacity" "created" {
count = length(terraform_data.defer_fabric_capacity_created)
display_name = terraform_data.defer_fabric_capacity_created[0].output.display_name
}
locals {
capacity_id = try(data.fabric_capacity.created[0].id, data.fabric_capacity.existing[0].id, null)
}
resource "fabric_workspace" "this" {
count = var.should_create_fabric_workspace ? 1 : 0
capacity_id = local.capacity_id
display_name = "fws-${local.resource_name_suffix}"
description = "Conversion pipeline workspace (${var.environment})"
}Edge-ai's versions.tf also has no provider "fabric" {} block and the blueprint README documents no FABRIC_* env vars. The microsoft/fabric provider supports Azure CLI auth (use_cli defaults to true) and picks up the same az login already used by azurerm. The SP-secret env-var path is one auth mode of several, not a requirement.
Proposed changes:
- Replace
fabric_capacity_uuid(variable + workspace gating +lifecycle.precondition) with the deferreddata "fabric_capacity"pattern above. Drop the entire "Two-pass deployment" README section. - Remove the
provider "fabric" {}block and its comment frominfrastructure/terraform/versions.tf. The provider auto-discovers via Azure CLI when no provider block is declared. - Remove the
FABRIC_TENANT_ID/FABRIC_CLIENT_ID/FABRIC_CLIENT_SECRETprerequisite from bothinfrastructure/README.mdandmodules/conversion-pipeline/README.md. Replace with a note thataz loginis sufficient and that the operator's identity (or an opt-in SP, if the user explicitly chooses SP auth) must be in the "Service principals can use Fabric APIs" tenant allow-list. - Pin the
fabricprovider to1.3.0(matching edge-ai) instead of~> 1.0, which would let any new1.xminor drift in.
This collapses the workflow to a single terraform apply, removes the secret-handling burden in CI, and aligns with the established Microsoft pattern.
Comment 2 — Storage overlap with the platform data-lake account
Files referenced:
infrastructure/terraform/modules/platform/storage.tfinfrastructure/terraform/modules/conversion-pipeline/main.tfinfrastructure/terraform/modules/conversion-pipeline/lifecycle.tfinfrastructure/terraform/main.tf
Comment body
The platform module already creates an HNS Gen2 data-lake account (stdl{prefix}{env}{instance}) with datasets, models, evaluation containers and lifecycle rules on datasets/raw/ (delete), datasets/converted/ (cool), and evaluation/reports/ (cool → archive). See modules/platform/storage.tf lines 61–120 and 200+.
The conversion-pipeline module creates a second HNS Gen2 account (stcp{prefix}{env}{instance}) with raw, converted, event-grid-dlq containers and the same lifecycle semantics on raw/ and converted/.
With the defaults should_create_data_lake_storage = true and should_deploy_conversion_pipeline = true, the deployment provisions:
- Two HNS Gen2 storage accounts in the same resource group
- Two
raw/convertedlanes with duplicate lifecycle policies - Two sets of blob + dfs private endpoints in the same PE subnet
The README's blast-radius rationale — "The AzureML extension storage account is managed separately by modules/platform" — refers to the st... ML-workspace account, not stdl... (the data-lake account). The data-lake account already serves the raw/converted use case and is silently duplicated.
There is no cross-gating in infrastructure/terraform/main.tf (should_create_data_lake_storage and should_deploy_conversion_pipeline are independent flags), and the conversion-pipeline README/variables make no mention of stdl.
Requested resolution (pick one and document it):
- Option A — Reuse the platform data-lake account (preferred). Add
data_lake_storage_accounttomodules/conversion-pipeline/variables.deps.tfas a typed object dependency, and create theraw/converted/event-grid-dlqcontainers (or use the existingdatasets/prefix) inside the platform-owned account. Dropstcp...and the duplicate private endpoints and lifecycle policy. This matches thevariables.deps.tfpattern already used bymodules/sil/andmodules/dataviewer/. - Option B — Mutually exclude. Add a root-level
preconditionthat fails when bothshould_create_data_lake_storageandshould_deploy_conversion_pipelinearetrue, and update the dev/staging/prod tfvars examples to flipshould_create_data_lake_storage = falsewhen the conversion pipeline is enabled. Document the rationale in both READMEs.
Option A is preferred — it eliminates the overlap rather than papering over it, and it preserves the intended platform/conversion-pipeline split (compute and event plumbing stay in conversion-pipeline; durable storage stays platform-owned).
- refactor conversion pipeline tests to validate data lake dependencies - remove unused variables related to storage account configuration - enhance role assignments for Fabric SP on datasets container - add precondition tests for conversion pipeline deployment 🔧 - Generated by Copilot
katriendg
left a comment
There was a problem hiding this comment.
Thanks for update and switch with the Fabric provide & data lake, looks clean now!
🤖 I have created a release *beep* *boop* --- ## [0.8.0](v0.7.4...v0.8.0) (2026-05-08) ### ⚠ BREAKING CHANGES * **dataviewer:** bump frontend stack to React 19, Vite 8, Tailwind v4, MSAL 5, ESLint 10 ([#524](#524)) ### ✨ Features * **agents:** add automated validation for high-risk Dependabot bumps ([#574](#574)) ([8c3686a](8c3686a)), closes [#573](#573) * **data:** add camera selector to annotation workspace and fix AV1 frame extraction ([#591](#591)) ([c809d2f](c809d2f)) * **data:** seed dataviewer frontend test foundation and per-section codecov flags ([#594](#594)) ([c06c4e3](c06c4e3)) * **dataviewer:** add OWASP security middleware stack ([#439](#439)) ([239edb9](239edb9)) * **infrastructure:** add conversion pipeline Terraform module ([#542](#542)) ([244531e](244531e)) * **infrastructure:** upgrade OSMO to chart 1.2.1 / image 6.2 with secure auth and skrl 2.0.0 compatibility ([#492](#492)) ([edfd7a5](edfd7a5)) * **pipeline:** add ACSA setup for ROS2 bag sync to Blob ([#451](#451)) ([c271a54](c271a54)) * **workflows:** add advisory Dependabot PR reviewer agentic workflow ([#498](#498)) ([d4bb140](d4bb140)) * **workflows:** trigger AW Dependabot PR reviewer after PR Validation ([#580](#580)) ([7ab3d16](7ab3d16)) ### 🐛 Bug Fixes * **ci:** correct stale version comment for actions/create-github-app-token ([#506](#506)) ([b2e9a54](b2e9a54)) * **ci:** restore data-pipeline and training broken tests by domain folder restructure ([#547](#547)) ([06d8472](06d8472)) * **docs:** update remaining stale 'Coming soon' labels in docs/README.md ([#507](#507)) ([02439d6](02439d6)) * **docs:** update stale coming soon label for Training section ([#472](#472)) ([46db49b](46db49b)) * **evaluation:** scope SIL AzureML validation code path and script reference ([#387](#387)) ([9f138a9](9f138a9)) * **infrastructure:** OSMO workflow execution, PostgreSQL public access, and quickstart corrections ([#477](#477)) ([9ed2da6](9ed2da6)) * **scripts:** exclude CHANGELOG.md from changed-files msdate check ([#644](#644)) ([8133bdc](8133bdc)) * **workflows:** allow dependabot[bot] to activate AW Dependabot PR Review ([#586](#586)) ([39dc022](39dc022)) * **workflows:** correct branches filter on AW Dependabot PR Review workflow_run trigger ([#584](#584)) ([fe06b52](fe06b52)) * **workflows:** normalize validate.yaml placeholder env/compute values ([#510](#510)) ([340ff44](340ff44)) * **workflows:** recompile aw-dependabot-pr-review lock file ([#576](#576)) ([d77c167](d77c167)) * **workflows:** switch AW Dependabot PR Review to pull_request_target ([#589](#589)) ([3f1edd1](3f1edd1)) ### 📚 Documentation * **docs:** Fix deployment guide links ([#614](#614)) ([0070b04](0070b04)) * document dependency-pinning-artifacts directory purpose ([#508](#508)) ([50e0010](50e0010)) ### 📦 Build System * **training:** standardize on Python 3.12 across manifests, containers, and runtime scripts ([#541](#541)) ([7ad014a](7ad014a)) ### 🔧 Operations * **build:** add Copilot cloud agent setup-steps workflow ([#593](#593)) ([c912668](c912668)) ### 🔧 Miscellaneous * **build:** exclude auto-generated CHANGELOG.md from cspell and seed dictionary ([#582](#582)) ([de1dd57](de1dd57)) * **build:** redesign codecov flags and split pytest CI per component ([#520](#520)) ([357e745](357e745)) * **dataviewer:** bump frontend stack to React 19, Vite 8, Tailwind v4, MSAL 5, ESLint 10 ([#524](#524)) ([50f8ad4](50f8ad4)) * **dataviewer:** repoint stale src/dataviewer references to data-management/viewer ([#504](#504)) ([88fa1b4](88fa1b4)), closes [#503](#503) * **deps-dev:** bump basic-ftp from 5.3.0 to 5.3.1 ([#618](#618)) ([ca10f2a](ca10f2a)) * **deps-dev:** bump globals from 15.15.0 to 17.5.0 in /data-management/viewer/frontend ([#527](#527)) ([0e0b2ae](0e0b2ae)) * **deps-dev:** bump ip-address from 10.1.0 to 10.2.0 ([#616](#616)) ([816c9cf](816c9cf)) * **deps-dev:** bump lint-staged from 16.4.0 to 17.0.2 in the root-npm-dependencies group across 1 directory ([#626](#626)) ([0e2f293](0e2f293)) * **deps-dev:** bump pydantic from 2.13.3 to 2.13.4 in the python-dependencies group across 1 directory ([#629](#629)) ([c24f1c1](c24f1c1)) * **deps-dev:** bump the python-dependencies group across 1 directory with 2 updates ([#514](#514)) ([8410f4b](8410f4b)) * **deps:** bump azure-core from 1.39.0 to 1.40.0 in /evaluation in the inference-dependencies group across 1 directory ([#597](#597)) ([6141db4](6141db4)) * **deps:** bump cryptography from 46.0.6 to 46.0.7 in /data-management/viewer ([#424](#424)) ([5fb6d58](5fb6d58)) * **deps:** bump cryptography from 46.0.6 to 46.0.7 in /data-management/viewer/backend ([#423](#423)) ([b516ad5](b516ad5)) * **deps:** bump lucide-react from 0.469.0 to 1.8.0 in /data-management/viewer/frontend ([#528](#528)) ([1bdfc1e](1bdfc1e)) * **deps:** bump nginx from `8aa63af` to `5616878` in /data-management/viewer/frontend ([#511](#511)) ([9e7e20e](9e7e20e)) * **deps:** bump nginx from 1.27-alpine to 1.29-alpine in /data-management/viewer/frontend ([#484](#484)) ([0e5c3dd](0e5c3dd)) * **deps:** bump node from `435f353` to `e49fd70` in /data-management/viewer/frontend ([#560](#560)) ([2884649](2884649)) * **deps:** bump react-is from 18.3.1 to 19.2.5 in /data-management/viewer/frontend ([#530](#530)) ([d51318c](d51318c)) * **deps:** bump tensordict from 0.11.0 to 0.12.1 in /evaluation in the inference-dependencies group across 1 directory ([#456](#456)) ([b24e733](b24e733)) * **deps:** bump the dataviewer-backend-dependencies group across 1 directory with 2 updates ([#531](#531)) ([171a1da](171a1da)) * **deps:** bump the dataviewer-backend-dependencies group across 1 directory with 5 updates ([#516](#516)) ([4f9a577](4f9a577)) * **deps:** bump the dataviewer-backend-dependencies group across 1 directory with 5 updates ([#602](#602)) ([6c27ab5](6c27ab5)) * **deps:** bump the dataviewer-dependencies group across 1 directory with 2 updates ([#529](#529)) ([8646971](8646971)) * **deps:** bump the dataviewer-dependencies group across 1 directory with 3 updates ([#601](#601)) ([d28fb50](d28fb50)) * **deps:** bump the dataviewer-dependencies group across 1 directory with 3 updates ([#632](#632)) ([4ca5f3e](4ca5f3e)) * **deps:** bump the dataviewer-dependencies group across 1 directory with 5 updates ([#515](#515)) ([109ee81](109ee81)) * **deps:** bump the dataviewer-frontend-patch-minor group across 1 directory with 6 updates ([#630](#630)) ([04d5dfd](04d5dfd)) * **deps:** bump the dataviewer-frontend-patch-minor group across 1 directory with 9 updates ([#563](#563)) ([c08f450](c08f450)) * **deps:** bump the docusaurus-dependencies group across 1 directory with 4 updates ([#627](#627)) ([f5825fc](f5825fc)) * **deps:** bump the docusaurus-dependencies group across 1 directory with 6 updates ([#599](#599)) ([b859344](b859344)) * **deps:** bump the github-actions group across 1 directory with 4 updates ([#459](#459)) ([2609c52](2609c52)) * **deps:** bump the github-actions group across 1 directory with 4 updates ([#517](#517)) ([f54bf5d](f54bf5d)) * **deps:** bump the inference-dependencies group across 1 directory with 11 updates ([#562](#562)) ([087f53a](087f53a)) * **deps:** bump the inference-dependencies group across 1 directory with 2 updates ([#628](#628)) ([4a3be47](4a3be47)) * **deps:** bump the pip group across 2 directories with 1 update ([#494](#494)) ([a14b6b0](a14b6b0)) * **docs:** update stale Python 3.11 references to 3.12 ([#575](#575)) ([6f85c95](6f85c95)) * **scripts:** remove redundant SC1091 disables in OSMO deploy scripts ([#509](#509)) ([ae1cb82](ae1cb82)) ### 🔒 Security * **build:** pin dependencies and hash-verify downloads ([#465](#465)) ([0289f49](0289f49)) * **build:** remediate dependency security advisories ([#479](#479)) ([7196d6d](7196d6d)) * **deps-dev:** bump basic-ftp from 5.2.1 to 5.2.2 ([#454](#454)) ([cb158f1](cb158f1)) * **deps-dev:** bump basic-ftp from 5.2.2 to 5.3.0 ([#495](#495)) ([e983b8b](e983b8b)) * **deps-dev:** bump hypothesis from 6.152.3 to 6.152.4 in the python-dependencies group ([#598](#598)) ([83384d2](83384d2)) * **deps-dev:** bump markdownlint-cli2 from 0.22.0 to 0.22.1 in the root-npm-dependencies group ([#559](#559)) ([32bde35](32bde35)) * **deps-dev:** bump picomatch from 2.3.1 to 2.3.2 in /docs/docusaurus ([#455](#455)) ([66f86ca](66f86ca)) * **deps-dev:** bump postcss from 8.5.10 to 8.5.12 in /data-management/viewer/frontend ([#569](#569)) ([a652dba](a652dba)) * **deps-dev:** bump the python-dependencies group with 2 updates ([#457](#457)) ([749d231](749d231)) * **deps-dev:** bump the python-dependencies group with 2 updates ([#485](#485)) ([71b44fd](71b44fd)) * **deps-dev:** bump the python-dependencies group with 3 updates ([#564](#564)) ([9fc52fd](9fc52fd)) * **deps-dev:** bump typescript from 6.0.2 to 6.0.3 in /docs/docusaurus in the docusaurus-dependencies group ([#513](#513)) ([5694dbc](5694dbc)) * **deps:** bump azureml/openmpi4.1.0-ubuntu22.04 from 20260303.v5 to 20260409.v4 in /evaluation/sil/docker ([#480](#480)) ([25d4df8](25d4df8)) * **deps:** bump cryptography from 46.0.6 to 46.0.7 in /evaluation in the uv group across 1 directory ([#538](#538)) ([92c5b2e](92c5b2e)) * **deps:** bump diffusers from 0.35.2 to 0.38.0 in /training/il/lerobot ([#638](#638)) ([6261d19](6261d19)) * **deps:** bump follow-redirects from 1.15.11 to 1.16.0 in /docs/docusaurus ([#469](#469)) ([0458908](0458908)) * **deps:** bump gitpython and mako for lerobot IL training ([#623](#623)) ([9f8022b](9f8022b)) * **deps:** bump node from 24.14.1-slim to 25.9.0-slim in /data-management/viewer/frontend ([#482](#482)) ([1532d09](1532d09)) * **deps:** bump packaging from 26.0 to 26.1 in /evaluation in the inference-dependencies group ([#483](#483)) ([f4afb6c](f4afb6c)) * **deps:** bump pillow from 12.1.1 to 12.2.0 ([#467](#467)) ([39fb663](39fb663)) * **deps:** bump python from 3.11-slim to 3.14-slim in /data-management/viewer/backend ([#481](#481)) ([7af9dfc](7af9dfc)) * **deps:** bump the dataviewer-backend-dependencies group across 1 directory with 15 updates ([#428](#428)) ([e4446a2](e4446a2)) * **deps:** bump the dataviewer-backend-dependencies group in /data-management/viewer/backend with 4 updates ([#487](#487)) ([0f57c5b](0f57c5b)) * **deps:** bump the dataviewer-backend-dependencies group in /data-management/viewer/backend with 8 updates ([#566](#566)) ([d6e7869](d6e7869)) * **deps:** bump the dataviewer-dependencies group across 1 directory with 5 updates ([#464](#464)) ([24c208d](24c208d)) * **deps:** bump the dataviewer-dependencies group in /data-management/viewer with 2 updates ([#486](#486)) ([90149f3](90149f3)) * **deps:** bump the dataviewer-dependencies group in /data-management/viewer with 6 updates ([#565](#565)) ([f0bb36b](f0bb36b)) * **deps:** bump the dataviewer-frontend-patch-minor group across 1 directory with 10 updates ([#613](#613)) ([e481f83](e481f83)) * **deps:** bump the github-actions group across 1 directory with 4 updates ([#534](#534)) ([5478ab6](5478ab6)) * **deps:** bump the github-actions group with 2 updates ([#488](#488)) ([4e6ce98](4e6ce98)) * **deps:** bump the github-actions group with 3 updates ([#567](#567)) ([48c38dc](48c38dc)) * **deps:** bump the github-actions group with 3 updates ([#634](#634)) ([00cfb49](00cfb49)) * **deps:** bump the github-actions group with 6 updates ([#603](#603)) ([73eb79a](73eb79a)) * **deps:** bump the training-dependencies group across 1 directory with 23 updates ([#463](#463)) ([d5a8656](d5a8656)) * **deps:** bump yaml from 2.8.2 to 2.8.3 in /data-management/viewer/frontend ([#453](#453)) ([10449df](10449df)) * pytest harness, dependabot advisories, and OSSF Scorecard remediations ([#501](#501)) ([e8756e8](e8756e8)) * **scripts:** pin and hash-verify all shell script downloads ([#468](#468)) ([0c2bb9c](0c2bb9c)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: physical-ai-toolchain-release[bot] <267194360+physical-ai-toolchain-release[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary
Adds a new
conversion-pipelineTerraform module that provisions the Azure infrastructure for the dataset conversion pipeline, along with supporting examples, root-level wiring, and CI updates.Fixes #39
Changes
infrastructure/terraform/modules/conversion-pipeline/:README.md,TERRAFORM.md) andterraform testcoverageinfrastructure/terraform/): wire the new module intomain.tf, expose outputs, add variables, and pin provider versionsterraform.tfvars.dev,terraform.tfvars.staging, andterraform.tfvars.prodsamplespr-validation.ymland add a newterraform-security.ymlworkflowTERRAFORM.mdfiles across modulesValidation
terraform testcases undermodules/conversion-pipeline/tests/lint:tf:validateand the new security scanCI / Security
This PR introduces a new code-scanning surface for Terraform via Checkov. Extended from #39 to cover security validation of the new module alongside the broader Terraform tree.
bridgecrewio/checkov-action), frameworkterraform,download_external_modules: false.infrastructure/terraformrecursively (all root deployments and modules under that path). Configurable via the reusable workflow'sworking-directoryinput.terraform-securityjob inpr-validation.ymlon every PR, and is reusable viaworkflow_call(.github/workflows/terraform-security.yml).soft-fail: true. Findings do not block merges today; the job is informational while the existing finding matrix is triaged and remediated.checkovcategory (visible to security and repo admins via code scanning alerts).checkov-sarif, 30-day retention) for offline review.soft-fail: falsein theterraform-securityjob inpr-validation.ymland addterraform-securityto the required-status-check aggregator.