From 16be5844be33d51fa72f953015518eaa9cb85fe4 Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Tue, 18 Aug 2026 17:42:41 +0200 Subject: [PATCH 1/2] feat(scorecard): add a hub-wide provider version floor check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A `>=` constraint only says "not older than this"; nothing in the repo said how old is still acceptable *anywhere*. `PROVIDER_FLOOR` at the top of scorecard.mjs is now that single knob — crank a value and the new `provider_floor` check turns red on every module still declaring less, which is the work item for the bump. The check covers every tier a module owns (meshstack_integration.tf, backplane/, buildingblock/, e2e/, incl. nested submodules) and fails two ways: a required_providers entry for a floor-managed provider with no `version` at all (unbounded — `tofu init` may resolve anything), or a constraint whose lower bound sits below the floor. It verifies rather than rewrites: HCL `required_providers` `version` must be a string literal, so there is nothing a module could reference. This matters for local runs specifically. The hub commits no .terraform.lock.hcl, and the smoke-test workflow injects a provider built from main through Terraform `dev_overrides`, bypassing both required_providers and any lockfile — so CI never notices a stale constraint, but `task e2e:run` does. pr-scorecard.sh now reports on all modules when tools/scorecard/ itself changed, because a PR that only turns the knob touches no module and would otherwise get an empty scorecard comment. Co-Authored-By: Claude Opus 5 --- AGENTS.md | 31 ++++++ tools/scorecard/pr-scorecard.sh | 17 ++++ tools/scorecard/scorecard.mjs | 174 ++++++++++++++++++++++++++++---- 3 files changed, 205 insertions(+), 17 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 5c36f59dc..a65b3de3f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -202,6 +202,37 @@ The `availability` field controls publication state and access restrictions. mes --- + +## Provider Version Floor + +A `>=` constraint says "not older than this"; the floor says **how old is still acceptable +anywhere in the hub**. It is declared in exactly one place — the `PROVIDER_FLOOR` map at the top of +[`tools/scorecard/scorecard.mjs`](tools/scorecard/scorecard.mjs) — and the `provider_floor` +scorecard check enforces it across every tier a module owns: `meshstack_integration.tf`, +`backplane/`, `buildingblock/` and `e2e/` (including nested submodules). + +Two things fail the check: + +- a `required_providers` entry for a floor-managed provider with **no** `version` at all — that is + unbounded, so `tofu init` may resolve an arbitrarily old release +- a constraint whose lower bound is **below** the floor (`>= 0.21.0` against a 0.23.0 floor, or a + constraint with no lower bound at all such as `< 1.0.0`) + +**To raise the floor for the whole hub**: edit the one value in `PROVIDER_FLOOR`, then run +`node tools/scorecard/scorecard.mjs --category=core`. Every module still declaring less turns red +and the failure detail names the file and the current constraint — that list is the bump work item. +The check verifies rather than rewrites, because HCL `required_providers` `version` must be a string +literal (no interpolation), so there is nothing a module could reference; and because the constraint +is a deliberate, reviewable statement about what a module needs. + +Why the floor is load-bearing even though nothing pins in CI: the hub commits no +`.terraform.lock.hcl` (root configurations own locking), and the smoke-test workflow injects a +provider built from `main` through Terraform `dev_overrides`, which bypasses both +`required_providers` and any lockfile. The floor is therefore what protects **local** runs +(`task e2e:run`, `terraform validate`) from silently resolving a stale provider. + +--- + ## Scorecard The repository includes a scorecard tool that checks module maturity across four categories: diff --git a/tools/scorecard/pr-scorecard.sh b/tools/scorecard/pr-scorecard.sh index 04747b2b6..15de30374 100755 --- a/tools/scorecard/pr-scorecard.sh +++ b/tools/scorecard/pr-scorecard.sh @@ -25,6 +25,11 @@ MODULES=$(git diff --name-only "${BASE_REF}...HEAD" \ | sed 's|^modules/\([^/]*/[^/]*\)/.*|\1|' \ | sort -u || true) +# A change to the scorecard tool itself is hub-wide in effect: a new detector, or a cranked +# PROVIDER_FLOOR, can turn modules red that this PR never touched. Scoping the report to +# changed modules would show nothing at all for a PR that only turns the floor knob. +TOOL_CHANGED=$(git diff --name-only "${BASE_REF}...HEAD" | grep -E '^tools/scorecard/' || true) + emit() { if [ -n "$OUTPUT_FILE" ]; then printf '%s\n' "$@" >> "$OUTPUT_FILE" @@ -35,6 +40,18 @@ emit() { [ -n "$OUTPUT_FILE" ] && : > "$OUTPUT_FILE" +if [ -n "$TOOL_CHANGED" ]; then + emit "> Scorecard run on commit \`$(git rev-parse HEAD)\` relative to \`${BASE_REF}\`" \ + "" \ + "> ⚙️ Scorecard tooling changed — reporting on **all** modules, not just the ones this PR touches." \ + "" + echo "Scorecard tooling changed — running the full hub" >&2 + node "$SCRIPT_DIR/scorecard.mjs" 2>&1 | { + if [ -n "$OUTPUT_FILE" ]; then cat >> "$OUTPUT_FILE"; else cat; fi + } || true + exit 0 +fi + if [ -z "$MODULES" ]; then emit "_No module changes detected relative to \`${BASE_REF}\`._" exit 0 diff --git a/tools/scorecard/scorecard.mjs b/tools/scorecard/scorecard.mjs index 83b042659..15260f877 100755 --- a/tools/scorecard/scorecard.mjs +++ b/tools/scorecard/scorecard.mjs @@ -19,6 +19,40 @@ import { join, relative } from "path"; const ROOT = new URL("../../", import.meta.url).pathname.replace(/\/$/, ""); const MODULES_DIR = join(ROOT, "modules"); +// ─── THE PROVIDER FLOOR KNOB ──────────────────────────────────────────────── +// +// One central place defining the minimum provider version the *entire hub* is +// meant to be tested and used with. Crank a value here and the `provider_floor` +// check turns red on every module still declaring less — that list is the work +// item for the bump. Nothing else in the repo hardcodes the floor. +// +// Keyed by registry source address (`namespace/type`), because the local name in +// `required_providers` is per-module and cannot be relied on. +// +// Why a floor is needed at all: nothing else establishes one. Module +// `required_providers` blocks that omit `version` let a local `tofu init` resolve +// an arbitrarily old provider, and the hub commits no `.terraform.lock.hcl` +// (root configurations own locking). CI does not catch this either — the +// smoke-test workflow builds the provider from `main` and injects it through +// Terraform `dev_overrides`, which bypasses both `required_providers` and any +// lockfile. So this floor is what protects *local* runs. +// +// Why meshstack sits at 0.23.0: that is the first release carrying the current +// `meshstack_building_block` resource. Older providers (on-disk local lockfiles +// were found reaching back to 0.20.5) predate the lifecycle-aware building block +// delete poll, where `DeletionSuccessful` accepted only a 404 and could not see a +// soft delete. A local e2e destroy then returns before the block is gone and the +// following building-block-*definition* delete fails with +// 409 "…because there are existing BuildingBlocks referencing it", stranding +// objects in the smoke-test workspace. +const PROVIDER_FLOOR = { + "meshcloud/meshstack": "0.23.0", +}; + +// Tiers a module owns whose provider constraints are subject to PROVIDER_FLOOR. +// `.` is the module root, i.e. `meshstack_integration.tf`. +const FLOOR_TIERS = [".", "backplane", "buildingblock", "e2e"]; + // ─── Category definitions ─────────────────────────────────────────────────── const CATEGORIES = { @@ -158,6 +192,53 @@ const detectors = [ }; }, }, + { + id: "provider_floor", + category: "core", + name: "Provider constraints meet the hub-wide version floor", + emoji: "⬆️", + fn: (mod) => { + // Every tier is in scope: the floor is what the hub as a whole is tested and + // used with, and each tier gets initialised somewhere — the integration by + // consumers, backplane + buildingblock by meshStack, and all three plus the + // e2e root by `task e2e:run` locally. + const entries = collectProviderEntries(mod, FLOOR_TIERS).filter( + (e) => e.source && PROVIDER_FLOOR[e.source] + ); + + if (entries.length === 0) { + return { pass: null, detail: "declares no floor-managed provider" }; + } + + const violations = []; + for (const e of entries) { + const floor = PROVIDER_FLOOR[e.source]; + if (e.constraint === null) { + violations.push(`${e.file}: ${e.name} has no version (need ">= ${floor}")`); + continue; + } + const lower = constraintLowerBound(e.constraint); + if (lower === null) { + violations.push( + `${e.file}: ${e.name} = "${e.constraint}" sets no lower bound (need ">= ${floor}")` + ); + continue; + } + if (compareVersions(lower, floor) < 0) { + violations.push(`${e.file}: ${e.name} = "${e.constraint}" is below ${floor}`); + } + } + + if (violations.length === 0) return { pass: true }; + + const shown = violations.slice(0, 4).join(", "); + const more = violations.length > 4 ? `, +${violations.length - 4} more` : ""; + return { + pass: false, + detail: `raise to the floor in tools/scorecard/scorecard.mjs (PROVIDER_FLOOR): ${shown}${more}`, + }; + }, + }, // ─── Integration ──────────────────────────────────────────────────────── { @@ -871,21 +952,28 @@ function stripHeredocs(content) { return content.replace(/<<-?\s*([A-Za-z_]\w*)\r?\n[\s\S]*?^\s*\1\s*$/gm, ""); } -// Every `version` attribute inside a `required_providers` block across BOTH tiers. -// -// Both tiers matter because they are consumed together: a hub e2e test module loads the -// backplane and the buildingblock into one configuration, so their constraints have to -// intersect on a version that exists. A `~>` or exact pin in either tier caps the whole -// configuration — that is how modules/meshstack/noop pinned the e2e suite to meshstack -// v0.21.0 from its backplane while its buildingblock declared only `>=`. +// The .tf files belonging to one tier. `.` is the module root — only its top-level +// files, so `meshstack_integration.tf` is covered without re-walking the other tiers. +function tfFilesForTier(mod, tier) { + if (tier !== ".") return collectTfFilesRecursive(join(mod.path, tier)); + return readdirSync(mod.path) + .filter((e) => e.endsWith(".tf")) + .map((e) => join(mod.path, e)) + .filter((p) => statSync(p).isFile()); +} + +// Every provider entry inside a `required_providers` block across the given tiers, +// as { file, tier, name, source, constraint } — `source`/`constraint` are null when the +// entry omits them. Entries are returned even without a version so callers can tell +// "declared with no constraint" (unbounded) apart from "provider not used at all". // -// Constraints are read from any .tf file, not just versions.tf: `provider.tf` is part of the +// Entries are read from any .tf file, not just versions.tf: `provider.tf` is part of the // documented module layout and legitimately carries required_providers. -function collectProviderConstraints(mod) { - const constraints = []; +function collectProviderEntries(mod, tiers) { + const entries = []; - for (const tier of ["backplane", "buildingblock"]) { - for (const file of collectTfFilesRecursive(join(mod.path, tier))) { + for (const tier of tiers) { + for (const file of tfFilesForTier(mod, tier)) { const content = stripHeredocs(readFileSync(file, "utf-8")); for (const m of content.matchAll(/required_providers\s*\{/g)) { @@ -897,18 +985,70 @@ function collectProviderConstraints(mod) { // Provider entries hold no nested braces, so a flat `name = { ... }` match is enough. for (const entry of body.matchAll(/([\w-]+)\s*=\s*\{([^{}]*)\}/g)) { const version = entry[2].match(/version\s*=\s*"([^"]+)"/); - if (!version) continue; - constraints.push({ + const source = entry[2].match(/source\s*=\s*"([^"]+)"/); + entries.push({ file: relative(mod.path, file), - provider: entry[1], - constraint: version[1], + tier, + name: entry[1], + source: source ? source[1] : null, + constraint: version ? version[1] : null, }); } } } } - return constraints; + return entries; +} + +// Every `version` attribute inside a `required_providers` block across BOTH tiers. +// +// Both tiers matter because they are consumed together: a hub e2e test module loads the +// backplane and the buildingblock into one configuration, so their constraints have to +// intersect on a version that exists. A `~>` or exact pin in either tier caps the whole +// configuration — that is how modules/meshstack/noop pinned the e2e suite to meshstack +// v0.21.0 from its backplane while its buildingblock declared only `>=`. +function collectProviderConstraints(mod) { + return collectProviderEntries(mod, ["backplane", "buildingblock"]).filter( + (e) => e.constraint !== null + ).map((e) => ({ file: e.file, provider: e.name, constraint: e.constraint })); +} + +// ─── Version constraint arithmetic ────────────────────────────────────────── + +function parseVersion(v) { + const parts = v.split(".").map((p) => parseInt(p, 10)); + return [parts[0] || 0, parts[1] || 0, parts[2] || 0]; +} + +function compareVersions(a, b) { + const pa = parseVersion(a); + const pb = parseVersion(b); + for (let i = 0; i < 3; i++) { + if (pa[i] !== pb[i]) return pa[i] < pb[i] ? -1 : 1; + } + return 0; +} + +// The lowest version a Terraform constraint string still admits, or null when it +// admits arbitrarily old versions (e.g. "< 1.0.0", or an empty/unparsable string). +// `>` is treated as its own version — deliberately conservative: `> 0.22.0` admits +// 0.22.1, which is still below a 0.23.0 floor, so it must not pass. +function constraintLowerBound(constraint) { + let lower = null; + + for (const raw of constraint.split(",")) { + const term = raw.trim(); + if (term === "") continue; + const m = term.match(/^(>=|>|~>|==|=|!=|<=|<)?\s*v?(\d+(?:\.\d+){0,2})/); + if (!m) continue; + const op = m[1] ?? "="; + if (op === "<" || op === "<=" || op === "!=") continue; + // >=, >, ~>, ==, = all put a floor at the stated version. + if (lower === null || compareVersions(m[2], lower) > 0) lower = m[2]; + } + + return lower; } function readAllBackplaneTf(mod) { From 7abeb1e8a4378b79d801a745146ea936b76ae4ed Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Tue, 18 Aug 2026 17:44:35 +0200 Subject: [PATCH 2/2] chore: raise the meshstack provider floor to >= 0.23.0 across the hub MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Satisfies the new `provider_floor` scorecard check: every meshcloud/meshstack entry in a module now declares at least `>= 0.23.0`, the first release carrying the current `meshstack_building_block` resource. Two kinds of change, 41 .tf files (+ 4 regenerated buildingblock READMEs): - e2e roots (and their nested submodules) declared the provider with no `version` at all, so a local `tofu init` was free to resolve anything. On-disk lockfiles in this checkout had settled as far back as 0.20.5. Anything below 0.23.0 predates the lifecycle-aware building block delete poll, where `DeletionSuccessful` accepted only a 404 and could not see a soft delete: a local `task e2e:run` teardown then returns before the block is gone and the following building-block-*definition* delete fails with 409 "…because there are existing BuildingBlocks referencing it", stranding objects in the smoke-test workspace. - integration/backplane/buildingblock tiers carried floors from `>= 0.7.1` to `>= 0.21.0`, predating the same fix. Five provider-level meshstack_integration.tf files (modules//) are bumped for consistency but sit outside the scorecard's module discovery, which only walks modules/// — the check cannot guard them. The four README Requirements rows are hand-applied rather than regenerated: the terraform-docs available here (0.22.0) reformats every table separator in the file, which is unrelated churn. Only the meshstack version cell is changed, which is exactly what the pinned hook would produce. Co-Authored-By: Claude Opus 5 --- modules/aks/github-connector/meshstack_integration.tf | 2 +- modules/aks/meshstack_integration.tf | 2 +- modules/aws/agentic-coding-sandbox/buildingblock/README.md | 2 +- modules/aws/agentic-coding-sandbox/buildingblock/versions.tf | 2 +- modules/aws/route53-dns-alias-record/meshstack_integration.tf | 2 +- modules/aws/route53-dns-record/meshstack_integration.tf | 2 +- modules/aws/s3_bucket/meshstack_integration.tf | 2 +- modules/azure/budget-alert/e2e/terraform.tf | 3 ++- modules/azure/budget-alert/meshstack_integration.tf | 2 +- modules/azure/entra-id-groups/meshstack_integration.tf | 2 +- modules/azure/meshstack_integration.tf | 2 +- modules/azure/resource-group/e2e/terraform.tf | 3 ++- modules/azure/resource-group/meshstack_integration.tf | 2 +- modules/azure/service-principal/meshstack_integration.tf | 2 +- modules/azure/storage-account/e2e/terraform.tf | 3 ++- modules/azure/storage-account/meshstack_integration.tf | 2 +- modules/gcp/storage-bucket/meshstack_integration.tf | 2 +- modules/github/repository/meshstack_integration.tf | 2 +- modules/kubernetes/manifest/meshstack_integration.tf | 2 +- modules/meshstack/github-workflow/e2e/terraform.tf | 3 ++- modules/meshstack/github-workflow/meshstack_integration.tf | 2 +- modules/meshstack/link/e2e/terraform.tf | 3 ++- modules/meshstack/link/meshstack_integration.tf | 2 +- modules/meshstack/manual/e2e/terraform.tf | 3 ++- modules/meshstack/manual/meshstack_integration.tf | 2 +- modules/meshstack/noop/backplane/versions.tf | 2 +- modules/meshstack/noop/e2e/env-audit/terraform.tf | 3 ++- modules/meshstack/noop/e2e/runner/terraform.tf | 3 ++- modules/meshstack/noop/e2e/terraform.tf | 3 ++- modules/meshstack/noop/meshstack_integration.tf | 2 +- modules/meshstack/payment-method/buildingblock/README.md | 2 +- modules/meshstack/payment-method/buildingblock/versions.tf | 2 +- modules/oci/application-compartment/buildingblock/README.md | 2 +- modules/oci/application-compartment/buildingblock/provider.tf | 2 +- modules/ske/forgejo-connector/meshstack_integration.tf | 2 +- .../e2e/meshstack_kubernetes_platform/terraform.tf | 3 ++- modules/ske/ske-starterkit/e2e/terraform.tf | 3 ++- modules/stackit/git-repository/e2e/terraform.tf | 3 ++- modules/stackit/git-repository/meshstack_integration.tf | 2 +- modules/stackit/network-area/meshstack_integration.tf | 2 +- modules/stackit/network/meshstack_integration.tf | 2 +- modules/stackit/project/buildingblock/README.md | 2 +- modules/stackit/project/buildingblock/versions.tf | 2 +- modules/stackit/storage-bucket/e2e/terraform.tf | 3 ++- modules/stackit/storage-bucket/meshstack_integration.tf | 2 +- 45 files changed, 58 insertions(+), 45 deletions(-) diff --git a/modules/aks/github-connector/meshstack_integration.tf b/modules/aks/github-connector/meshstack_integration.tf index 3e66ad983..cbad684c4 100644 --- a/modules/aks/github-connector/meshstack_integration.tf +++ b/modules/aks/github-connector/meshstack_integration.tf @@ -232,7 +232,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/aks/meshstack_integration.tf b/modules/aks/meshstack_integration.tf index b7b5c40f8..493fc7c5f 100644 --- a/modules/aks/meshstack_integration.tf +++ b/modules/aks/meshstack_integration.tf @@ -183,7 +183,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } azuread = { source = "hashicorp/azuread" diff --git a/modules/aws/agentic-coding-sandbox/buildingblock/README.md b/modules/aws/agentic-coding-sandbox/buildingblock/README.md index 39f3df466..7a9fdb6e3 100644 --- a/modules/aws/agentic-coding-sandbox/buildingblock/README.md +++ b/modules/aws/agentic-coding-sandbox/buildingblock/README.md @@ -77,7 +77,7 @@ End users provide: | Name | Version | |------|---------| -| [meshstack](#requirement\_meshstack) | >= 0.7.1 | +| [meshstack](#requirement\_meshstack) | >= 0.23.0 | ## Modules diff --git a/modules/aws/agentic-coding-sandbox/buildingblock/versions.tf b/modules/aws/agentic-coding-sandbox/buildingblock/versions.tf index 0cc33709a..cfbecac3b 100644 --- a/modules/aws/agentic-coding-sandbox/buildingblock/versions.tf +++ b/modules/aws/agentic-coding-sandbox/buildingblock/versions.tf @@ -2,7 +2,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.7.1" + version = ">= 0.23.0" } } } \ No newline at end of file diff --git a/modules/aws/route53-dns-alias-record/meshstack_integration.tf b/modules/aws/route53-dns-alias-record/meshstack_integration.tf index bc51db420..32134220e 100644 --- a/modules/aws/route53-dns-alias-record/meshstack_integration.tf +++ b/modules/aws/route53-dns-alias-record/meshstack_integration.tf @@ -239,7 +239,7 @@ terraform { } meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/aws/route53-dns-record/meshstack_integration.tf b/modules/aws/route53-dns-record/meshstack_integration.tf index d8249ff28..1af995b79 100644 --- a/modules/aws/route53-dns-record/meshstack_integration.tf +++ b/modules/aws/route53-dns-record/meshstack_integration.tf @@ -233,7 +233,7 @@ terraform { } meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/aws/s3_bucket/meshstack_integration.tf b/modules/aws/s3_bucket/meshstack_integration.tf index 503b14044..78778244e 100644 --- a/modules/aws/s3_bucket/meshstack_integration.tf +++ b/modules/aws/s3_bucket/meshstack_integration.tf @@ -191,7 +191,7 @@ terraform { } meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/azure/budget-alert/e2e/terraform.tf b/modules/azure/budget-alert/e2e/terraform.tf index 39e32bf61..8ef1256d6 100644 --- a/modules/azure/budget-alert/e2e/terraform.tf +++ b/modules/azure/budget-alert/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/budget-alert/meshstack_integration.tf b/modules/azure/budget-alert/meshstack_integration.tf index 1ec281b4c..8b8a41d60 100644 --- a/modules/azure/budget-alert/meshstack_integration.tf +++ b/modules/azure/budget-alert/meshstack_integration.tf @@ -230,7 +230,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/entra-id-groups/meshstack_integration.tf b/modules/azure/entra-id-groups/meshstack_integration.tf index 537fc3cd2..4ffeba52d 100644 --- a/modules/azure/entra-id-groups/meshstack_integration.tf +++ b/modules/azure/entra-id-groups/meshstack_integration.tf @@ -255,7 +255,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/meshstack_integration.tf b/modules/azure/meshstack_integration.tf index 540b168a6..311afdee9 100644 --- a/modules/azure/meshstack_integration.tf +++ b/modules/azure/meshstack_integration.tf @@ -249,7 +249,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/resource-group/e2e/terraform.tf b/modules/azure/resource-group/e2e/terraform.tf index 39e32bf61..8ef1256d6 100644 --- a/modules/azure/resource-group/e2e/terraform.tf +++ b/modules/azure/resource-group/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/resource-group/meshstack_integration.tf b/modules/azure/resource-group/meshstack_integration.tf index e45c31e65..203afa2c9 100644 --- a/modules/azure/resource-group/meshstack_integration.tf +++ b/modules/azure/resource-group/meshstack_integration.tf @@ -226,7 +226,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/service-principal/meshstack_integration.tf b/modules/azure/service-principal/meshstack_integration.tf index e3055a61b..626cf4ab7 100644 --- a/modules/azure/service-principal/meshstack_integration.tf +++ b/modules/azure/service-principal/meshstack_integration.tf @@ -258,7 +258,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/storage-account/e2e/terraform.tf b/modules/azure/storage-account/e2e/terraform.tf index 39e32bf61..8ef1256d6 100644 --- a/modules/azure/storage-account/e2e/terraform.tf +++ b/modules/azure/storage-account/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/azure/storage-account/meshstack_integration.tf b/modules/azure/storage-account/meshstack_integration.tf index 5ab8aca8e..5f4356b3b 100644 --- a/modules/azure/storage-account/meshstack_integration.tf +++ b/modules/azure/storage-account/meshstack_integration.tf @@ -223,7 +223,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } azurerm = { source = "hashicorp/azurerm" diff --git a/modules/gcp/storage-bucket/meshstack_integration.tf b/modules/gcp/storage-bucket/meshstack_integration.tf index afee390a0..ddec339d7 100644 --- a/modules/gcp/storage-bucket/meshstack_integration.tf +++ b/modules/gcp/storage-bucket/meshstack_integration.tf @@ -203,7 +203,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } google = { source = "hashicorp/google" diff --git a/modules/github/repository/meshstack_integration.tf b/modules/github/repository/meshstack_integration.tf index e0a202234..5fa1a9c28 100644 --- a/modules/github/repository/meshstack_integration.tf +++ b/modules/github/repository/meshstack_integration.tf @@ -255,7 +255,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/kubernetes/manifest/meshstack_integration.tf b/modules/kubernetes/manifest/meshstack_integration.tf index 39009f898..f3a7db4be 100644 --- a/modules/kubernetes/manifest/meshstack_integration.tf +++ b/modules/kubernetes/manifest/meshstack_integration.tf @@ -205,7 +205,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/github-workflow/e2e/terraform.tf b/modules/meshstack/github-workflow/e2e/terraform.tf index 3d4bedc5b..499dac0db 100644 --- a/modules/meshstack/github-workflow/e2e/terraform.tf +++ b/modules/meshstack/github-workflow/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/github-workflow/meshstack_integration.tf b/modules/meshstack/github-workflow/meshstack_integration.tf index 91e4ee045..511b99c82 100644 --- a/modules/meshstack/github-workflow/meshstack_integration.tf +++ b/modules/meshstack/github-workflow/meshstack_integration.tf @@ -219,7 +219,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/link/e2e/terraform.tf b/modules/meshstack/link/e2e/terraform.tf index 3d4bedc5b..499dac0db 100644 --- a/modules/meshstack/link/e2e/terraform.tf +++ b/modules/meshstack/link/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/link/meshstack_integration.tf b/modules/meshstack/link/meshstack_integration.tf index 6d4b6cb30..c26914492 100644 --- a/modules/meshstack/link/meshstack_integration.tf +++ b/modules/meshstack/link/meshstack_integration.tf @@ -222,7 +222,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/manual/e2e/terraform.tf b/modules/meshstack/manual/e2e/terraform.tf index 3d4bedc5b..499dac0db 100644 --- a/modules/meshstack/manual/e2e/terraform.tf +++ b/modules/meshstack/manual/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/manual/meshstack_integration.tf b/modules/meshstack/manual/meshstack_integration.tf index f9443320d..f013ee6ad 100644 --- a/modules/meshstack/manual/meshstack_integration.tf +++ b/modules/meshstack/manual/meshstack_integration.tf @@ -110,7 +110,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/noop/backplane/versions.tf b/modules/meshstack/noop/backplane/versions.tf index 91ce98f6f..448976605 100644 --- a/modules/meshstack/noop/backplane/versions.tf +++ b/modules/meshstack/noop/backplane/versions.tf @@ -12,7 +12,7 @@ terraform { } meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } time = { source = "hashicorp/time" diff --git a/modules/meshstack/noop/e2e/env-audit/terraform.tf b/modules/meshstack/noop/e2e/env-audit/terraform.tf index 1e6fcb010..6de0a9e2d 100644 --- a/modules/meshstack/noop/e2e/env-audit/terraform.tf +++ b/modules/meshstack/noop/e2e/env-audit/terraform.tf @@ -2,7 +2,8 @@ terraform { required_version = ">= 1.0" required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/noop/e2e/runner/terraform.tf b/modules/meshstack/noop/e2e/runner/terraform.tf index bd4e078f8..18af6a0e6 100644 --- a/modules/meshstack/noop/e2e/runner/terraform.tf +++ b/modules/meshstack/noop/e2e/runner/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } google = { source = "hashicorp/google" diff --git a/modules/meshstack/noop/e2e/terraform.tf b/modules/meshstack/noop/e2e/terraform.tf index eb95de8ab..b1ecdd7ea 100644 --- a/modules/meshstack/noop/e2e/terraform.tf +++ b/modules/meshstack/noop/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/noop/meshstack_integration.tf b/modules/meshstack/noop/meshstack_integration.tf index 3bf8abdbe..0a7db55cf 100644 --- a/modules/meshstack/noop/meshstack_integration.tf +++ b/modules/meshstack/noop/meshstack_integration.tf @@ -239,7 +239,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/meshstack/payment-method/buildingblock/README.md b/modules/meshstack/payment-method/buildingblock/README.md index 3bf4757e2..1c661d974 100644 --- a/modules/meshstack/payment-method/buildingblock/README.md +++ b/modules/meshstack/payment-method/buildingblock/README.md @@ -63,7 +63,7 @@ module "payment_method" { | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.0 | -| [meshstack](#requirement\_meshstack) | >= 0.14.0 | +| [meshstack](#requirement\_meshstack) | >= 0.23.0 | ## Modules diff --git a/modules/meshstack/payment-method/buildingblock/versions.tf b/modules/meshstack/payment-method/buildingblock/versions.tf index 84dee37ac..499dac0db 100644 --- a/modules/meshstack/payment-method/buildingblock/versions.tf +++ b/modules/meshstack/payment-method/buildingblock/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.14.0" + version = ">= 0.23.0" } } } diff --git a/modules/oci/application-compartment/buildingblock/README.md b/modules/oci/application-compartment/buildingblock/README.md index 0a6b04cf8..7002fa25c 100644 --- a/modules/oci/application-compartment/buildingblock/README.md +++ b/modules/oci/application-compartment/buildingblock/README.md @@ -161,7 +161,7 @@ The module automatically: | Name | Version | |------|---------| -| [meshstack](#requirement\_meshstack) | >= 0.21.0 | +| [meshstack](#requirement\_meshstack) | >= 0.23.0 | | [oci](#requirement\_oci) | 7.32.0 | ## Modules diff --git a/modules/oci/application-compartment/buildingblock/provider.tf b/modules/oci/application-compartment/buildingblock/provider.tf index 6007c065f..980e46619 100644 --- a/modules/oci/application-compartment/buildingblock/provider.tf +++ b/modules/oci/application-compartment/buildingblock/provider.tf @@ -2,7 +2,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } oci = { source = "oracle/oci" diff --git a/modules/ske/forgejo-connector/meshstack_integration.tf b/modules/ske/forgejo-connector/meshstack_integration.tf index af7393865..674422ba4 100644 --- a/modules/ske/forgejo-connector/meshstack_integration.tf +++ b/modules/ske/forgejo-connector/meshstack_integration.tf @@ -269,7 +269,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/ske/ske-starterkit/e2e/meshstack_kubernetes_platform/terraform.tf b/modules/ske/ske-starterkit/e2e/meshstack_kubernetes_platform/terraform.tf index 6b9b271ab..901cb8a1d 100644 --- a/modules/ske/ske-starterkit/e2e/meshstack_kubernetes_platform/terraform.tf +++ b/modules/ske/ske-starterkit/e2e/meshstack_kubernetes_platform/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } kubernetes = { source = "hashicorp/kubernetes" diff --git a/modules/ske/ske-starterkit/e2e/terraform.tf b/modules/ske/ske-starterkit/e2e/terraform.tf index 46994e513..01aeae495 100644 --- a/modules/ske/ske-starterkit/e2e/terraform.tf +++ b/modules/ske/ske-starterkit/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } kubernetes = { source = "hashicorp/kubernetes" diff --git a/modules/stackit/git-repository/e2e/terraform.tf b/modules/stackit/git-repository/e2e/terraform.tf index 3d4bedc5b..499dac0db 100644 --- a/modules/stackit/git-repository/e2e/terraform.tf +++ b/modules/stackit/git-repository/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } } } diff --git a/modules/stackit/git-repository/meshstack_integration.tf b/modules/stackit/git-repository/meshstack_integration.tf index e1c944499..7c96a6468 100644 --- a/modules/stackit/git-repository/meshstack_integration.tf +++ b/modules/stackit/git-repository/meshstack_integration.tf @@ -281,7 +281,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/stackit/network-area/meshstack_integration.tf b/modules/stackit/network-area/meshstack_integration.tf index f0e597480..e62c1d9b3 100644 --- a/modules/stackit/network-area/meshstack_integration.tf +++ b/modules/stackit/network-area/meshstack_integration.tf @@ -272,7 +272,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } stackit = { source = "stackitcloud/stackit" diff --git a/modules/stackit/network/meshstack_integration.tf b/modules/stackit/network/meshstack_integration.tf index 1e2201bc0..3678428c9 100644 --- a/modules/stackit/network/meshstack_integration.tf +++ b/modules/stackit/network/meshstack_integration.tf @@ -236,7 +236,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } stackit = { source = "stackitcloud/stackit" diff --git a/modules/stackit/project/buildingblock/README.md b/modules/stackit/project/buildingblock/README.md index 262c4f4b3..cce6edda9 100644 --- a/modules/stackit/project/buildingblock/README.md +++ b/modules/stackit/project/buildingblock/README.md @@ -44,7 +44,7 @@ provider "stackit" { | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.11.0 | -| [meshstack](#requirement\_meshstack) | >= 0.21.0 | +| [meshstack](#requirement\_meshstack) | >= 0.23.0 | | [stackit](#requirement\_stackit) | >= 0.98.0 | ## Modules diff --git a/modules/stackit/project/buildingblock/versions.tf b/modules/stackit/project/buildingblock/versions.tf index 364654db5..fc4c659fa 100644 --- a/modules/stackit/project/buildingblock/versions.tf +++ b/modules/stackit/project/buildingblock/versions.tf @@ -7,7 +7,7 @@ terraform { } meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } } diff --git a/modules/stackit/storage-bucket/e2e/terraform.tf b/modules/stackit/storage-bucket/e2e/terraform.tf index b86edddbd..749570fff 100644 --- a/modules/stackit/storage-bucket/e2e/terraform.tf +++ b/modules/stackit/storage-bucket/e2e/terraform.tf @@ -3,7 +3,8 @@ terraform { required_providers { meshstack = { - source = "meshcloud/meshstack" + source = "meshcloud/meshstack" + version = ">= 0.23.0" } stackit = { source = "stackitcloud/stackit" diff --git a/modules/stackit/storage-bucket/meshstack_integration.tf b/modules/stackit/storage-bucket/meshstack_integration.tf index bf04b12cf..111056041 100644 --- a/modules/stackit/storage-bucket/meshstack_integration.tf +++ b/modules/stackit/storage-bucket/meshstack_integration.tf @@ -240,7 +240,7 @@ terraform { required_providers { meshstack = { source = "meshcloud/meshstack" - version = ">= 0.21.0" + version = ">= 0.23.0" } } }