terramate-io / terramate

Terramate CLI is an open-source Infrastructure as Code (IaC) Orchestration and Code Generation tool for Terraform, OpenTofu and Terragrunt.
https://terramate.io
Mozilla Public License 2.0
3.12k stars 86 forks source link

feat: add support for deployment targets #1723

Closed snakster closed 1 month ago

snakster commented 1 month ago

What this PR does / why we need it:

This PR adds support for specifying a deployment target when syncing/querying data to/from Terramate Cloud.

Stacks deployed to a specific target will only exist in that target, allowing to support multiple deployment "namespaces" i.e. staging, production, etc. with completely separate state.

The feature has to be enabled with

terramate {
  config {
    experiments = ["targets"]
    targets {
      enabled = true
    }
  }
}

If enabled, any cloud-enabled features require to specify a target with --target <target_id>, in particular:

Example:

-- Create two deployments for separate targets:
$terramate list
/my-stack
$ terramate run --sync-deployment --target prod -- <deploy cmd>
$ terramate run --sync-deployment --target staging -- <deploy cmd>

-- Sync drift
$ terramate run --sync-deployment --target staging -- <drift check cmd, returns drifted>

-- Check status
$ terramate list --status drifted --target staging
/my-stack
$ terramate list --status drifted --target prod
<nothing, drift status was only set for staging>

Which issue(s) this PR fixes:

Special notes for your reviewer:

Does this PR introduce a user-facing change?

