-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathimproved-syntax.stack.js
More file actions
138 lines (112 loc) · 4.93 KB
/
improved-syntax.stack.js
File metadata and controls
138 lines (112 loc) · 4.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Example stack demonstrating the new DSL improvements:
// 1. Bulk Environment Variables
// 2. Secrets Path Shorthand
// 3. Domain Name Helpers
const settings = {
org: 'myorg',
common_name: 'myapp',
domain_name: 'example.io'
}
stack('improved-demo', { settings })
metadata({
description: 'DSL improvements: bulk envs, secret shortcuts, domain helpers',
tags: ['example', 'dsl', 'features']
})
backend('gcs', {
bucket: 'my-tf-state',
prefix: `${settings.org}-${settings.common_name}/stacks/{{ .stack }}/{{ .component }}`
})
// ============================================================================
// Feature 1: Bulk Environment Variables
// ============================================================================
// OLD WAY (verbose):
// envs('DIGITALOCEAN_TOKEN', secrets('sops://secrets.enc.yaml#/digitalocean/token'))
// envs('AWS_ACCESS_KEY_ID', secrets('sops://secrets.enc.yaml#/digitalocean/spaces_access_key'))
// envs('AWS_SECRET_ACCESS_KEY', secrets('sops://secrets.enc.yaml#/digitalocean/spaces_secret_key'))
// envs('CLOUDFLARE_API_TOKEN', secrets('sops://secrets.enc.yaml#/cloudflare/api_token'))
// NEW WAY (bulk object syntax):
// NOTE: Commented out - requires actual secrets file
// envs({
// DIGITALOCEAN_TOKEN: secrets('sops://secrets.enc.yaml#/digitalocean/token'),
// AWS_ACCESS_KEY_ID: secrets('sops://secrets.enc.yaml#/digitalocean/spaces_access_key'),
// AWS_SECRET_ACCESS_KEY: secrets('sops://secrets.enc.yaml#/digitalocean/spaces_secret_key'),
// CLOUDFLARE_API_TOKEN: secrets('sops://secrets.enc.yaml#/cloudflare/api_token')
// })
// Example with plain values
envs({
EXAMPLE_VAR_1: 'value1',
EXAMPLE_VAR_2: 'value2',
REGION: 'us-west-2'
})
// ============================================================================
// Feature 2: Secrets Path Shorthand
// ============================================================================
// Configure default secrets provider and path (optional, defaults shown)
// NOTE: Commented out - for demonstration only
// secretsConfig({
// defaultProvider: 'sops',
// defaultPath: 'secrets.enc.yaml'
// })
// Now you can use the shorthand secret() function
// OLD WAY (verbose):
// const datadogOld = component('datadog-old', 'modules/datadog', {
// api_key: secrets('sops://secrets.enc.yaml#/datadog/api_key'),
// app_key: secrets('sops://secrets.enc.yaml#/datadog/app_key'),
// cluster_name: `${settings.common_name}-{{ .stack }}`
// })
// NEW WAY (shorthand with forward slash):
// const datadog = component('datadog', 'modules/datadog', {
// api_key: secret('datadog/api_key'),
// app_key: secret('datadog/app_key'),
// cluster_name: `${settings.common_name}-{{ .stack }}`
// })
// ALSO WORKS (dot notation):
// const argocd = component('argocd', 'modules/argocd', {
// admin_password: secret('argocd.admin_password'),
// slack_token: secret('argocd.slack_token'),
// github_client_secret: secret('argocd.github_client_secret')
// })
// Still works with full path if needed
// const legacy = component('legacy', 'modules/legacy', {
// token: secrets('sops://secrets.enc.yaml#/legacy/token')
// })
// ============================================================================
// Feature 3: Template Strings for Domains
// ============================================================================
// Use template strings with placeholders for dynamic values:
const pgweb = component('pgweb', 'modules/pgweb', {
domain_name: 'pgweb.{{ .stack }}.{{ .settings.domain_name }}'
// Results in: pgweb.improved-demo.example.io
})
const argo = component('argo', 'modules/argocd', {
domain_name: 'argo.{{ .stack }}.{{ .settings.domain_name }}'
// Results in: argo.improved-demo.example.io
})
// For domains without stack prefix:
const api = component('api', 'modules/api', {
domain_name: 'api.{{ .settings.domain_name }}'
// Results in: api.example.io (no stack in domain)
})
// You can also create your own helper functions (see userland-helpers.stack.js)
// ============================================================================
// Complete Example: All Features Together
// ============================================================================
const database = component('database', 'modules/database', {
// Template for domain
admin_ui_domain: 'db-admin.{{ .stack }}.{{ .settings.domain_name }}',
// Regular config
storage_size: '100Gi',
replicas: 3
})
const monitoring = component('monitoring', 'modules/monitoring', {
// Multiple template domains
grafana_domain: 'grafana.{{ .stack }}.{{ .settings.domain_name }}',
prometheus_domain: 'prometheus.{{ .stack }}.{{ .settings.domain_name }}',
alertmanager_domain: 'alerts.{{ .stack }}.{{ .settings.domain_name }}',
// Database reference
database_url: database.connection_string
})
print('✅ New DSL features demonstrated successfully!')
print(' • Bulk environment variables')
print(' • Secret path shorthand (slash and dot notation)')
print(' • Domain helpers (subdomain and fqdn)')