@vfarcic/dot-ai 0.102.0 → 0.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/core/nushell-runtime.d.ts +39 -0
- package/dist/core/nushell-runtime.d.ts.map +1 -0
- package/dist/core/nushell-runtime.js +103 -0
- package/dist/core/platform-operations.d.ts +76 -0
- package/dist/core/platform-operations.d.ts.map +1 -0
- package/dist/core/platform-operations.js +317 -0
- package/dist/interfaces/mcp.d.ts.map +1 -1
- package/dist/interfaces/mcp.js +9 -1
- package/dist/tools/build-platform.d.ts +25 -0
- package/dist/tools/build-platform.d.ts.map +1 -0
- package/dist/tools/build-platform.js +277 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -1
- package/dist/tools/version.d.ts +7 -0
- package/dist/tools/version.d.ts.map +1 -1
- package/dist/tools/version.js +34 -5
- package/package.json +3 -2
- package/prompts/map-intent-to-operation.md +104 -0
- package/prompts/parse-script-operations.md +72 -0
- package/scripts/ack.nu +195 -0
- package/scripts/anthropic.nu +24 -0
- package/scripts/argo-workflows.nu +47 -0
- package/scripts/argocd.nu +85 -0
- package/scripts/aso.nu +74 -0
- package/scripts/atlas.nu +15 -0
- package/scripts/backstage.nu +349 -0
- package/scripts/cert-manager.nu +13 -0
- package/scripts/cnpg.nu +14 -0
- package/scripts/common.nu +116 -0
- package/scripts/crossplane.nu +718 -0
- package/scripts/dot.nu +32 -0
- package/scripts/external-secrets.nu +110 -0
- package/scripts/gatekeeper.nu +19 -0
- package/scripts/github.nu +42 -0
- package/scripts/image.nu +67 -0
- package/scripts/ingress.nu +149 -0
- package/scripts/kro.nu +11 -0
- package/scripts/kubernetes.nu +609 -0
- package/scripts/kubevela.nu +22 -0
- package/scripts/kyverno.nu +16 -0
- package/scripts/mcp.nu +139 -0
- package/scripts/port.nu +71 -0
- package/scripts/prometheus.nu +21 -0
- package/scripts/registry.nu +55 -0
- package/scripts/storage.nu +210 -0
- package/scripts/tests.nu +12 -0
- package/scripts/toolhive.nu +21 -0
- package/scripts/velero.nu +45 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
#!/usr/bin/env nu
|
|
2
|
+
|
|
3
|
+
# Configures a Backstage instance with Crossplane integration
|
|
4
|
+
def --env "main configure backstage" [] {
|
|
5
|
+
|
|
6
|
+
rm --force --recursive backstage
|
|
7
|
+
|
|
8
|
+
print $"
|
|
9
|
+
When asked for a name for the Backstage app make sure to keep the default value (ansi yellow_bold)backstage(ansi reset)
|
|
10
|
+
Press the (ansi yellow_bold)enter key(ansi reset) to continue.
|
|
11
|
+
"
|
|
12
|
+
input
|
|
13
|
+
|
|
14
|
+
npx @backstage/create-app@latest
|
|
15
|
+
|
|
16
|
+
cd backstage
|
|
17
|
+
|
|
18
|
+
for package in [
|
|
19
|
+
"@terasky/backstage-plugin-crossplane-common@1.1.0",
|
|
20
|
+
"@terasky/backstage-plugin-crossplane-permissions-backend@1.1.1",
|
|
21
|
+
"@terasky/backstage-plugin-kubernetes-ingestor@1.5.0",
|
|
22
|
+
"@terasky/backstage-plugin-scaffolder-backend-module-terasky-utils@1.1.0"
|
|
23
|
+
] {
|
|
24
|
+
yarn --cwd packages/backend add $package
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
for package in [
|
|
28
|
+
"@terasky/backstage-plugin-crossplane-resources-frontend@1.4.0"
|
|
29
|
+
] {
|
|
30
|
+
yarn --cwd packages/app add $package
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
open app-config.yaml
|
|
34
|
+
| upsert backend.csp.upgrade-insecure-requests false
|
|
35
|
+
| upsert crossplane.enablePermissions false
|
|
36
|
+
| upsert kubernetesIngestor.components.enabled true
|
|
37
|
+
| upsert kubernetesIngestor.components.taskRunner.frequency 10
|
|
38
|
+
| upsert kubernetesIngestor.components.taskRunner.timeout 600
|
|
39
|
+
| upsert kubernetesIngestor.components.excludedNamespaces []
|
|
40
|
+
| upsert kubernetesIngestor.components.excludedNamespaces.0 "kube-public"
|
|
41
|
+
| upsert kubernetesIngestor.components.excludedNamespaces.1 "kube-system"
|
|
42
|
+
| upsert kubernetesIngestor.components.customWorkloadTypes []
|
|
43
|
+
| upsert kubernetesIngestor.components.customWorkloadTypes.0 { group: "core.oam.dev", apiVersion: "v1beta1", plural: "applications" }
|
|
44
|
+
| upsert kubernetesIngestor.components.disableDefaultWorkloadTypes "${DISABLE_DEFAULT_WORKLOAD_TYPES-false}"
|
|
45
|
+
| upsert kubernetesIngestor.components.onlyIngestAnnotatedResources false
|
|
46
|
+
| upsert kubernetesIngestor.crossplane.claims.ingestAllClaims true
|
|
47
|
+
| upsert kubernetesIngestor.crossplane.xrds.publishPhase.allowedTargets ["github.com"]
|
|
48
|
+
| upsert kubernetesIngestor.crossplane.xrds.publishPhase.target "github.com"
|
|
49
|
+
| upsert kubernetesIngestor.crossplane.xrds.publishPhase.target "github.com"
|
|
50
|
+
| upsert kubernetesIngestor.crossplane.xrds.publishPhase.allowRepoSelection true
|
|
51
|
+
| upsert kubernetesIngestor.crossplane.xrds.enabled true
|
|
52
|
+
| upsert kubernetesIngestor.crossplane.xrds.taskRunner.frequency 10
|
|
53
|
+
| upsert kubernetesIngestor.crossplane.xrds.taskRunner.timeout 600
|
|
54
|
+
| upsert kubernetesIngestor.crossplane.xrds.ingestAllXRDs true
|
|
55
|
+
| upsert kubernetesIngestor.crossplane.xrds.convertDefaultValuesToPlaceholders true
|
|
56
|
+
| upsert kubernetes {}
|
|
57
|
+
| upsert kubernetes.frontend.podDelete.enabled true
|
|
58
|
+
| upsert kubernetes.serviceLocatorMethod.type "multiTenant"
|
|
59
|
+
| upsert kubernetes.clusterLocatorMethods [{}]
|
|
60
|
+
| upsert kubernetes.clusterLocatorMethods.0.type "config"
|
|
61
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters [{}]
|
|
62
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters.0.url "${KUBE_URL}"
|
|
63
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters.0.name "kind"
|
|
64
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters.0.authProvider "serviceAccount"
|
|
65
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters.0.skipTLSVerify true
|
|
66
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters.0.skipMetricsLookup true
|
|
67
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters.0.serviceAccountToken "${KUBE_SA_TOKEN}"
|
|
68
|
+
| upsert kubernetes.clusterLocatorMethods.0.clusters.0.caData "${KUBE_CA_DATA}"
|
|
69
|
+
| save app-config.yaml --force
|
|
70
|
+
|
|
71
|
+
{
|
|
72
|
+
app: {
|
|
73
|
+
baseUrl: "${BACKSTAGE_HOST}"
|
|
74
|
+
}
|
|
75
|
+
backend: {
|
|
76
|
+
baseUrl: "${BACKSTAGE_HOST}"
|
|
77
|
+
database: {
|
|
78
|
+
client: "pg"
|
|
79
|
+
connection: {
|
|
80
|
+
host: "${DB_HOST}"
|
|
81
|
+
port: 5432
|
|
82
|
+
user: "${user}"
|
|
83
|
+
password: "${password}"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
} | to yaml | save app-config.production.yaml --force
|
|
88
|
+
|
|
89
|
+
open packages/app/src/components/catalog/EntityPage.tsx
|
|
90
|
+
| (
|
|
91
|
+
str replace
|
|
92
|
+
`} from '@backstage/plugin-kubernetes';`
|
|
93
|
+
`} from '@backstage/plugin-kubernetes';
|
|
94
|
+
|
|
95
|
+
import { CrossplaneAllResourcesTable, CrossplaneResourceGraph, isCrossplaneAvailable } from '@terasky/backstage-plugin-crossplane-resources-frontend';`
|
|
96
|
+
) | (
|
|
97
|
+
str replace
|
|
98
|
+
`const serviceEntityPage = (
|
|
99
|
+
<EntityLayout>
|
|
100
|
+
<EntityLayout.Route path="/" title="Overview">
|
|
101
|
+
{overviewContent}
|
|
102
|
+
</EntityLayout.Route>`
|
|
103
|
+
`const serviceEntityPage = (
|
|
104
|
+
<EntityLayout>
|
|
105
|
+
<EntityLayout.Route path="/" title="Overview">
|
|
106
|
+
{overviewContent}
|
|
107
|
+
</EntityLayout.Route>
|
|
108
|
+
|
|
109
|
+
<EntityLayout.Route if={isCrossplaneAvailable} path="/crossplane-resources" title="Crossplane Resources">
|
|
110
|
+
<CrossplaneAllResourcesTable />
|
|
111
|
+
</EntityLayout.Route>
|
|
112
|
+
<EntityLayout.Route if={isCrossplaneAvailable} path="/crossplane-graph" title="Crossplane Graph">
|
|
113
|
+
<CrossplaneResourceGraph />
|
|
114
|
+
</EntityLayout.Route>`
|
|
115
|
+
) | (
|
|
116
|
+
str replace
|
|
117
|
+
`const componentPage = (
|
|
118
|
+
<EntitySwitch>`
|
|
119
|
+
`const componentPage = (
|
|
120
|
+
<EntitySwitch>
|
|
121
|
+
<EntitySwitch.Case if={isComponentType('crossplane-claim')}>
|
|
122
|
+
{serviceEntityPage}
|
|
123
|
+
</EntitySwitch.Case>`
|
|
124
|
+
) | save packages/app/src/components/catalog/EntityPage.tsx --force
|
|
125
|
+
|
|
126
|
+
open packages/backend/src/index.ts
|
|
127
|
+
| (
|
|
128
|
+
str replace
|
|
129
|
+
`backend.start();`
|
|
130
|
+
`backend.add(import('@terasky/backstage-plugin-crossplane-permissions-backend'));
|
|
131
|
+
backend.add(import('@terasky/backstage-plugin-kubernetes-ingestor'));
|
|
132
|
+
backend.add(import('@terasky/backstage-plugin-scaffolder-backend-module-terasky-utils'));
|
|
133
|
+
|
|
134
|
+
backend.start();`
|
|
135
|
+
) | save packages/backend/src/index.ts --force
|
|
136
|
+
|
|
137
|
+
cd ..
|
|
138
|
+
|
|
139
|
+
get cluster data --create_service_account true
|
|
140
|
+
|
|
141
|
+
$"export NODE_OPTIONS=--no-node-snapshot\n" | save --append .env
|
|
142
|
+
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
# Builds and publishes a Backstage Docker image and Helm chart
|
|
146
|
+
def --env "main build backstage" [
|
|
147
|
+
tag: string
|
|
148
|
+
--image = "ghcr.io/vfarcic/idp-full-backstage"
|
|
149
|
+
--github_org = "vfarcic"
|
|
150
|
+
] {
|
|
151
|
+
|
|
152
|
+
docker login $image
|
|
153
|
+
|
|
154
|
+
cd backstage
|
|
155
|
+
|
|
156
|
+
yarn install --immutable
|
|
157
|
+
|
|
158
|
+
yarn tsc
|
|
159
|
+
|
|
160
|
+
yarn build:backend
|
|
161
|
+
|
|
162
|
+
(
|
|
163
|
+
docker buildx build
|
|
164
|
+
--file packages/backend/Dockerfile
|
|
165
|
+
--tag $"($image):($tag)"
|
|
166
|
+
--platform linux/amd64
|
|
167
|
+
.
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
docker image push $"($image):($tag)"
|
|
171
|
+
|
|
172
|
+
cd ..
|
|
173
|
+
|
|
174
|
+
open charts/backstage/Chart.yaml
|
|
175
|
+
| upsert version $tag
|
|
176
|
+
| upsert appVersion $tag
|
|
177
|
+
| save charts/backstage/Chart.yaml --force
|
|
178
|
+
|
|
179
|
+
open charts/backstage/values.yaml
|
|
180
|
+
| upsert image.repository $image
|
|
181
|
+
| upsert image.tag $tag
|
|
182
|
+
| save charts/backstage/values.yaml --force
|
|
183
|
+
|
|
184
|
+
helm package charts/backstage
|
|
185
|
+
|
|
186
|
+
helm push $"backstage-($tag).tgz" $"oci://ghcr.io/($image)"
|
|
187
|
+
|
|
188
|
+
start $"https://github.com/users/($github_org)/packages/container/package/idp-full-backstage"
|
|
189
|
+
|
|
190
|
+
print $"
|
|
191
|
+
Click (ansi yellow_bold)Package settings(ansi reset).
|
|
192
|
+
Click the (ansi yellow_bold)Change visibility(ansi reset) button, select (ansi yellow_bold)Public(ansi reset), type (ansi yellow_bold)idp-full-backstage(ansi reset) to confirm, and click the (ansi yellow_bold)I understand the consequences, change package visibility(ansi reset) button.
|
|
193
|
+
Press the (ansi yellow_bold)enter key(ansi reset) to continue.
|
|
194
|
+
"
|
|
195
|
+
input
|
|
196
|
+
|
|
197
|
+
start $"https://github.com/users/($github_org)/packages/container/package/idp-full-backstage%2Fbackstage"
|
|
198
|
+
|
|
199
|
+
print $"
|
|
200
|
+
Click (ansi yellow_bold)Package settings(ansi reset).
|
|
201
|
+
Click the (ansi yellow_bold)Change visibility(ansi reset) button, select (ansi yellow_bold)Public(ansi reset), type (ansi yellow_bold)idp-full-backstage/backstage(ansi reset) to confirm, and click the (ansi yellow_bold)I understand the consequences, change package visibility(ansi reset) button.
|
|
202
|
+
Press the (ansi yellow_bold)enter key(ansi reset) to continue.
|
|
203
|
+
"
|
|
204
|
+
input
|
|
205
|
+
|
|
206
|
+
rm $"backstage-($tag).tgz"
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
# Deploys Backstage to Kubernetes with necessary configuration
|
|
211
|
+
def --env "main apply backstage" [
|
|
212
|
+
tag: string # Available versions can be seen at https://github.com/users/vfarcic/packages/container/idp-full-backstage%2Fbackstage/versions
|
|
213
|
+
--kubeconfig = "kubeconfig-dot.yaml"
|
|
214
|
+
--ingress_host = "backstage.127.0.0.1.nip.io"
|
|
215
|
+
--github_token = "FIXME"
|
|
216
|
+
--create_service_account = false
|
|
217
|
+
--disable_default_workload_types = false
|
|
218
|
+
] {
|
|
219
|
+
|
|
220
|
+
let cluster_data = (
|
|
221
|
+
get cluster data
|
|
222
|
+
--kubeconfig $kubeconfig
|
|
223
|
+
--create_service_account $create_service_account
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
{
|
|
227
|
+
apiVersion: "v1"
|
|
228
|
+
kind: "Secret"
|
|
229
|
+
metadata: {
|
|
230
|
+
name: "backstage-config"
|
|
231
|
+
namespace: "backstage"
|
|
232
|
+
}
|
|
233
|
+
type: "Opaque"
|
|
234
|
+
data: {
|
|
235
|
+
KUBE_URL: ($cluster_data.kube_url | encode base64)
|
|
236
|
+
KUBE_SA_TOKEN: $cluster_data.token_encoded
|
|
237
|
+
KUBE_CA_DATA: ($cluster_data.kube_ca_data | encode base64)
|
|
238
|
+
GITHUB_TOKEN: ($github_token | encode base64)
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
| to yaml
|
|
242
|
+
| kubectl --namespace backstage apply --filename -
|
|
243
|
+
|
|
244
|
+
(
|
|
245
|
+
helm upgrade --install cnpg cloudnative-pg
|
|
246
|
+
--repo https://cloudnative-pg.github.io/charts
|
|
247
|
+
--namespace cnpg-system --create-namespace --wait
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
(
|
|
251
|
+
helm upgrade --install backstage
|
|
252
|
+
oci://ghcr.io/vfarcic/idp-full-backstage/backstage
|
|
253
|
+
--namespace backstage --create-namespace
|
|
254
|
+
--set $"ingress.host=($ingress_host)"
|
|
255
|
+
--set $"ingrestor.disableDefaultWorkloadTypes=($disable_default_workload_types)"
|
|
256
|
+
--version $tag --wait
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
sleep 60sec
|
|
260
|
+
|
|
261
|
+
print $"Backstage is available at (ansi yellow_bold)http://($ingress_host)(ansi reset)"
|
|
262
|
+
|
|
263
|
+
start $"http://($ingress_host)"
|
|
264
|
+
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
def "get cluster data" [
|
|
268
|
+
--kubeconfig = "kubeconfig-dot.yaml"
|
|
269
|
+
--create_service_account = false
|
|
270
|
+
] {
|
|
271
|
+
|
|
272
|
+
if $create_service_account {
|
|
273
|
+
|
|
274
|
+
{
|
|
275
|
+
apiVersion: "v1"
|
|
276
|
+
kind: "Namespace"
|
|
277
|
+
metadata: {
|
|
278
|
+
name: "backstage"
|
|
279
|
+
}
|
|
280
|
+
} | to yaml | kubectl apply --filename -
|
|
281
|
+
|
|
282
|
+
{
|
|
283
|
+
apiVersion: "v1"
|
|
284
|
+
kind: "ServiceAccount"
|
|
285
|
+
metadata: {
|
|
286
|
+
name: "backstage"
|
|
287
|
+
namespace: "backstage"
|
|
288
|
+
}
|
|
289
|
+
} | to yaml | kubectl apply --filename -
|
|
290
|
+
|
|
291
|
+
{
|
|
292
|
+
apiVersion: "v1"
|
|
293
|
+
kind: "Secret"
|
|
294
|
+
metadata: {
|
|
295
|
+
name: "backstage"
|
|
296
|
+
namespace: "backstage"
|
|
297
|
+
annotations: {
|
|
298
|
+
"kubernetes.io/service-account.name": "backstage"
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
type: "kubernetes.io/service-account-token"
|
|
302
|
+
} | to yaml | kubectl apply --filename -
|
|
303
|
+
|
|
304
|
+
{
|
|
305
|
+
apiVersion: "rbac.authorization.k8s.io/v1"
|
|
306
|
+
kind: "ClusterRoleBinding"
|
|
307
|
+
metadata: {
|
|
308
|
+
name: "backstage"
|
|
309
|
+
}
|
|
310
|
+
subjects: [{
|
|
311
|
+
kind: "ServiceAccount"
|
|
312
|
+
name: "backstage"
|
|
313
|
+
namespace: "backstage"
|
|
314
|
+
}]
|
|
315
|
+
roleRef: {
|
|
316
|
+
kind: "ClusterRole"
|
|
317
|
+
name: "cluster-admin"
|
|
318
|
+
apiGroup: "rbac.authorization.k8s.io"
|
|
319
|
+
}
|
|
320
|
+
} | to yaml | kubectl apply --filename -
|
|
321
|
+
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
let kube_url = open $kubeconfig
|
|
325
|
+
| get clusters.0.cluster.server
|
|
326
|
+
$"export KUBE_URL=($kube_url)\n" | save --append .env
|
|
327
|
+
|
|
328
|
+
let kube_ca_data = open $kubeconfig
|
|
329
|
+
| get clusters.0.cluster.certificate-authority-data
|
|
330
|
+
$"export KUBE_CA_DATA=($kube_ca_data)\n" | save --append .env
|
|
331
|
+
|
|
332
|
+
let token_encoded = (
|
|
333
|
+
kubectl --namespace backstage get secret backstage
|
|
334
|
+
--output yaml
|
|
335
|
+
)
|
|
336
|
+
| from yaml
|
|
337
|
+
| get data.token
|
|
338
|
+
|
|
339
|
+
let token = ($token_encoded | decode base64 | decode)
|
|
340
|
+
$"export KUBE_SA_TOKEN=($token)\n" | save --append .env
|
|
341
|
+
|
|
342
|
+
{
|
|
343
|
+
kube_url: $kube_url,
|
|
344
|
+
kube_ca_data: $kube_ca_data,
|
|
345
|
+
token_encoded: $token_encoded,
|
|
346
|
+
token: $token
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env nu
|
|
2
|
+
|
|
3
|
+
# Installs cert-manager for managing TLS certificates in Kubernetes
|
|
4
|
+
def "main apply certmanager" [] {
|
|
5
|
+
|
|
6
|
+
(
|
|
7
|
+
helm upgrade --install cert-manager cert-manager
|
|
8
|
+
--repo https://charts.jetstack.io
|
|
9
|
+
--namespace cert-manager --create-namespace
|
|
10
|
+
--set crds.enabled=true --wait
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
}
|
package/scripts/cnpg.nu
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env nu
|
|
2
|
+
|
|
3
|
+
# Installs Cloud-Native PostgreSQL (CNPG) operator
|
|
4
|
+
def "main apply cnpg" [] {
|
|
5
|
+
|
|
6
|
+
print $"\nInstalling (ansi yellow_bold)Cloud-Native PostgreSQL \(CNPG\)(ansi reset)...\n"
|
|
7
|
+
|
|
8
|
+
(
|
|
9
|
+
helm upgrade --install cnpg cloudnative-pg
|
|
10
|
+
--repo https://cloudnative-pg.github.io/charts
|
|
11
|
+
--namespace cnpg-system --create-namespace --wait
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env nu
|
|
2
|
+
|
|
3
|
+
# Prompts user to select a cloud provider from available options
|
|
4
|
+
#
|
|
5
|
+
# Returns:
|
|
6
|
+
# The selected provider name and saves it to .env file
|
|
7
|
+
def "main get provider" [
|
|
8
|
+
--providers = [aws azure google kind upcloud] # List of cloud providers to choose from
|
|
9
|
+
] {
|
|
10
|
+
|
|
11
|
+
let message = $"
|
|
12
|
+
Right now, only providers listed below are supported in this demo.
|
|
13
|
+
Please send an email to (ansi yellow_bold)viktor@farcic.com(ansi reset) if you'd like to add additional providers.
|
|
14
|
+
|
|
15
|
+
(ansi yellow_bold)Select a provider(ansi green_bold)"
|
|
16
|
+
|
|
17
|
+
let provider = $providers | input list $message
|
|
18
|
+
print $"(ansi reset)"
|
|
19
|
+
|
|
20
|
+
$"export PROVIDER=($provider)\n" | save --append .env
|
|
21
|
+
|
|
22
|
+
$provider
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# Prints a reminder to source the environment variables
|
|
26
|
+
def "main print source" [] {
|
|
27
|
+
|
|
28
|
+
print $"
|
|
29
|
+
Execute `(ansi yellow_bold)source .env(ansi reset)` to load the environment variables.
|
|
30
|
+
"
|
|
31
|
+
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# Removes temporary files created during script execution
|
|
35
|
+
def "main delete temp_files" [] {
|
|
36
|
+
|
|
37
|
+
rm --force .env
|
|
38
|
+
|
|
39
|
+
rm --force kubeconfig*.yaml
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Retrieves and configures credentials for the specified cloud provider
|
|
44
|
+
#
|
|
45
|
+
# Examples:
|
|
46
|
+
# > main get creds aws
|
|
47
|
+
# > main get creds azure
|
|
48
|
+
def --env "main get creds" [
|
|
49
|
+
provider: string, # The cloud provider to configure credentials for (aws, azure, google)
|
|
50
|
+
--aws-access-key-id: string, # AWS Access Key ID (optional, falls back to AWS_ACCESS_KEY_ID env var)
|
|
51
|
+
--aws-secret-access-key: string, # AWS Secret Access Key (optional, falls back to AWS_SECRET_ACCESS_KEY env var)
|
|
52
|
+
--aws-account-id: string, # AWS Account ID (optional, falls back to AWS_ACCOUNT_ID env var)
|
|
53
|
+
--azure-tenant: string # Azure Tenant ID (optional, falls back to AZURE_TENANT env var)
|
|
54
|
+
] {
|
|
55
|
+
|
|
56
|
+
mut creds = {provider: $provider}
|
|
57
|
+
|
|
58
|
+
if $provider == "google" {
|
|
59
|
+
|
|
60
|
+
gcloud auth login
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
} else if $provider == "aws" {
|
|
64
|
+
|
|
65
|
+
mut access_key = $aws_access_key_id
|
|
66
|
+
if ($access_key | is-empty) and ("AWS_ACCESS_KEY_ID" in $env) {
|
|
67
|
+
$access_key = $env.AWS_ACCESS_KEY_ID
|
|
68
|
+
} else if ($access_key | is-empty) {
|
|
69
|
+
error make { msg: "AWS Access Key ID required via --aws-access-key-id parameter or AWS_ACCESS_KEY_ID environment variable" }
|
|
70
|
+
}
|
|
71
|
+
$"export AWS_ACCESS_KEY_ID=($access_key)\n"
|
|
72
|
+
| save --append .env
|
|
73
|
+
$creds = ( $creds | upsert aws_access_key_id $access_key )
|
|
74
|
+
|
|
75
|
+
mut secret_key = $aws_secret_access_key
|
|
76
|
+
if ($secret_key | is-empty) and ("AWS_SECRET_ACCESS_KEY" in $env) {
|
|
77
|
+
$secret_key = $env.AWS_SECRET_ACCESS_KEY
|
|
78
|
+
} else if ($secret_key | is-empty) {
|
|
79
|
+
error make { msg: "AWS Secret Access Key required via --aws-secret-access-key parameter or AWS_SECRET_ACCESS_KEY environment variable" }
|
|
80
|
+
}
|
|
81
|
+
$"export AWS_SECRET_ACCESS_KEY=($secret_key)\n"
|
|
82
|
+
| save --append .env
|
|
83
|
+
$creds = ( $creds | upsert aws_secret_access_key $secret_key )
|
|
84
|
+
|
|
85
|
+
mut account_id = $aws_account_id
|
|
86
|
+
if ($account_id | is-empty) and ("AWS_ACCOUNT_ID" in $env) {
|
|
87
|
+
$account_id = $env.AWS_ACCOUNT_ID
|
|
88
|
+
} else if ($account_id | is-empty) {
|
|
89
|
+
error make { msg: "AWS Account ID required via --aws-account-id parameter or AWS_ACCOUNT_ID environment variable" }
|
|
90
|
+
}
|
|
91
|
+
$"export AWS_ACCOUNT_ID=($account_id)\n"
|
|
92
|
+
| save --append .env
|
|
93
|
+
$creds = ( $creds | upsert aws_account_id $account_id )
|
|
94
|
+
|
|
95
|
+
} else if $provider == "azure" {
|
|
96
|
+
|
|
97
|
+
mut tenant = $azure_tenant
|
|
98
|
+
if ($tenant | is-empty) and ("AZURE_TENANT" in $env) {
|
|
99
|
+
$tenant = $env.AZURE_TENANT
|
|
100
|
+
} else if ($tenant | is-empty) {
|
|
101
|
+
error make { msg: "Azure Tenant ID required via --azure-tenant parameter or AZURE_TENANT environment variable" }
|
|
102
|
+
}
|
|
103
|
+
$creds = ( $creds | upsert tenant_id $tenant )
|
|
104
|
+
|
|
105
|
+
az login --tenant $tenant
|
|
106
|
+
|
|
107
|
+
} else {
|
|
108
|
+
|
|
109
|
+
print $"(ansi red_bold)($provider)(ansi reset) is not a supported."
|
|
110
|
+
exit 1
|
|
111
|
+
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
$creds
|
|
115
|
+
|
|
116
|
+
}
|