Yes, it adds a new experimental feature.
github-actions[bot] commented 1 month ago
metric: time/op
CloudReadLines-4: old 1.00ms ± 5%: new 1.00ms ± 4%: delta: 0.00%
CloudReadLine-4: old 6.99ms ± 1%: new 7.02ms ± 1%: delta: 0.42%
ListFiles-4: old 53.2µs ± 1%: new 53.4µs ± 0%: delta: 0.47%
Generate-4: old 2.53s ± 1%: new 2.53s ± 1%: delta: 0.00%
GenerateRegex-4: old 1.72s ± 1%: new 1.74s ± 2%: delta: 1.17%
TokensForExpressionComplex-4: old 1.25ms ± 0%: new 1.25ms ± 0%: delta: 0.00%
TokensForExpressionPlainStringNoNewline-4: old 810ns ± 0%: new 810ns ± 0%: delta: 0.00%
TokensForExpressionStringWith100Newlines-4: old 21.7µs ± 0%: new 21.8µs ± 2%: delta: 0.77%
TokensForExpressionObjectWith100KeysWithNumberValues-4: old 1.44ms ± 0%: new 1.44ms ± 0%: delta: 0.43%
TokensForExpression-4: old 1.25ms ± 0%: new 1.25ms ± 0%: delta: 0.00%
PartialEvalComplex-4: old 576µs ± 0%: new 579µs ± 1%: delta: 0.54%
PartialEvalSmallString-4: old 3.61µs ± 0%: new 3.61µs ± 1%: delta: 0.19%
PartialEvalHugeString-4: old 1.88ms ± 1%: new 1.88ms ± 1%: delta: 0.00%
PartialEvalHugeInterpolatedString-4: old 4.94ms ± 1%: new 4.95ms ± 1%: delta: 0.00%
PartialEvalObject-4: old 24.3µs ± 1%: new 24.4µs ± 0%: delta: 0.57%
TmAllTrueLiteralList-4: old 6.26ms ± 0%: new 6.26ms ± 0%: delta: 0.00%
TmAllTrueFuncall-4: old 160µs ± 0%: new 161µs ± 1%: delta: 0.29%
TmAnyTrueLiteralList-4: old 147ms ± 0%: new 147ms ± 0%: delta: 0.00%
TmAnyTrueFuncall-4: old 162µs ± 1%: new 161µs ± 0%: delta: -0.32%
TmTernary-4: old 2.83µs ± 1%: new 2.82µs ± 1%: delta: -0.21%
TmTry-4: old 52.0µs ± 0%: new 52.0µs ± 0%: delta: 0.00%
metric: alloc/op
CloudReadLines-4: old 3.12MB ± 0%: new 3.12MB ± 0%: delta: 0.00%
CloudReadLine-4: old 3.37MB ± 0%: new 3.37MB ± 0%: delta: 0.00%
ListFiles-4: old 22.0kB ± 0%: new 22.0kB ± 0%: delta: 0.01%
Generate-4: old 2.32GB ± 0%: new 2.32GB ± 0%: delta: 0.00%
GenerateRegex-4: old 955MB ± 0%: new 956MB ± 0%: delta: 0.00%
TokensForExpressionComplex-4: old 404kB ± 0%: new 404kB ± 0%: delta: 0.00%
TokensForExpressionPlainStringNoNewline-4: old 512B ± 0%: new 512B ± 0%: delta: 0.00%
TokensForExpressionStringWith100Newlines-4: old 12.4kB ± 0%: new 12.4kB ± 0%: delta: 0.00%
TokensForExpressionObjectWith100KeysWithNumberValues-4: old 394kB ± 0%: new 394kB ± 0%: delta: 0.00%
TokensForExpression-4: old 404kB ± 0%: new 404kB ± 0%: delta: 0.00%
PartialEvalComplex-4: old 408kB ± 0%: new 408kB ± 0%: delta: 0.00%
PartialEvalSmallString-4: old 1.74kB ± 0%: new 1.74kB ± 0%: delta: 0.00%
PartialEvalHugeString-4: old 166kB ± 0%: new 166kB ± 0%: delta: 0.00%
PartialEvalHugeInterpolatedString-4: old 4.38MB ± 0%: new 4.38MB ± 0%: delta: 0.00%
PartialEvalObject-4: old 21.9kB ± 0%: new 21.9kB ± 0%: delta: 0.00%
TmAllTrueLiteralList-4: old 1.74MB ± 0%: new 1.74MB ± 0%: delta: 0.00%
TmAllTrueFuncall-4: old 45.5kB ± 0%: new 45.5kB ± 0%: delta: 0.00%
TmAnyTrueLiteralList-4: old 37.9MB ± 0%: new 37.9MB ± 0%: delta: 0.00%
TmAnyTrueFuncall-4: old 45.6kB ± 0%: new 45.6kB ± 0%: delta: 0.00%
TmTernary-4: old 1.20kB ± 0%: new 1.20kB ± 0%: delta: 0.00%
TmTry-4: old 11.2kB ± 0%: new 11.2kB ± 0%: delta: 0.00%
metric: allocs/op
CloudReadLines-4: old 5.54k ± 0%: new 5.54k ± 0%: delta: 0.00%
CloudReadLine-4: old 60.0k ± 0%: new 60.0k ± 0%: delta: 0.00%
ListFiles-4: old 321 ± 0%: new 321 ± 0%: delta: 0.00%
Generate-4: old 25.9M ± 0%: new 25.9M ± 0%: delta: 0.00%
GenerateRegex-4: old 18.6M ± 0%: new 18.6M ± 0%: delta: 0.00%
TokensForExpressionComplex-4: old 4.83k ± 0%: new 4.83k ± 0%: delta: 0.00%
TokensForExpressionPlainStringNoNewline-4: old 20.0 ± 0%: new 20.0 ± 0%: delta: 0.00%
TokensForExpressionStringWith100Newlines-4: old 227 ± 0%: new 227 ± 0%: delta: 0.00%
TokensForExpressionObjectWith100KeysWithNumberValues-4: old 3.19k ± 0%: new 3.19k ± 0%: delta: 0.00%
TokensForExpression-4: old 4.83k ± 0%: new 4.84k ± 0%: delta: 0.01%
PartialEvalComplex-4: old 3.65k ± 0%: new 3.65k ± 0%: delta: 0.00%
PartialEvalSmallString-4: old 23.0 ± 0%: new 23.0 ± 0%: delta: 0.00%
PartialEvalHugeString-4: old 35.0 ± 0%: new 35.0 ± 0%: delta: 0.00%
PartialEvalHugeInterpolatedString-4: old 23.1k ± 0%: new 23.1k ± 0%: delta: 0.00%
PartialEvalObject-4: old 153 ± 0%: new 153 ± 0%: delta: 0.00%
TmAllTrueLiteralList-4: old 13.6k ± 0%: new 13.6k ± 0%: delta: 0.00%
TmAllTrueFuncall-4: old 460 ± 0%: new 460 ± 0%: delta: 0.00%
TmAnyTrueLiteralList-4: old 252k ± 0%: new 252k ± 0%: delta: 0.00%
TmAnyTrueFuncall-4: old 462 ± 0%: new 462 ± 0%: delta: 0.00%
TmTernary-4: old 28.0 ± 0%: new 28.0 ± 0%: delta: 0.00%
TmTry-4: old 147 ± 0%: new 147 ± 0%: delta: 0.00%