diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..8b0bedf --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,28 @@ +FROM ghcr.io/pulumi/devcontainer:extra + +################################################################################## +# Install AWS CLI v2 + +USER root +RUN echo \ + && export ARCH=$(uname -m | awk '{ if ($1 == "x86_64") print "x86_64"; else if ($1 == "aarch64" || $1 == "arm64") print "aarch64"; else print "unknown" }') \ + && export NAME="aws" \ + && export TEST="${NAME} --version" \ + && export PKG="awscli-exe-linux-${ARCH}.zip" \ + && export URL="https://awscli.amazonaws.com/${PKG}" \ + && export DIR="/tmp/awscli" \ + && echo "---------------------------------------------------------"\ + && echo "INFO[${NAME}] Installed:" \ + && echo "INFO[${NAME}] Command: ${NAME}" \ + && echo "INFO[${NAME}] Package: ${PKG}" \ + && echo "INFO[${NAME}] Architecture: ${ARCH}" \ + && echo "INFO[${NAME}] Source: ${URL}" \ + && echo "---------------------------------------------------------"\ + && mkdir -p ${DIR} \ + && ${curl} ${URL} --output ${DIR}/${PKG} \ + && unzip ${DIR}/${PKG} -d ${DIR} \ + && bash -c "${DIR}/aws/install" \ + && ${dir_clean} \ + && ${TEST} \ + && echo +USER vscode diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..eb82ded --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,328 @@ +{ + "name": "devcontainer-extra-gcp", + "remoteUser": "vscode", + "dockerFile": "Dockerfile", + "init": true, + "runArgs": [], + "privileged": true, + "overrideCommand": false, + "updateRemoteUserUID": true, + "shutdownAction": "stopContainer", + "securityOpt": ["seccomp=unconfined"], + "features": { + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {} + }, + "mounts": ["source=dind-var-lib-docker,target=/var/lib/docker,type=volume"], + "postCreateCommand": "devcontainer-links", + //"workspaceFolder": "/workspaces/devcontainer", + //"workspaceMount": "source=.,target=/home/vscode/devcontainer,type=bind,consistency=cached", + //"workspaceFolder": "/home/vscode/devcontainer", + "forwardPorts": [1313, 2222, 6000, 7681, 8080], + "customizations": { + "vscode": { + "settings": { + "telemetry.enableTelemetry": "off", + "initializeCommand": "echo 'Initializing...'", + "postCreateCommand": "echo 'Post create...'", + "postStartCommand": "echo 'Post start...'", + "postAttachCommand": "echo 'Post attach...'", + "window": { + "titleBarStyle": "custom", + "title": "${localWorkspaceFolderBasename}${separator}${containerName}${separator}${profileName}${separator}${activeEditorShort}" + }, + "search": { + "defaultViewMode": "list" + }, + "vim": { + "disableExtension": true, + "useSystemClipboard": true, + "useCtrlKeys": true, + "easymotion": true, + "incsearch": true, + "hlsearch": true, + "cursorStylePerMode": { + "normal": "block", + "insert": "line", + "visual": "underline", + "visualline": "underline", + "visualblock": "underline", + "replace": "block" + }, + "insertModeKeyBindings": [ + { + "before": ["j", "j"], + "after": [""] + } + ], + "handleKeys": { + "": false, + "": false + } + }, + "extensions.experimental.affinity": { + "vscodevim.vim": 1 + }, + "zenmode": { + "toggle": true, + "hideTabs": false, + "fullScreen": true, + "hideMinimap": true, + "centerLayout": false, + "hideStatusBar": false, + "hideActivityBar": false, + "hideLineNumbers": false, + "silentNotifications": true, + "hideLineDecorations": false, + "hideCursorInOverviewRuler": true + }, + "editor": { + "tabSize": 4, + "fontSize": 14, + "autoSave": "onFocusChange", + "wordWrap": "off", + "showTabs": true, + "showIcons": true, + "tabSizing": "shrink", + "lineHeight": 20, + "autoIndent": true, + "lineNumbers": "relative", + "formatOnSave": true, + "insertSpaces": true, + "tabScrolling": "auto", + //"tabFocusMode": false, + //"tabMovesFocus": false, + "tabCompletion": "on", + "tabDecoration": true, + "fontLigatures": true, + "enablePreview": true, + "startupEditor": "readme", + "tabCloseButton": "right", + "minimap.enabled": false, + "openPositioning": "right", + "restoreViewState": true, + "renderWhitespace": "all", + "suggestSelection": "first", + "closeOnFileDelete": true, + "autoClosingQuotes": "always", + "snippetSuggestions": "top", + "autoClosingBrackets": "always", + "tabHistoryNavigation": true, + "quickSuggestionsDelay": 50, + "autoImportCompletions": true, + "scrollBeyondLastLine": true, + "highlightModifiedTabs": true, + "inlineSuggest.enabled": true, + "parameterHints.enabled": true, + "trimTrailingWhitespace": true, + "lineHighlightBackground": "#30BFBF", + "highlightActiveIndentGuide": true, + "fontFamily": "'FiraMono Nerd Font Mono', monospace", + "gotoLocation": { + "multipleReferences": "goto", + "multipleDefinitions": "goto", + "multipleDeclarations": "goto", + "multipleImplementations": "goto", + "multipleTypeDefinitions": "goto" + }, + "scrollbar": { + "alwaysConsumeMouseWheel": true + }, + "bracketPairColorization": { + "enabled": true + } + }, + "files": { + "encoding": "utf8", + "autoSave": "onFocusChange", + "trimFinalNewlines": true, + "insertFinalNewline": true, + "trimTrailingWhitespace": true + }, + "git": { + "enabled": true, + "autofetch": true, + "autoStash": true, + "autorefresh": true, + "gitProtocol": "https", + "ignoreSubmodules": true, + "enableSmartCommit": true, + "ignoreLegacyWarning": true, + "autoRepositoryDetection": "openEditors", + "defaultCloneParentDirectory": "/home/vscode", + "scanRepositories": ["/home/vscode", "/workspaces"], + "path": "/usr/local/bin/git" + }, + "github.copilot": { + "enable": { + "*": false, + "markdown": false, + "plaintext": false + } + }, + "go": { + "testTags": "all", + "vetOnSave": "off", + "buildTags": "all", + "lintOnSave": "off", + "testOnSave": "off", + "buildOnSave": "off", + "formatTool": "goimports", + "testEnvVars": { + "GOFLAGS": "-count=1" + }, + "generateTestsFlags": ["-count=1"] + }, + "terminal": { + "integrated": { + //"cwd": "/home/vscode/devcontainer", + "fontSize": 14, + "scrollback": 10000, + "cursorStyle": "outline", + "cursorBlinking": true, + "copyOnSelection": true, + "sendKeybindingsToShell": false, + "cursorStyleInactive": "line", + "fontFamily": "FiraMono Nerd Font Mono", + "commandsToSkipShell": [], + "scrollbar": { + "alwaysConsumeMouseWheel": true + }, + "shell": { + "linux": "/usr/bin/bash" + } + } + }, + "vs-kubernetes": { + "vs-kubernetes.namespace": "*", + "vs-kubernetes.outputFormat": "yaml", + "vs-kubernetes.helm-path": "/usr/local/bin/helm", + "vs-kubernetes.kubeconfig": "/home/vscode/.kube/config", + "vs-kubernetes.kubectl-path": "/usr/local/bin/kubectl", + "vs-kubernetes.knownKubeconfigs": [ + "/workspaces/*/.kube/config", + "/home/vscode/*/.kube/config", + "/home/vscode/.kube/config" + ] + }, + "remote": { + "restoreForwardedPorts": true, + "localPortHost": "127.0.0.1" + }, + "2gua.rainbow-brackets": true, + "indentRainbow": { + "indicatorStyle": "light", + "colorOnWhiteSpaceOnly": true, + "lightIndicatorStyleLineWidth": 12, + "ignoreEmptyLines": true, + "errorColor": "rgba(255, 20, 147, 0.3)", // Bright Pink for errors + "tabmixColor": "rgba(128, 32, 96, 0.3)", // Purple for mixed tabs and spaces + "colors": [ + "rgba(50, 150, 250, 0.1)", // Bright Blue + "rgba(200, 50, 250, 0.1)", // Purple + "rgba(50, 250, 150, 0.1)", // Neon Green + "rgba(250, 50, 150, 0.1)", // Pink + "rgba(50, 200, 250, 0.1)", // Lighter Blue + "rgba(150, 50, 250, 0.1)", // Darker Purple + "rgba(50, 250, 200, 0.1)", // Brighter Green + "rgba(250, 150, 50, 0.1)" // Orange + ], + "ignoreErrorLanguages": [ + "haskell", + "markdown", + "plaintext", + "shellscript", + "dockerfile", + "plaintext" + ] + }, + "workbench": { + "colorTheme": "Cyberpunk", + "startupEditor": "readme", + "action.terminal.focusNext": { + "key": "ctrl+shift+down", + "mac": "cmd+shift+down" + } + }, + "autoOpenPreviewPanel.openPreviewToTheSide": false, + "explorer.openEditors.visible": 1, + "explorer": { + "openEditors": { + "visible": 1 + }, + "autoRevealExclude": { + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/node_modules/**": true + }, + "autoReveal": true, + "sortOrder": "filesFirst" + } + }, + "[makefile]": { + "editor.insertSpaces": false, + "editor.renderWhitespace": "selection" + }, + "[yaml]": { + "editor": { + "trimTrailingWhitespace": true, + "insertFinalNewline": true, + "wordWrap": "off", + "lineNumbers": "relative", + "renderWhitespace": "all", + "autoSave": "onFocusChange", + "formatOnSave": true, + "insertSpaces": true, + "tabSize": 2, + "minimap.enabled": true, + "scrollBeyondLastLine": true, + "scrollbar": { + "alwaysConsumeMouseWheel": true + } + } + }, + "[markdown]": { + "editor": { + "tabSize": 4, + "wordWrap": "on", + "autoSave": "onFocusChange", + "lineNumbers": "relative", + "formatOnSave": true, + "insertSpaces": true, + "minimap.enabled": false, + "renderWhitespace": "all", + "insertFinalNewline": true, + "scrollBeyondLastLine": true, + "trimTrailingWhitespace": false, + "scrollbar": { + "alwaysConsumeMouseWheel": true + } + } + }, + "extensions": [ + "golang.go", + "vscodevim.vim", + "github.copilot", + "max-ss.cyberpunk", + "ms-python.python", + "redhat.vscode-yaml", + "esbenp.prettier-vscode", + "oderwat.indent-rainbow", + "okteto.kubernetes-context", + "ms-vsliveshare.vsliveshare", + "chadonsom.auto-view-readme", + "ms-azuretools.vscode-docker", + "github.vscode-github-actions", + "ms-kubernetes-tools.kind-vscode", + "ms-vscode.vscode-typescript-next", + "github.vscode-pull-request-github", + "matt-rudge.auto-open-preview-panel", + "ms-vscode-remote.remote-containers", + "ms-edgedevtools.vscode-edge-devtools", + "bierner.markdown-preview-github-styles", + "visualstudioexptteam.vscodeintellicode", + "bierner.markdown-preview-github-styles", + "ms-kubernetes-tools.vscode-kubernetes-tools" + ] + } + } + } diff --git a/.github/workflows/deploy-pulumi.yaml b/.github/workflows/deploy-pulumi.yaml index 7604abd..20ac8a9 100644 --- a/.github/workflows/deploy-pulumi.yaml +++ b/.github/workflows/deploy-pulumi.yaml @@ -40,30 +40,30 @@ jobs: - name: 📦️ Pulumi Install 📦️ uses: pulumi/actions@v5 - # - name: Overrides Pulumi Config 🔨 - # working-directory: pulumi - # env: - # PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} - # run: | - # pulumi stack select ${{ matrix.arrays.stack.name }} - # pulumi config set githubOrg ${GITHUB_REPOSITORY_OWNER} - # pulumi config set githubRepo $(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f2) - # pulumi config set veleroBucketPrefix ${{ secrets.VELERO_BACKUP_BUCKET }} - # if [ ${{ matrix.arrays.stack.name }} != "hub" ]; then - # pulumi config set hubStackName ${{ secrets.PULUMI_ACCOUNT }}/${{ secrets.PULUMI_PROJECT }}/hub - # fi - # cat stacks/Pulumi.${{ matrix.arrays.stack.name }}.yaml + - name: Overrides Pulumi Config 🔨 + working-directory: pulumi + env: + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + run: | + pulumi stack select ${{ matrix.arrays.stack.name }} + pulumi config set githubOrg ${GITHUB_REPOSITORY_OWNER} + pulumi config set githubRepo $(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f2) + pulumi config set veleroBucketPrefix ${{ secrets.VELERO_BACKUP_BUCKET }} + if [ ${{ matrix.arrays.stack.name }} != "hub" ]; then + pulumi config set hubStackName ${{ secrets.PULUMI_ACCOUNT }}/${{ secrets.PULUMI_PROJECT }}/hub + fi + cat stacks/Pulumi.${{ matrix.arrays.stack.name }}.yaml - name: Setup Node LTS ✨ uses: actions/setup-node@v4 with: node-version: lts/* - # cache: npm - # cache-dependency-path: pulumi/src/package-lock.json + cache: npm + cache-dependency-path: pulumi/src/package-lock.json - name: Installing dependencies 📦️ run: | - cd ./pulumi + cd ./pulumi/src npm install - name: Deploy infrastructure 🚀 diff --git a/.github/workflows/destroy-pulumi.yaml b/.github/workflows/destroy-pulumi.yaml index 46c2172..1a9d9d4 100644 --- a/.github/workflows/destroy-pulumi.yaml +++ b/.github/workflows/destroy-pulumi.yaml @@ -35,30 +35,30 @@ jobs: - name: 📦️ Pulumi Install 📦️ uses: pulumi/actions@v5 - # - name: Overrides Pulumi Config 🔨 - # working-directory: pulumi - # env: - # PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} - # run: | - # pulumi stack select ${{ matrix.arrays.stack.name }} - # pulumi config set githubOrg ${GITHUB_REPOSITORY_OWNER} - # pulumi config set githubRepo $(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f2) - # pulumi config set veleroBucketPrefix ${{ secrets.VELERO_BACKUP_BUCKET }} - # if [ ${{ matrix.arrays.stack.name }} != "hub" ]; then - # pulumi config set hubStackName ${{ secrets.PULUMI_ACCOUNT }}/${{ secrets.PULUMI_PROJECT }}/hub - # fi - # cat stacks/Pulumi.${{ matrix.arrays.stack.name }}.yaml + - name: Overrides Pulumi Config 🔨 + working-directory: pulumi + env: + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + run: | + pulumi stack select ${{ matrix.arrays.stack.name }} + pulumi config set githubOrg ${GITHUB_REPOSITORY_OWNER} + pulumi config set githubRepo $(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f2) + pulumi config set veleroBucketPrefix ${{ secrets.VELERO_BACKUP_BUCKET }} + if [ ${{ matrix.arrays.stack.name }} != "hub" ]; then + pulumi config set hubStackName ${{ secrets.PULUMI_ACCOUNT }}/${{ secrets.PULUMI_PROJECT }}/hub + fi + cat stacks/Pulumi.${{ matrix.arrays.stack.name }}.yaml - name: Setup Node LTS ✨ uses: actions/setup-node@v4 with: node-version: lts/* - # cache: npm - # cache-dependency-path: pulumi/src/package-lock.json + cache: npm + cache-dependency-path: pulumi/src/package-lock.json - name: Installing dependencies 📦️ run: | - cd ./pulumi + cd ./pulumi/src npm install - name: Destroy infrastructure 🚀 diff --git a/.github/workflows/pr-pulumi.yaml b/.github/workflows/pr-pulumi.yaml index 76830d7..069b1d9 100644 --- a/.github/workflows/pr-pulumi.yaml +++ b/.github/workflows/pr-pulumi.yaml @@ -38,30 +38,30 @@ jobs: - name: 📦️ Pulumi Install 📦️ uses: pulumi/actions@v5 - # - name: Overrides Pulumi Config 🔨 - # working-directory: pulumi - # env: - # PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} - # run: | - # pulumi stack select ${{ matrix.arrays.stack.name }} - # pulumi config set githubOrg ${GITHUB_REPOSITORY_OWNER} - # pulumi config set githubRepo $(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f2) - # pulumi config set veleroBucketPrefix ${{ secrets.VELERO_BACKUP_BUCKET }} - # if [ ${{ matrix.arrays.stack.name }} != "hub" ]; then - # pulumi config set hubStackName ${{ secrets.PULUMI_ACCOUNT }}/${{ secrets.PULUMI_PROJECT }}/hub - # fi - # cat stacks/Pulumi.${{ matrix.arrays.stack.name }}.yaml + - name: Overrides Pulumi Config 🔨 + working-directory: pulumi + env: + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + run: | + pulumi stack select ${{ matrix.arrays.stack.name }} + pulumi config set githubOrg ${GITHUB_REPOSITORY_OWNER} + pulumi config set githubRepo $(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f2) + pulumi config set veleroBucketPrefix ${{ secrets.VELERO_BACKUP_BUCKET }} + if [ ${{ matrix.arrays.stack.name }} != "hub" ]; then + pulumi config set hubStackName ${{ secrets.PULUMI_ACCOUNT }}/${{ secrets.PULUMI_PROJECT }}/hub + fi + cat stacks/Pulumi.${{ matrix.arrays.stack.name }}.yaml - name: Setup Node LTS ✨ uses: actions/setup-node@v4 with: node-version: lts/* - # cache: npm - # cache-dependency-path: pulumi/src/package-lock.json + cache: npm + cache-dependency-path: pulumi/src/package-lock.json - name: Installing dependencies 📦️ run: | - cd ./pulumi + cd ./pulumi/src npm install - name: Preview infrastructure 🚀 diff --git a/.gitignore b/.gitignore index b788931..fc7faf9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /bin/ ***node_modules/ +local/ \ No newline at end of file diff --git a/README.md b/README.md index 084df10..f990cdf 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,76 @@ -# gitopscon-2024-na-demo +# GitOpsCon NA 2024 Demo Pulumi ArgoCD GitOps Bridge Hub-Spoke Multicluster ![Architecture Diagram of GitOps Flow with Gitops Bridge and Pulumi](assets/gitopscon-na24.png) -### File Structure +### Prerequisites +- [Get a Free Pulumi Cloud account](https://app.pulumi.com/) +- [Install pulumi CLI](https://www.pulumi.com/docs/clouds/aws/get-started/begin/#install-pulumi) +- [Install Nodejs](https://nodejs.org/en/download/) + +### Setup Fork +Fork this repository and update the stacks/Pulumi..yaml files with your own values for the following fields +- `githubOrg` This is your github org or user for your fork +- `githubRepo` This is the name of the git repo if you change the default name for the fork +- `veleroBucketPrefix` This is the unique S3 bucket name +- `hubStackName` This is the combination of pulumi account and project `pulumiaccount/projectname` + + +### Working Directory +```shell +cd pulumi/ +``` + +### Install Pulumi SDK +```shell +npm install +``` + +### Setup Credentials +- Add an Environment Variable for `PULUMI_ACCESS_TOKEN` or use `pulumi login` +- Add an Environment Variable for `GITHUB_TOKEN` in your deployment env (local, Github Actions, AWS Code Pipeline, etc;) + +### How to Start Your Hub Cluster: +1. Review `Pulumi.hub.yaml` and update configuration values as you need - You will want to update Stack Files with configuration for Github Repo/Org, as well as AWS Account ID, CIDRs, etc; +1. Add any extra resources you may need in your given environment +1. Run Pulumi Up for the Hub Cluster's Stack `pulumi up --stack hub` +1. Wait for the Resources to create like VPC, EKS Cluster, and IAM permissions +1. Set environment variable `ARGO_IAM_ROLE_ARN` before running next step `export ARGO_IAM_ROLE_ARN=$(pulumi stack output -s hub -j | jq .outputs.argoRoleArn -r)` +1. Run `./bootstrap.sh` to install ArgoCD on Hub cluster +1. Run `git pull` to fetch the file `gitops/clusters/hub-cluster.yaml` +1. Setup kubectl cli `aws eks --region us-east-1 update-kubeconfig --name hub-cluster --alias hub-cluster` +1. Run `kubectl create -f ../gitops/clusters/hub-cluster.yaml` +1. Access ArgoCD UI: + ```shell + echo "Username: admin" + echo "Password: $(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" --context hub-cluster | base64 -d)" + echo "Access https://localhost:8080" + kubectl -n argocd port-forward svc/argocd-server 8080:443 --context hub-cluster + ``` + +### How to Add Spoke Clusters: +1. Review `Pulumi.dev.yaml` and add any extra resources you may need in your given environment +1. Run Pulumi Up for the Spoke Cluster's Stack `pulumi up --stack dev` +1. Wait for the Resources to create like VPC, EKS Cluster, and IAM permissions +1. Apply the Secret resource that was added to the GitOps Repository +1. Setup kubectl cli `aws eks --region us-east-1 update-kubeconfig --name dev-cluster --alias dev-cluster` +1. Repeat same steps for the next cluster like `prod` `pulumi up --stack prod` + +### Destory Clusters +```shell +pulumi destroy --stack dev +pulumi destroy --stack prod +pulumi destroy --stack hub +``` + +### Productionizing your Implementation + +* Add Authentication for ArgoCD to be able to grab from your Organization's private repository +* Add ApplicationSets to your configuration by looking at the GitOps Bridge Control Plane Template for resources you need +* Create an ArgoCD Application that manages deployment of your Cluster Secret +* Move your EKS Cluster to be a private access endpoint + +### File Structure ``` root/ .github/ # Contains Github Actions to deploy and preview Pulumi IaC diff --git a/gitops/addons/monolith-appset.yaml b/gitops/addons/monolith-appset.yaml deleted file mode 100644 index 072a63c..0000000 --- a/gitops/addons/monolith-appset.yaml +++ /dev/null @@ -1,57 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: addons-monolith -spec: - goTemplate: true - goTemplateOptions: ["missingkey=error"] - syncPolicy: - preserveResourcesOnDeletion: true - generators: - - merge: - mergeKeys: - - server - generators: - - clusters: - values: - addonChart: monolith - selector: - matchExpressions: - - key: enable_app - operator: In - values: - - 'true' - - clusters: - selector: - matchLabels: - environment: dev - values: - addonChart: monolith - template: - metadata: - name: 'addon-{{.name}}-monolith' - labels: - chartName: '{{.values.addonChart}}' - appsetFileName: 'monolith-appset' - spec: - project: default - sources: - - repoURL: https://github.com/gitops-bridge-dev/gitopscon-2024-na-demo - targetRevision: HEAD - ref: values - - repoURL: https://github.com/gitops-bridge-dev/gitopscon-2024-na-demo - targetRevision: HEAD - path: gitops/charts/addons/monolith - helm: - ignoreMissingValueFiles: true - valueFiles: - - ../../../../gitops/environments/{{.metadata.labels.environment}}/addons/{{.values.addonChart}}/values.yaml - - ../../../../gitops/clusters/{{.name}}/addons/{{.values.addonChart}}/values.yaml - destination: - namespace: '{{.metadata.labels.environment}}' - name: '{{.name}}' - syncPolicy: - automated: {} - syncOptions: - - CreateNamespace=true - - ServerSideApply=true # Big CRDs. \ No newline at end of file diff --git a/gitops/addons/velero-appset.yaml b/gitops/addons/velero-appset.yaml index eb9731e..34b3bee 100644 --- a/gitops/addons/velero-appset.yaml +++ b/gitops/addons/velero-appset.yaml @@ -4,6 +4,8 @@ kind: ApplicationSet metadata: name: addons-aws-velero spec: + goTemplate: true + goTemplateOptions: ["missingkey=error"] syncPolicy: preserveResourcesOnDeletion: true generators: @@ -35,41 +37,42 @@ spec: addonChartVersion: 6.0.0 template: metadata: - name: addon-{{name}}-{{values.addonChart}} + name: addon-{{.name}}-{{.values.addonChart}} spec: project: default sources: - - repoURL: 'https://github.com/gitops-bridge-dev/gitopscon-2024-na-demo' - targetRevision: 'HEAD' + - repoURL: '{{.metadata.annotations.addons_repo_url}}' + targetRevision: '{{.metadata.annotations.addons_repo_revision}}' ref: values - - chart: '{{values.addonChart}}' - repoURL: '{{values.addonChartRepository}}' - targetRevision: '{{values.addonChartVersion}}' + - chart: '{{.values.addonChart}}' + repoURL: '{{.values.addonChartRepository}}' + targetRevision: '{{.values.addonChartVersion}}' helm: - releaseName: '{{values.addonChart}}' + releaseName: '{{.values.addonChart}}' ignoreMissingValueFiles: true valueFiles: - - $values/gitops/charts/{{values.addonChart}}/values.yaml - - $values/gitops/environments/{{metadata.labels.environment}}/addons/{{values.addonChart}}/values.yaml - - $values/gitops/clusters/{{name}}/addons/{{values.addonChart}}/values.yaml + - $values/gitops/environments/default/addons/{{.values.addonChart}}/values.yaml + - $values/gitops/environments/{{.metadata.labels.environment}}/addons/{{.values.addonChart}}/values.yaml + - $values/gitops/clusters/{{.name}}/addons/{{.values.addonChart}}/values.yaml values: | configuration: backupStorageLocation: - name: default provider: aws - bucket: {{metadata.annotations.velero_bucket_name}} + prefix: {{.metadata.annotations.velero_backup_s3_bucket_prefix}} + bucket: {{.metadata.annotations.velero_backup_s3_bucket_name}} config: - region: us-east-1 + region: {{.metadata.annotations.aws_region}} volumeSnapshotLocation: - name: default provider: aws config: - region: us-east-1 + region: {{.metadata.annotations.aws_region}} serviceAccount: server: - name: velero + name: {{.metadata.annotations.velero_service_account}} annotations: - eks.amazonaws.com/role-arn: {{metadata.annotations.velero_iam_role_arn}} + eks.amazonaws.com/role-arn: {{.metadata.annotations.velero_iam_role_arn}} initContainers: - name: velero-plugin-for-aws image: velero/velero-plugin-for-aws:v1.7.1 @@ -78,8 +81,8 @@ spec: - mountPath: /target name: plugins destination: - namespace: 'velero' - name: '{{name}}' + namespace: '{{.metadata.annotations.velero_namespace}}' + name: '{{.name}}' syncPolicy: automated: {} syncOptions: diff --git a/gitops/bootstrap/bootstrap-app.yaml b/gitops/bootstrap/bootstrap-app.yaml index 213ba79..b08581f 100644 --- a/gitops/bootstrap/bootstrap-app.yaml +++ b/gitops/bootstrap/bootstrap-app.yaml @@ -1,23 +1,45 @@ apiVersion: argoproj.io/v1alpha1 -kind: Application +kind: ApplicationSet metadata: name: argo-bootstrap namespace: argocd spec: - project: default + goTemplate: true + goTemplateOptions: ["missingkey=error"] syncPolicy: - automated: - prune: false - destination: - namespace: argocd - server: https://kubernetes.default.svc - sources: - - repoURL: https://github.com/gitops-bridge-dev/gitopscon-2024-na-demo - path: gitops/bootstrap - targetRevision: HEAD - - repoURL: https://github.com/gitops-bridge-dev/gitopscon-2024-na-demo - path: gitops/clusters - targetRevision: HEAD - - repoURL: https://github.com/gitops-bridge-dev/gitopscon-2024-na-demo - path: gitops/addons - targetRevision: HEAD \ No newline at end of file + preserveResourcesOnDeletion: true + generators: + - clusters: + selector: + matchLabels: + environment: ops + + template: + metadata: + name: argo-bootstrap + labels: + appsetFileName: 'bootstrap-app.yaml' + environment: '{{.metadata.labels.environment}}' + type: 'bootstrap' + spec: + project: default + sources: + - repoURL: '{{.metadata.annotations.addons_repo_url}}' + path: gitops/bootstrap + targetRevision: '{{.metadata.annotations.addons_repo_revision}}' + - repoURL: '{{.metadata.annotations.addons_repo_url}}' + path: gitops/clusters + targetRevision: '{{.metadata.annotations.addons_repo_revision}}' + - repoURL: '{{.metadata.annotations.addons_repo_url}}' + path: gitops/addons + targetRevision: '{{.metadata.annotations.addons_repo_revision}}' + - repoURL: '{{.metadata.annotations.addons_repo_url}}' + path: gitops/workloads + targetRevision: '{{.metadata.annotations.addons_repo_revision}}' + destination: + namespace: argocd + name: '{{.name}}' + syncPolicy: + automated: + allowEmpty: true + prune: false diff --git a/gitops/charts/addons/monolith/Chart.yaml b/gitops/charts/guestbook/Chart.yaml similarity index 100% rename from gitops/charts/addons/monolith/Chart.yaml rename to gitops/charts/guestbook/Chart.yaml diff --git a/gitops/charts/addons/monolith/templates/_helpers.tpl b/gitops/charts/guestbook/templates/_helpers.tpl similarity index 100% rename from gitops/charts/addons/monolith/templates/_helpers.tpl rename to gitops/charts/guestbook/templates/_helpers.tpl diff --git a/gitops/charts/addons/monolith/templates/deployment.yaml b/gitops/charts/guestbook/templates/deployment.yaml similarity index 100% rename from gitops/charts/addons/monolith/templates/deployment.yaml rename to gitops/charts/guestbook/templates/deployment.yaml diff --git a/gitops/charts/addons/monolith/templates/service.yaml b/gitops/charts/guestbook/templates/service.yaml similarity index 100% rename from gitops/charts/addons/monolith/templates/service.yaml rename to gitops/charts/guestbook/templates/service.yaml diff --git a/gitops/charts/addons/monolith/values.yaml b/gitops/charts/guestbook/values.yaml similarity index 100% rename from gitops/charts/addons/monolith/values.yaml rename to gitops/charts/guestbook/values.yaml diff --git a/gitops/clusters/.keep b/gitops/clusters/.keep new file mode 100644 index 0000000..e69de29 diff --git a/gitops/clusters/dev-cluster.yaml b/gitops/clusters/dev-cluster.yaml deleted file mode 100644 index 804667a..0000000 --- a/gitops/clusters/dev-cluster.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - labels: - argocd.argoproj.io/secret-type: cluster - environment: staging - enable_velero: 'true' - enable_app: 'true' - annotations: - aws_cluster_name: dev-cluster - k8s_service_host: FCE8B11655CD8A0263DA638CE2A9BC71.gr7.us-east-1.eks.amazonaws.com - velero_bucket_name: gitopscon-na-24-velero-backups-dev - velero_iam_role_arn: arn:aws:iam::753080021511:role/velero-role-28d8f10 - name: dev-cluster-secret - namespace: argocd -type: Opaque -stringData: - name: dev - server: https://FCE8B11655CD8A0263DA638CE2A9BC71.gr7.us-east-1.eks.amazonaws.com -data: - config: >- - ewogICJhd3NBdXRoQ29uZmlnIjogewogICAgImNsdXN0ZXJOYW1lIjogImRldi1jbHVzdGVyIiwKICAgICJyb2xlQVJOIjogImFybjphd3M6aWFtOjo3NTMwODAwMjE1MTE6cm9sZS9hcmdvLXJvbGUtYWI4ZTA1ZSIKICB9LAogICJ0bHNDbGllbnRDb25maWciOiB7CiAgICAiaW5zZWN1cmUiOiBmYWxzZSwKICAgICJjYURhdGEiOiAiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUkNWRU5EUVdVeVowRjNTVUpCWjBsSlZVMWpaaTlyVHpoemF6UjNSRkZaU2t0dldrbG9kbU5PUVZGRlRFSlJRWGRHVkVWVVRVSkZSMEV4VlVVS1FYaE5TMkV6Vm1sYVdFcDFXbGhTYkdONlFXVkdkekI1VGtSQmVrMUVVWGxOZWtGM1RsUldZVVozTUhwT1JFRjZUVVJKZVUxNlFURk9WRlpoVFVKVmVBcEZla0ZTUW1kT1ZrSkJUVlJEYlhReFdXMVdlV0p0VmpCYVdFMTNaMmRGYVUxQk1FZERVM0ZIVTBsaU0wUlJSVUpCVVZWQlFUUkpRa1IzUVhkblowVkxDa0Z2U1VKQlVVTXlOM1ZLVVUxeVVERk5OMGhUY1RCMk1FTlFSaTlQTms1NmFIUnlOVTl6VVdkVVNHZDJhRlJ2VDFSRGFGcDJiVGhwVTBreFNqaDNSVGNLYzA1RE5VazRjM2R5T0VacVRFMVRSWGR0TTJKNlNrTkpPRWgxYlhkdEszUTBRbmN4VmpkWlpWZHJNa1ZXV25Ka1RURk1lVGQwTTFwdWVuRmhiakk1VWdvMk0yZExja050Y2pZek1qQlhaMnRNVG1KWVprdE9NRTVWV0VKWVMyOHJTeXQ2VWtGSmVrWk9VSHBTUldST1lucDZiakZsUms1WU4wY3dWVmRIVURKcUNucDBOMmRIT1hCV2RFaDNiMFlyTlZjNGQxQm9kMkl3U0VWS1JEUjNPVE5UY0ZGcVUwWmpja1oxWlhrMWFERm5UVmsxVVZKb1JqUnNlSGRJYTNOQ1Nra0tMMk54UmtsM1VESllRalUzWkV0dk1tZHRSRTVCV1d0dmRHSjZaREJLVmtadlFrWnRSalZ6Um1nM1RIQm9MekpEVnpsYVVtRjVUMEZWTjFZd1YycG9VQXBQT1hSSldESjFTRnBZY0ZscU5rZG9hWGt5UTBkV1JURXhXVkF4UVdkTlFrRkJSMnBYVkVKWVRVRTBSMEV4VldSRWQwVkNMM2RSUlVGM1NVTndSRUZRQ2tKblRsWklVazFDUVdZNFJVSlVRVVJCVVVndlRVSXdSMEV4VldSRVoxRlhRa0pUVTJaVmRFOWpOeXR5Ym5Cb1NVSnVjbUpEUlZoQlZsa3JLMFZxUVZZS1FtZE9Wa2hTUlVWRWFrRk5aMmR3Y21SWFNteGpiVFZzWkVkV2VrMUJNRWREVTNGSFUwbGlNMFJSUlVKRGQxVkJRVFJKUWtGUlEwSkthRzVvTDI1aWNBcHRLMjVRYjJKVUszSm5SVzQyVnpkdlpUUlZjMjFxWTBrd1EwVlNWWEExTDBKSk9FeHliRnBoY0hKT1NtaFRla2RHYm5GdlRIbG9kWFVyVEZVMU1tUTVDbkJtTDNsbVdYQmFlSHAzYTJoNFVtYzNZV1IyYVZWVmVrOXZkblZFWlZOdlptTmtNbEJoTUhWVlJqaFVaMk12Y21aSlJqSXZkbXhrUWtwalZXeFZZbVVLTkZKNllVMTNaMHBJVGxkNWJuaHdWbGhHYkRBNE5EUkhXVGx2U3pWdE1FOUljM2hQVkhwcldHeE5RWFZSWXpoUldXbHJNR0V2Y1RsNmVFaGhielF6YlFveWRqQk1iWHBrY3k5SWFXMW1PRkZsVlc1T1JrbHFXbXRtWjBaSlZXSktXR1pDTVZSWlZHaDRkMlEwS3pFNGRtbE5TM05YVFN0QlJtOHdlRlk1ZHk5TkNqZzRZVVpJVG5SYU0weDFjRkJvUmxsMWIxRldXbmxEYlZsUlNFSXJUbkJXVUZocWNVbENRemxLUzNoT2EzcEhMM3BqT0doUlExSlRibFpuZVhaSWVXZ0thMWRZVkZNMFNWWXdTV3hZQ2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLIgogIH0KfQo= diff --git a/gitops/clusters/hub-cluster.yaml b/gitops/clusters/hub-cluster.yaml deleted file mode 100644 index eec3ac4..0000000 --- a/gitops/clusters/hub-cluster.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - labels: - argocd.argoproj.io/secret-type: cluster - environment: ops - enable_velero: 'true' - enable_app: 'false' - annotations: - aws_cluster_name: hub-cluster - k8s_service_host: 2479598A0B25A29A79AAFFEB52D256F4.gr7.us-east-1.eks.amazonaws.com - velero_bucket_name: gitopscon-na-24-velero-backups-hub - velero_iam_role_arn: arn:aws:iam::753080021511:role/velero-role-67062f8 - name: hub-cluster-secret - namespace: argocd -type: Opaque -stringData: - name: hub - server: https://kubernetes.default.svc -data: - config: ewogICJ0bHNDbGllbnRDb25maWciOiB7CiAgICAiaW5zZWN1cmUiOiBmYWxzZQogIH0KfQo= diff --git a/gitops/clusters/prod-cluster.yaml b/gitops/clusters/prod-cluster.yaml deleted file mode 100644 index 5314ece..0000000 --- a/gitops/clusters/prod-cluster.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - labels: - argocd.argoproj.io/secret-type: cluster - environment: prod - enable_velero: 'true' - enable_app: 'true' - annotations: - aws_cluster_name: prod-cluster - k8s_service_host: 5B8E50459D84F3A74278805CC500D1B0.gr7.us-east-1.eks.amazonaws.com - velero_bucket_name: gitopscon-na-24-velero-backups-prod - velero_iam_role_arn: arn:aws:iam::753080021511:role/velero-role-dfccdbe - name: prod-cluster-secret - namespace: argocd -type: Opaque -stringData: - name: prod - server: https://5B8E50459D84F3A74278805CC500D1B0.gr7.us-east-1.eks.amazonaws.com -data: - config: >- - ewogICJhd3NBdXRoQ29uZmlnIjogewogICAgImNsdXN0ZXJOYW1lIjogInByb2QtY2x1c3RlciIsCiAgICAicm9sZUFSTiI6ICJhcm46YXdzOmlhbTo6NzUzMDgwMDIxNTExOnJvbGUvYXJnby1yb2xlLTVlYWM0NmUiCiAgfSwKICAidGxzQ2xpZW50Q29uZmlnIjogewogICAgImluc2VjdXJlIjogZmFsc2UsCiAgICAiY2FEYXRhIjogIkxTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJDVkVORFFXVXlaMEYzU1VKQlowbEpSM0JrZEhCVVUxRXlNRUYzUkZGWlNrdHZXa2xvZG1OT1FWRkZURUpSUVhkR1ZFVlVUVUpGUjBFeFZVVUtRWGhOUzJFelZtbGFXRXAxV2xoU2JHTjZRV1ZHZHpCNVRrUkJlazFFWjNoUFJFMHlUV3BHWVVaM01IcE9SRUY2VFVSWmVFOUVVWGhOYWtaaFRVSlZlQXBGZWtGU1FtZE9Wa0pCVFZSRGJYUXhXVzFXZVdKdFZqQmFXRTEzWjJkRmFVMUJNRWREVTNGSFUwbGlNMFJSUlVKQlVWVkJRVFJKUWtSM1FYZG5aMFZMQ2tGdlNVSkJVVVJLTkZKVVkzWmphRlJPYVZsdWVYbEtUakprTkhBM1VrcGlXSFZoWjNGU1NXRm1RMGRpUlZKa1ZHMHZSblpMVW5jelpXWXhRbWRKWlVrS1ZHOHpZblI0TWs5cGVHVm1jbkZFY1dkcFIycExVR0ZCVmtJNFltOXhURUp2TVhwa2RWWlVhMWxhYlc4NWR6TktVMVJEWlRobGFXaE5aMlpsZW14U2NncFhUak54WlZKaFFVOUtiRU5FZEUxc2JsbFRVa3N2WTNaaE9GSmpXV2x1UmxKMGVVaFVSbGxZY1hBeU9VZzJNbmxEWkV0MlowVk5kMGt3Wm5kaFpXWkhDazlEZVdoUVpIcG5lUzh6ZW05NFVXNU9TazVPSzNWVVJFNHpNalY1Y2s1R0szTk5VbTV2Y0c5dGMzQnZWMkZKTHprclZtWTBkaXRGYVdkcGNHeHRTSG9LYVRGRVFURkJRV0pRWldGdGVYRlBkRFpyUTJ4MFpIVnlaWGRMU2s1VGRtNUlPRVJSZGtsRWRIZHdUbll6WjJsSWFIRlhVbXh5UlUxSVJqUnJPVXhDVXdvMWRrUXpNRVpvUlROcU5sbEJSRVJCY1doT1YzRmxaREUwVDI4dlFXZE5Ra0ZCUjJwWFZFSllUVUUwUjBFeFZXUkVkMFZDTDNkUlJVRjNTVU53UkVGUUNrSm5UbFpJVWsxQ1FXWTRSVUpVUVVSQlVVZ3ZUVUl3UjBFeFZXUkVaMUZYUWtKU1VIQTRObUphYTB3eWJFOW5ZbWM0UmtKQldITnZNRE5yYkZoVVFWWUtRbWRPVmtoU1JVVkVha0ZOWjJkd2NtUlhTbXhqYlRWc1pFZFdlazFCTUVkRFUzRkhVMGxpTTBSUlJVSkRkMVZCUVRSSlFrRlJRWEYyVWk4d1UwaGpRd296ZVROT05UbFhjamxXVVhabWVWWlpjWFZJU1hZNVRWazRRbVJPZHpkVlZEUnZaSGRNYVdOTmQyMTJlbVZKTTNoMGFrcDBWR3R4TVVWTk1qTXlabWhYQ21zelZYUjJiVmd3TURoU1NuUnNkMHRNZVdocUswODJUa0ZYVWk5MVFVZHNMMWd4U0d0WVoxZzJUa1Z6ZERKM1pGbEhXblJtTlZVNU1YbGxVM3B3YjJNS1JIcE5ZbEUyU2s5RmEwcG9lamRaWVhwTmQwNHlOaTlqWmtaMWFqWTFiRmwzVG5wVlp6RlRTVUZoU2tJMlJHWk9aVkZWZUU1Vk5XNWlUWGxNZVN0V1JncFlVakJ2ZGtJclppOW5hVGsxVkRGQ2QzUmtTVFp3UkhGUk1uZHhaRUpzU0RaUlF5dHNjemRNVDBGUFVXNTNhRzFJVFVjNFdTOVNTR0ZYTjBGT1FsUklDbll4YlZZNGVIVnFjRWhSUTNNMWRuaFJhWE5YVldrNGVtcENkRXczVEZnd2FtTTJjVlphZUU1TFZXaDBOM1JRY25aME9EaFhOMlZDZWxWeFVuZFhObFVLVTJkVVlWcE9aa3h5UkV4akNpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSyIKICB9Cn0K diff --git a/gitops/environments/default/addons/velero/values.yaml b/gitops/environments/default/addons/velero/values.yaml new file mode 100644 index 0000000..0ff4912 --- /dev/null +++ b/gitops/environments/default/addons/velero/values.yaml @@ -0,0 +1 @@ +# values for velero for default diff --git a/gitops/environments/prod/addons/velero/values.yaml b/gitops/environments/prod/addons/velero/values.yaml new file mode 100644 index 0000000..d763546 --- /dev/null +++ b/gitops/environments/prod/addons/velero/values.yaml @@ -0,0 +1 @@ +# values for velero in prod diff --git a/gitops/environments/prod/addons/monolith/values.yaml b/gitops/environments/prod/workloads/guestbook/values.yaml similarity index 100% rename from gitops/environments/prod/addons/monolith/values.yaml rename to gitops/environments/prod/workloads/guestbook/values.yaml diff --git a/gitops/environments/staging/addons/velero/values.yaml b/gitops/environments/staging/addons/velero/values.yaml new file mode 100644 index 0000000..1c40f74 --- /dev/null +++ b/gitops/environments/staging/addons/velero/values.yaml @@ -0,0 +1 @@ +# values for velero in staging \ No newline at end of file diff --git a/gitops/environments/staging/addons/monolith/values.yaml b/gitops/environments/staging/workloads/guestbook/values.yaml similarity index 100% rename from gitops/environments/staging/addons/monolith/values.yaml rename to gitops/environments/staging/workloads/guestbook/values.yaml diff --git a/gitops/workloads/guestbook-appset.yaml b/gitops/workloads/guestbook-appset.yaml new file mode 100644 index 0000000..2dce35c --- /dev/null +++ b/gitops/workloads/guestbook-appset.yaml @@ -0,0 +1,60 @@ +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: workload-guestbook +spec: + goTemplate: true + goTemplateOptions: ["missingkey=error"] + syncPolicy: + preserveResourcesOnDeletion: true + generators: + - merge: + mergeKeys: + - server + generators: + - clusters: + values: + chartName: guestbook + selector: + matchExpressions: + - key: enable_app + operator: In + values: + - 'true' + - clusters: + selector: + matchExpressions: + - key: environment + operator: NotIn + values: + - 'ops' + template: + metadata: + name: 'addon-{{.name}}-guestbook' + labels: + chartName: '{{.values.chartName}}' + appsetFileName: 'guestbook-appset' + environment: '{{.metadata.labels.environment}}' + type: 'workload' + spec: + project: default + sources: + - repoURL: '{{.metadata.annotations.addons_repo_url}}' + targetRevision: '{{.metadata.annotations.addons_repo_revision}}' + ref: values + - repoURL: '{{.metadata.annotations.addons_repo_url}}' + targetRevision: '{{.metadata.annotations.addons_repo_revision}}' + path: gitops/charts/{{.values.chartName}} + helm: + ignoreMissingValueFiles: true + valueFiles: + - $values/gitops/environments/{{.metadata.labels.environment}}/workloads/{{.values.chartName}}/values.yaml + - $values/gitops/clusters/{{.name}}/workloads/{{.values.chartName}}/values.yaml + destination: + namespace: '{{.values.chartName}}' + name: '{{.name}}' + syncPolicy: + automated: {} + syncOptions: + - CreateNamespace=true + - ServerSideApply=true # Big CRDs. \ No newline at end of file diff --git a/hack/override-pulumi-config.sh b/hack/override-pulumi-config.sh new file mode 100755 index 0000000..ae29b7d --- /dev/null +++ b/hack/override-pulumi-config.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail +[[ -n "${DEBUG:-}" ]] && set -x + +# The following variables are set by Github Actions +# GITHUB_REPOSITORY_OWNER +# GITHUB_REPOSITORY +# PULUMI_ACCOUNT +# PULUMI_PROJECT +# PULUMI_STACK_NAME +# VELERO_BACKUP_BUCKET + +pulumi stack select ${PULUMI_STACK_NAME} +pulumi config set githubOrg ${GITHUB_REPOSITORY_OWNER} +pulumi config set githubRepo $(echo "${GITHUB_REPOSITORY}" | cut -d '/' -f2) +pulumi config set veleroBucketPrefix ${VELERO_BACKUP_BUCKET} +if [ ${PULUMI_STACK_NAME} != "hub" ]; then + pulumi config set hubStackName ${PULUMI_ACCOUNT}/${PULUMI_PROJECT}/hub +fi +cat stacks/Pulumi.${PULUMI_STACK_NAME}.yaml \ No newline at end of file diff --git a/hack/test-override-vars.sh b/hack/test-override-vars.sh new file mode 100755 index 0000000..80d5403 --- /dev/null +++ b/hack/test-override-vars.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +export DEBUG=true +export GITHUB_REPOSITORY_OWNER=csantanapr +export GITHUB_REPOSITORY=csantanapr/gitopscon-2024-na-demo +export PULUMI_ACCOUNT=csantanapr +export PULUMI_PROJECT=gitopscon-2024-na-demo-carlos +export PULUMI_STACK_NAME=hub +export VELERO_BACKUP_BUCKET=gitopscon-na-24-velero-backups-carlos diff --git a/pulumi/Pulumi.yaml b/pulumi/Pulumi.yaml index 3e6ddba..c32b061 100644 --- a/pulumi/Pulumi.yaml +++ b/pulumi/Pulumi.yaml @@ -1,4 +1,10 @@ -name: gitopscon-2024-na-demo -runtime: nodejs -description: GitOpsCon 2024 North America Demo Project - +# Reference docs for this configuration file +# - https://www.pulumi.com/docs/concepts/projects/project-file +name: gitopscon-2024-na-demo-carlos +runtime: + name: nodejs + options: + # See https://github.com/TypeStrong/ts-node/issues/1007 + nodeargs: "--loader ts-node/esm --no-warnings" +stackConfigDir: stacks +main: src diff --git a/pulumi/README.md b/pulumi/README.md deleted file mode 100644 index da4fde8..0000000 --- a/pulumi/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Pulumi Typescript GitOps Bridge - -### How to Start Your Hub Cluster: - -1. Create applicable stack files you need - The `Pulumi.dev.yaml` and `Pulumi.hub.yaml` each correspond to one stack for your hub cluster and one stack for a development environment spoke cluster -2. Create a GitOps Repo - Add a README.md and stub out the files you will be adding the ArgoCD Cluster secrets to. -3. Update configuration values as you need - You will want to update Stack Files with configuration for Github Repo/Org, as well as AWS Account ID, CIDRs, etc; -4. Add any extra resources you may need in your given environment -5. Add an Environment Variable for `GITHUB_TOKEN` in your deployment env (local, Github Actions, AWS Code Pipeline, etc;) -6. `pulumi up --stack hub` -7. Wait for the Resources to create like VPC, EKS Cluster, and IAM permissions -8. Run `./bootstrap.sh` - - -### How to Add Spoke Clusters: - -1. Add any extra resources you may need in your given environment -2. Add an Environment Variable for `GITHUB_TOKEN` in your deployment env (local, Github Actions, AWS Code Pipeline, etc;) -3. Run Pulumi Up for the Spoke Cluster's Stack `pulumi up --stack dev` -4. Wait for the Resources to create like VPC, EKS Cluster, and IAM permissions -5. Apply the Secret resource that was added to the GitOps Repository - -### Productionizing your Implementation - -* Add Authentication for ArgoCD to be able to grab from your Organization's private repository -* Add ApplicationSets to your configuration by looking at the GitOps Bridge Control Plane Template for resources you need -* Create an ArgoCD Application that manages deployment of your Cluster Secret -* Move your EKS Cluster to be a private access endpoint \ No newline at end of file diff --git a/pulumi/bootstrap.sh b/pulumi/bootstrap.sh index 4e7d5a4..ba6a16f 100755 --- a/pulumi/bootstrap.sh +++ b/pulumi/bootstrap.sh @@ -1,32 +1,30 @@ #!/bin/bash - -export AWS_PROFILE=default +set -ueo pipefail # Add EKS cluster to kubeconfig aws eks --region us-east-1 update-kubeconfig --name hub-cluster --alias hub-cluster # Install ArgoCD -kubectl create namespace argocd --context hub-cluster -kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml --context hub-cluster - -kubectl annotate serviceaccount argocd-server argocd-application-controller \ - eks.amazonaws.com/role-arn= --namespace=argocd - -kubectl rollout restart deployment argocd-server -kubectl rollout restart sts argocd-application-controller +helm repo add argo https://argoproj.github.io/argo-helm || true +helm repo update +helm upgrade --install argocd argo/argo-cd --namespace argocd --create-namespace --wait kubectl create secret generic private-repo-creds -n argocd \ --from-literal=username=REPLACE_USERNAME \ --from-literal=password=$GITHUB_TOKEN \ --from-literal=type=git \ - --from-literal=url=https://github.com/gitops-bridge-dev/gitopscon-2024-na-demo \ + --from-literal=url=https://github.com/csantanapr/gitopscon-2024-na-demo-carlos \ --dry-run=client -o yaml | \ sed "s/namespace: argocd/namespace: argocd\n labels:\n argocd.argoproj.io\/secret-type: repository/" | \ kubectl apply -f - -kubectl apply -f "../gitops/clusters/hub-cluster.yaml" +sleep 60 +# Deploy Application Set kubectl apply -f "../gitops/bootstrap/bootstrap-app.yaml" # Echo command to port forward ArgoCD and get admin password echo "To port forward ArgoCD run: kubectl -n argocd port-forward svc/argocd-server 8080:443 &" -echo "Password can be retrieved by running: kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d" +echo "Username: admin" +echo "Password: $(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" --context hub-cluster | base64 -d)" +echo "Access https://localhost:8080" +echo "To port forward ArgoCD run: kubectl -n argocd port-forward svc/argocd-server 8080:443 --context hub-cluster" \ No newline at end of file diff --git a/pulumi/iam.ts b/pulumi/iam.ts deleted file mode 100644 index 03eca88..0000000 --- a/pulumi/iam.ts +++ /dev/null @@ -1,77 +0,0 @@ -import * as pulumi from "@pulumi/pulumi"; -import * as aws from "@pulumi/aws"; - -export function createArgoRole( - awsAccountId: string, - oidcProviderUrl: pulumi.Output, - config: pulumi.Config, - ) { - if (config.require("clusterType") === "spoke") { - const hubStack = new pulumi.StackReference("hub-argorole-ref", { - name: config.require("hubStackName") - }) - const outputs = hubStack.getOutput("outputs") as pulumi.Output<{[key: string]: string}> - const policy = outputs.apply((outputs) => JSON.stringify({ - Version: "2012-10-17", - Statement: [ - { - Effect: "Allow", - Principal: { - AWS: outputs.argoRoleArn - }, - Action: "sts:AssumeRole" - } - ] - })) - return new aws.iam.Role("argo-role", { - assumeRolePolicy: policy - }) - } - return new aws.iam.Role("argo-role", { - inlinePolicies: [ - { - name: "Argo", - policy: JSON.stringify({ - Version: "2012-10-17", - Statement: [ - { - Sid: "ArgoSecrets", - Action: [ - "secretsmanager:List*", - "secretsmanager:Read*" - ], - Resource: "*", - Effect: "Allow", - }, - { - Sid: "AssumeRoles", - Action: [ - "sts:AssumeRole" - ], - Resource: "*", - Effect: "Allow" - }, - ], - }) - } - ], - assumeRolePolicy: oidcProviderUrl.apply(v => JSON.stringify({ - Version: "2012-10-17", - Statement: [ - { - Effect: "Allow", - Principal: { - Federated: `arn:aws:iam::${awsAccountId}:oidc-provider/${v}` - }, - Action: "sts:AssumeRoleWithWebIdentity", - Condition: { - StringLike: { - [`${v}:sub`]: ["system:serviceaccount:argocd:argocd-application-controller", "system:serviceaccount:argocd:argocd-server"], - [`${v}:aud`]: "sts.amazonaws.com" - } - } - } - ] - })) - }) -} \ No newline at end of file diff --git a/pulumi/components.ts b/pulumi/src/components.ts similarity index 93% rename from pulumi/components.ts rename to pulumi/src/components.ts index 97c8d5e..67a4488 100644 --- a/pulumi/components.ts +++ b/pulumi/src/components.ts @@ -2,8 +2,10 @@ import * as pulumi from "@pulumi/pulumi"; import * as aws from "@pulumi/aws"; export function createVeleroResources(awsAccountId: string, oidcProviderUrl: pulumi.Output, stackName: string) { + const config = new pulumi.Config() + const bucketPrefix = config.require("veleroBucketPrefix") const bucket = new aws.s3.Bucket("velero-bucket", { - bucket: `gitopscon-na-24-velero-backups-${stackName}`, + bucket: `${bucketPrefix}-${stackName}`, acl: "private", versioning: { enabled: true, diff --git a/pulumi/github.ts b/pulumi/src/github.ts similarity index 72% rename from pulumi/github.ts rename to pulumi/src/github.ts index c6231cf..7154497 100644 --- a/pulumi/github.ts +++ b/pulumi/src/github.ts @@ -1,7 +1,7 @@ import * as pulumi from "@pulumi/pulumi"; import * as github from "@pulumi/github"; import * as yaml from 'js-yaml'; -import { getValue } from "./utils" +import { getValue } from "./utils.js" import { env } from "process"; export class GitOpsClusterConfig { @@ -51,9 +51,9 @@ export class GitOpsClusterConfig { private generateConfig(clusterAuthority: pulumi.Output) { if (this.config.require("clusterType") !== "hub") { - return pulumi.all([this.outputs.argoRoleArn, clusterAuthority]).apply(([argoRoleArn, clusterAuthority]) => `{ + return pulumi.all([this.outputs.argoRoleArn, this.outputs.clusterName, clusterAuthority]).apply(([argoRoleArn, clusterName, clusterAuthority]) => `{ "awsAuthConfig": { - "clusterName": "${this.config.require("name")}-cluster", + "clusterName": "${clusterName}", "roleARN": "${argoRoleArn}" }, "tlsClientConfig": { @@ -78,18 +78,39 @@ export class GitOpsClusterConfig { this.outputs.clusterApiEndpoint, this.outputs.veleroBucket, this.outputs.veleroIamRoleArn, + this.outputs.addons_repo_url, + this.outputs.addons_repo_revision, + this.outputs.aws_region, + this.outputs.aws_account_id, + this.outputs.velero_namespace, + this.outputs.velero_service_account, + this.outputs.velero_backup_s3_bucket_prefix, ]) const annotations = outputs.apply(([ clusterName, clusterApiEndpoint, veleroBucket, veleroIamRoleArn, + addons_repo_url, + addons_repo_revision, + aws_region, + aws_account_id, + velero_namespace, + velero_service_account, + velero_backup_s3_bucket_prefix, ]) => { return { "aws_cluster_name": clusterName, "k8s_service_host": clusterApiEndpoint.split("://")[1], - "velero_bucket_name": veleroBucket, - "velero_iam_role_arn": veleroIamRoleArn + "velero_backup_s3_bucket_name": veleroBucket, + "velero_iam_role_arn": veleroIamRoleArn, + "addons_repo_url": addons_repo_url, + "addons_repo_revision": addons_repo_revision, + "aws_region": aws_region, + "aws_account_id": aws_account_id, + "velero_namespace": velero_namespace, + "velero_service_account": velero_service_account, + "velero_backup_s3_bucket_prefix": velero_backup_s3_bucket_prefix } }) return annotations diff --git a/pulumi/src/iam.ts b/pulumi/src/iam.ts new file mode 100644 index 0000000..5a88f41 --- /dev/null +++ b/pulumi/src/iam.ts @@ -0,0 +1,76 @@ +import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; + +export function createSpokeRole(config: pulumi.Config) { + const hubStack = new pulumi.StackReference("hub-argorole-ref", { + name: config.require("hubStackName") + }) + const outputs = hubStack.getOutput("outputs") as pulumi.Output<{ [key: string]: string }> + const policy = outputs.apply((outputs) => JSON.stringify({ + Version: "2012-10-17", + Statement: [ + { + Effect: "Allow", + Principal: { + AWS: outputs.argoRoleArn + }, + Action: ["sts:AssumeRole", "sts:TagSession"] + } + ] + })) + return new aws.iam.Role("argo-role", { + assumeRolePolicy: policy + }) +} + +export function createHubRole(clusterName: pulumi.Output) { + const assumeRole = aws.iam.getPolicyDocument({ + statements: [{ + effect: "Allow", + principals: [{ + type: "Service", + identifiers: ["pods.eks.amazonaws.com"], + }], + actions: [ + "sts:AssumeRole", + "sts:TagSession", + ], + }], + }); + + const iamRole = new aws.iam.Role("argo-hub-role", { + assumeRolePolicy: assumeRole.then(assumeRole => assumeRole.json), + }); + const policy = aws.iam.getPolicyDocument({ + statements: [{ + effect: "Allow", + actions: ["sts:AssumeRole", "sts:TagSession"], + resources: ["*"], + }], + }); + const policyPolicy = new aws.iam.Policy("argo-hub-role", { + policy: policy.then(policy => policy.json), + }); + const rolePolicyAttachment = new aws.iam.RolePolicyAttachment("argo-hub-role", { + role: iamRole.name, + policyArn: policyPolicy.arn, + }); + + + const controllerPodIdentityAssociation = new aws.eks.PodIdentityAssociation("argo-controller", { + clusterName: clusterName, + namespace: "argocd", + serviceAccount: "argocd-application-controller", + roleArn: iamRole.arn, + }); + + const apiPodIdentityAssociation = new aws.eks.PodIdentityAssociation("argo-server", { + clusterName: clusterName, + namespace: "argocd", + serviceAccount: "argocd-server", + roleArn: iamRole.arn, + }); + + return iamRole; +} + diff --git a/pulumi/index.ts b/pulumi/src/index.ts similarity index 61% rename from pulumi/index.ts rename to pulumi/src/index.ts index 05f7667..f7aad2e 100644 --- a/pulumi/index.ts +++ b/pulumi/src/index.ts @@ -1,21 +1,38 @@ import * as pulumi from "@pulumi/pulumi"; +import * as aws from "@pulumi/aws"; import * as awsx from "@pulumi/awsx"; import * as eks from "@pulumi/eks"; -import { createArgoRole } from "./iam" -import { GitOpsClusterConfig } from "./github" -import { createVeleroResources } from "./components" +import { createHubRole } from "./iam.js" +import { createSpokeRole } from "./iam.js" +import { GitOpsClusterConfig } from "./github.js" +import { createVeleroResources } from "./components.js" + +const callerIdentity = aws.getCallerIdentity({}); +const awsAccountId = await callerIdentity.then(identity => identity.accountId); + +const region = aws.getRegion(); +const awsRegion = await region.then(r => r.name); const stackName = pulumi.getStack() const config = new pulumi.Config() let roleMappings: eks.RoleMapping[] = [] +const clusterComponents = config.requireObject("clusterComponents") + export const outputs: {[key: string]: any} = { "stackName": stackName, + "addons_repo_url": `https://github.com/${config.require("githubOrg")}/${config.require("githubRepo")}`, + "addons_repo_revision": config.require("githubRevision"), + "aws_region": awsRegion, + "aws_account_id": awsAccountId, + "velero_namespace": "velero", + "velero_service_account": "velero", + "velero_backup_s3_bucket_prefix": "backups" } // VPC Config -const vpc = new awsx.ec2.Vpc("vpc", { +const vpc = new awsx.ec2.Vpc(stackName, { cidrBlock: config.require("cidrBlock"), numberOfAvailabilityZones: 3, enableDnsHostnames: true, @@ -44,25 +61,29 @@ const vpc = new awsx.ec2.Vpc("vpc", { "kubernetes.io/role/elb": "1", }, }, - ], - tags: { - "name": stackName, - }, + ] }) // If we are creating a spoke cluster we need to create argoRole first, ensure it // gets added to auth mapping for the cluster with the correct permissions if (config.require("clusterType") === "spoke") { - const argoRole = createArgoRole(config.require("awsAccountId"), pulumi.output(""), config) + const argoRole = createSpokeRole(config) roleMappings.push({ roleArn: argoRole.arn, username: argoRole.arn, groups: ["system:masters"], - }) + } + ) outputs.argoRoleArn = argoRole.arn } // Create EKS Cluster with a default node group +// By default pulumi will attempt to apply sane dependency resolution to control +// resource rollouts +// - https://www.pulumi.com/docs/concepts/options/dependson +// let res1 = new MyResource("res1", {/*...*/}); +// let res2 = new MyResource("res2", {/*...*/}, { dependsOn: [res1] }); + const eksCluster = new eks.Cluster(`${stackName}-cluster`, { name: `${stackName}-cluster`, vpcId: vpc.vpcId, @@ -90,28 +111,33 @@ const eksCluster = new eks.Cluster(`${stackName}-cluster`, { "name": stackName, }, },{ - transformations: [args => { - if (args.type === "aws:eks/cluster:Cluster") { - args.props["accessConfig"] = { - authenticationMode: "API_AND_CONFIG_MAP" - }; - } - return undefined; - }] + // transformations: [args => { + // if (args.type === "aws:eks/cluster:Cluster") { + // args.props["accessConfig"] = { + // authenticationMode: "CONFIG_MAP" //TODO investigate how to make it work with API_AND_CONFIG_MAP + // }; + // } + // return undefined; + // }] }) +const example = new aws.eks.Addon("eks-pod-identity-agent", { + clusterName: eksCluster.eksCluster.name, + addonName: "eks-pod-identity-agent", +}); + outputs.clusterName = eksCluster.eksCluster.name outputs.clusterApiEndpoint = eksCluster.core.endpoint const oidcProviderUrl = eksCluster.core.oidcProvider?.url as pulumi.Output -const { veleroIamRole, veleroBucket } = createVeleroResources(config.require("awsAccountId"), oidcProviderUrl, config.require("name")) +const { veleroIamRole, veleroBucket } = createVeleroResources(awsAccountId, oidcProviderUrl, stackName) outputs.veleroBucket = veleroBucket.bucket, outputs.veleroIamRoleArn = veleroIamRole.arn // If we are creating the hub cluster we need pods in eks cluster to be able to assume // so we need cluster created first if (config.require("clusterType") === "hub") { - const argoRole = createArgoRole(config.require("awsAccountId"), oidcProviderUrl, config) + const argoRole = createHubRole(eksCluster.eksCluster.name) outputs.argoRoleArn = argoRole.arn } diff --git a/pulumi/package-lock.json b/pulumi/src/package-lock.json similarity index 97% rename from pulumi/package-lock.json rename to pulumi/src/package-lock.json index ae0cd09..429058d 100644 --- a/pulumi/package-lock.json +++ b/pulumi/src/package-lock.json @@ -6,12 +6,13 @@ "": { "name": "gitops-bridge-ts", "dependencies": { - "@pulumi/aws": "^5.0.0", + "@pulumi/aws": "^6.0.0", "@pulumi/awsx": "^1.0.0", "@pulumi/eks": "^2.0.0", "@pulumi/github": "^5.22.0", "@pulumi/pulumi": "^3.0.0", - "process": "^0.11.10" + "process": "^0.11.10", + "ts-node": "^10.9.2" }, "devDependencies": { "@types/js-yaml": "^4.0.9", @@ -621,8 +622,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "optional": true, - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -634,8 +633,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "optional": true, - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -775,16 +772,6 @@ } } }, - "node_modules/@jest/core/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/@jest/core/node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -829,60 +816,6 @@ } } }, - "node_modules/@jest/core/node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -1440,16 +1373,13 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@pulumi/aws": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-5.43.0.tgz", - "integrity": "sha512-ZWI+QvEaFy27wUW8j8EVadgvl6u3926AAgpghflSPxF/9mG5XoDy0rqkRZOgO13ZJinC1qkQDzoMz0ACgmwTiw==", - "hasInstallScript": true, + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-6.27.0.tgz", + "integrity": "sha512-KZeOX1e/ZeFF0c+ImzscTQiM23Rx7pRtG4UGciINMmFiGqFRvoF/mPAb1Ln1+5Lzk2C62OHyb5m052pVJEcebg==", "dependencies": { "@pulumi/pulumi": "^3.0.0", - "aws-sdk": "^2.0.0", "builtin-modules": "3.0.0", "mime": "^2.0.0", - "read-package-tree": "^5.2.1", "resolve": "^1.7.1" } }, @@ -1466,6 +1396,20 @@ "mime": "^2.0.0" } }, + "node_modules/@pulumi/awsx/node_modules/@pulumi/aws": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-5.43.0.tgz", + "integrity": "sha512-ZWI+QvEaFy27wUW8j8EVadgvl6u3926AAgpghflSPxF/9mG5XoDy0rqkRZOgO13ZJinC1qkQDzoMz0ACgmwTiw==", + "hasInstallScript": true, + "dependencies": { + "@pulumi/pulumi": "^3.0.0", + "aws-sdk": "^2.0.0", + "builtin-modules": "3.0.0", + "mime": "^2.0.0", + "read-package-tree": "^5.2.1", + "resolve": "^1.7.1" + } + }, "node_modules/@pulumi/docker": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@pulumi/docker/-/docker-3.6.1.tgz", @@ -1492,17 +1436,6 @@ "which": "^1.3.1" } }, - "node_modules/@pulumi/eks/node_modules/@pulumi/aws": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-6.23.0.tgz", - "integrity": "sha512-Ib8M55N0OgAv1+1O2IyQToMhN4AdRrQECq/hVXinoK7696RT/3SiVr6Q05OLqEOiFQhzEFmVwB50zwArhDxTxA==", - "dependencies": { - "@pulumi/pulumi": "^3.0.0", - "builtin-modules": "3.0.0", - "mime": "^2.0.0", - "resolve": "^1.7.1" - } - }, "node_modules/@pulumi/eks/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1610,6 +1543,14 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@pulumi/pulumi/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/@pulumi/pulumi/node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -1658,11 +1599,40 @@ "node": ">=8.17.0" } }, + "node_modules/@pulumi/pulumi/node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@pulumi/pulumi/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/@pulumi/pulumi/node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/@pulumi/query": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@pulumi/query/-/query-0.3.0.tgz", @@ -1714,30 +1684,22 @@ "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "optional": true, - "peer": true + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "optional": true, - "peer": true + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "optional": true, - "peer": true + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "optional": true, - "peer": true + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/aws-lambda": { "version": "8.10.134", @@ -1913,8 +1875,6 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1926,8 +1886,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1994,9 +1952,7 @@ "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "optional": true, - "peer": true + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "node_modules/argparse": { "version": "2.0.1", @@ -2090,9 +2046,10 @@ } }, "node_modules/aws-sdk": { - "version": "2.1565.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1565.0.tgz", - "integrity": "sha512-5+qkIUd6GfzybqWP43RCMqCNL5Ry3ztCWcC5d9Mq0O9cqQQM9eoUfktdgiu1eFc3zAM01dFNUR6fZfXnmZgkuQ==", + "version": "2.1587.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1587.0.tgz", + "integrity": "sha512-C9RUBgAaKWe7t/DqQlkIVAd98FHtYVzywUGBJh0Wd/XpelX4mjNhb9yjGGPNCchk0lEufcEXIEW/fLZRA44grA==", + "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -2553,16 +2510,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/create-jest/node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -2607,66 +2554,10 @@ } } }, - "node_modules/create-jest/node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/create-jest/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "optional": true, - "peer": true + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -2832,9 +2723,9 @@ } }, "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "engines": { "node": ">=0.3.1" } @@ -4009,16 +3900,6 @@ } } }, - "node_modules/jest-cli/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/jest-cli/node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -4063,60 +3944,6 @@ } } }, - "node_modules/jest-cli/node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -5926,24 +5753,45 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dependencies": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "bin": { - "ts-node": "dist/bin.js" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=4.2.0" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "node_modules/type-detect": { @@ -6138,9 +5986,7 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "optional": true, - "peer": true + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -6322,11 +6168,11 @@ } }, "node_modules/yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/yocto-queue": { @@ -6787,8 +6633,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "optional": true, - "peer": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -6797,8 +6641,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "optional": true, - "peer": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -6910,13 +6752,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true - }, "jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -6945,35 +6780,6 @@ "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "optional": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true } } }, @@ -7394,15 +7200,13 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@pulumi/aws": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-5.43.0.tgz", - "integrity": "sha512-ZWI+QvEaFy27wUW8j8EVadgvl6u3926AAgpghflSPxF/9mG5XoDy0rqkRZOgO13ZJinC1qkQDzoMz0ACgmwTiw==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-6.27.0.tgz", + "integrity": "sha512-KZeOX1e/ZeFF0c+ImzscTQiM23Rx7pRtG4UGciINMmFiGqFRvoF/mPAb1Ln1+5Lzk2C62OHyb5m052pVJEcebg==", "requires": { "@pulumi/pulumi": "^3.0.0", - "aws-sdk": "^2.0.0", "builtin-modules": "3.0.0", "mime": "^2.0.0", - "read-package-tree": "^5.2.1", "resolve": "^1.7.1" } }, @@ -7416,6 +7220,21 @@ "@pulumi/pulumi": "^3.0.0", "@types/aws-lambda": "^8.10.23", "mime": "^2.0.0" + }, + "dependencies": { + "@pulumi/aws": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-5.43.0.tgz", + "integrity": "sha512-ZWI+QvEaFy27wUW8j8EVadgvl6u3926AAgpghflSPxF/9mG5XoDy0rqkRZOgO13ZJinC1qkQDzoMz0ACgmwTiw==", + "requires": { + "@pulumi/pulumi": "^3.0.0", + "aws-sdk": "^2.0.0", + "builtin-modules": "3.0.0", + "mime": "^2.0.0", + "read-package-tree": "^5.2.1", + "resolve": "^1.7.1" + } + } } }, "@pulumi/docker": { @@ -7443,17 +7262,6 @@ "which": "^1.3.1" }, "dependencies": { - "@pulumi/aws": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-6.23.0.tgz", - "integrity": "sha512-Ib8M55N0OgAv1+1O2IyQToMhN4AdRrQECq/hVXinoK7696RT/3SiVr6Q05OLqEOiFQhzEFmVwB50zwArhDxTxA==", - "requires": { - "@pulumi/pulumi": "^3.0.0", - "builtin-modules": "3.0.0", - "mime": "^2.0.0", - "resolve": "^1.7.1" - } - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7550,6 +7358,11 @@ "sprintf-js": "~1.0.2" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -7583,10 +7396,30 @@ "rimraf": "^3.0.0" } }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==" } } }, @@ -7632,30 +7465,22 @@ "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "optional": true, - "peer": true + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "optional": true, - "peer": true + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "optional": true, - "peer": true + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "optional": true, - "peer": true + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "@types/aws-lambda": { "version": "8.10.134", @@ -7830,16 +7655,12 @@ "acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "optional": true, - "peer": true + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "optional": true, - "peer": true + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==" }, "agent-base": { "version": "6.0.2", @@ -7882,9 +7703,7 @@ "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "optional": true, - "peer": true + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, "argparse": { "version": "2.0.1", @@ -7951,9 +7770,9 @@ } }, "aws-sdk": { - "version": "2.1565.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1565.0.tgz", - "integrity": "sha512-5+qkIUd6GfzybqWP43RCMqCNL5Ry3ztCWcC5d9Mq0O9cqQQM9eoUfktdgiu1eFc3zAM01dFNUR6fZfXnmZgkuQ==", + "version": "2.1587.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1587.0.tgz", + "integrity": "sha512-C9RUBgAaKWe7t/DqQlkIVAd98FHtYVzywUGBJh0Wd/XpelX4mjNhb9yjGGPNCchk0lEufcEXIEW/fLZRA44grA==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -8270,13 +8089,6 @@ "prompts": "^2.0.1" }, "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true - }, "jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -8305,44 +8117,13 @@ "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "optional": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true } } }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "optional": true, - "peer": true + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "cross-spawn": { "version": "7.0.3", @@ -8448,9 +8229,9 @@ } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" }, "diff-sequences": { "version": "29.6.3", @@ -9265,13 +9046,6 @@ "yargs": "^17.3.1" }, "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true - }, "jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -9300,35 +9074,6 @@ "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "optional": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true } } }, @@ -10664,18 +10409,23 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" } }, "type-detect": { @@ -10803,9 +10553,7 @@ "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "optional": true, - "peer": true + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "v8-to-istanbul": { "version": "9.2.0", @@ -10948,9 +10696,9 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" }, "yocto-queue": { "version": "0.1.0", diff --git a/pulumi/package.json b/pulumi/src/package.json similarity index 74% rename from pulumi/package.json rename to pulumi/src/package.json index c4635e4..0bc1aec 100644 --- a/pulumi/package.json +++ b/pulumi/src/package.json @@ -1,16 +1,18 @@ { "name": "gitops-bridge-ts", "main": "index.ts", + "type": "module", "devDependencies": { "@types/js-yaml": "^4.0.9", "@types/node": "^16.18.61" }, "dependencies": { - "@pulumi/aws": "^5.0.0", + "@pulumi/aws": "^6.0.0", "@pulumi/awsx": "^1.0.0", "@pulumi/eks": "^2.0.0", "@pulumi/github": "^5.22.0", "@pulumi/pulumi": "^3.0.0", - "process": "^0.11.10" + "process": "^0.11.10", + "ts-node": "^10.9.2" } } diff --git a/pulumi/tsconfig.json b/pulumi/src/tsconfig.json similarity index 86% rename from pulumi/tsconfig.json rename to pulumi/src/tsconfig.json index ab65afa..7906673 100644 --- a/pulumi/tsconfig.json +++ b/pulumi/src/tsconfig.json @@ -2,8 +2,8 @@ "compilerOptions": { "strict": true, "outDir": "bin", - "target": "es2016", - "module": "commonjs", + "target": "ESNext", + "module": "ESNext", "moduleResolution": "node", "sourceMap": true, "experimentalDecorators": true, diff --git a/pulumi/utils.ts b/pulumi/src/utils.ts similarity index 100% rename from pulumi/utils.ts rename to pulumi/src/utils.ts diff --git a/pulumi/Pulumi.dev.yaml b/pulumi/stacks/Pulumi.dev.yaml similarity index 57% rename from pulumi/Pulumi.dev.yaml rename to pulumi/stacks/Pulumi.dev.yaml index 3aec983..5f692d3 100644 --- a/pulumi/Pulumi.dev.yaml +++ b/pulumi/stacks/Pulumi.dev.yaml @@ -1,14 +1,14 @@ config: aws:region: us-east-1 cidrBlock: 10.0.0.0/16 - awsAccountId: "753080021511" clusterType: "spoke" - name: "dev" - hubStackName: "blakeromano/gitopscon-2024-na-demo/hub" + environment: staging + secretPath: "gitops/clusters/dev-cluster.yaml" + hubStackName: "pulumiaccount/gitopscon-2024-na-demo/hub" githubOrg: "gitops-bridge-dev" githubRepo: "gitopscon-2024-na-demo" - secretPath: "gitops/clusters/dev-cluster.yaml" - implementationType: "github" - environment: staging + githubRevision: "HEAD" + veleroBucketPrefix: "velero-backup-bucket" clusterComponents: - enable_velero: "true" \ No newline at end of file + enable_velero: "true" + enable_app: "true" diff --git a/pulumi/Pulumi.hub.yaml b/pulumi/stacks/Pulumi.hub.yaml similarity index 70% rename from pulumi/Pulumi.hub.yaml rename to pulumi/stacks/Pulumi.hub.yaml index 1923e8d..db44cf0 100644 --- a/pulumi/Pulumi.hub.yaml +++ b/pulumi/stacks/Pulumi.hub.yaml @@ -1,13 +1,12 @@ config: aws:region: us-east-1 - awsAccountId: "753080021511" cidrBlock: 10.0.0.0/16 - githubOrg: "gitops-bridge-dev" - githubRepo: "gitopscon-2024-na-demo" - secretPath: "gitops/clusters/hub-cluster.yaml" - name: "hub" clusterType: "hub" - implementationType: "github" environment: ops + secretPath: "gitops/clusters/hub-cluster.yaml" + githubOrg: "gitops-bridge-dev" + githubRepo: "gitopscon-2024-na-demo" + githubRevision: "HEAD" + veleroBucketPrefix: "velero-backup-bucket" clusterComponents: - enable_velero: "true" \ No newline at end of file + enable_velero: "true" diff --git a/pulumi/Pulumi.prod.yaml b/pulumi/stacks/Pulumi.prod.yaml similarity index 57% rename from pulumi/Pulumi.prod.yaml rename to pulumi/stacks/Pulumi.prod.yaml index f998787..22661e3 100644 --- a/pulumi/Pulumi.prod.yaml +++ b/pulumi/stacks/Pulumi.prod.yaml @@ -1,14 +1,14 @@ config: aws:region: us-east-1 cidrBlock: 10.0.0.0/16 - awsAccountId: "753080021511" clusterType: "spoke" - name: "prod" - hubStackName: "blakeromano/gitopscon-2024-na-demo/hub" + environment: prod + secretPath: "gitops/clusters/prod-cluster.yaml" + hubStackName: "pulumiaccount/gitopscon-2024-na-demo/hub" githubOrg: "gitops-bridge-dev" githubRepo: "gitopscon-2024-na-demo" - secretPath: "gitops/clusters/prod-cluster.yaml" - implementationType: "github" - environment: prod + githubRevision: "HEAD" + veleroBucketPrefix: "velero-backup-bucket" clusterComponents: - enable_velero: "true" \ No newline at end of file + enable_velero: "true" + enable_app: "true"