diff --git a/.gitignore b/.gitignore index 3f2405f89d..1575ee6d9e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ .terraform/ .DS_Store + +.idea diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 6250b5c0b9..84a4262827 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,22 +1,22 @@ { - "cli": "0.113.1", - "api": "0.113.1", - "shared": "0.113.1", - "terraform/provider": "0.113.1", + "cli": "0.115.1", + "api": "0.115.1", + "shared": "0.115.1", + "terraform/provider": "0.115.1", "terraform/modules/happy-dns-ecs": "1.5.0", "terraform/modules/happy-env-ecs": "3.3.0", "terraform/modules/happy-env-eks": "4.12.2", "terraform/modules/happy-github-ci-role": "1.5.0", "terraform/modules/happy-route53": "1.3.0", "terraform/modules/happy-service-ecs": "2.1.0", - "terraform/modules/happy-service-eks": "3.17.2", - "terraform/modules/happy-stack-ecs": "2.1.0", - "terraform/modules/happy-stack-eks": "4.19.0", + "terraform/modules/happy-service-eks": "3.19.0", + "terraform/modules/happy-stack-ecs": "2.2.0", + "terraform/modules/happy-stack-eks": "4.23.0", "terraform/modules/happy-tfe-okta-app": "3.0.0", "terraform/modules/happy-tfe-user": "1.3.0", - "terraform/modules/happy-ingress-eks": "2.9.0", - "hvm": "0.113.1", + "terraform/modules/happy-ingress-eks": "2.10.0", + "hvm": "0.115.1", "hapi-proto": "0.1.0", - "terraform/modules/happy-cloudfront": "1.0.0", + "terraform/modules/happy-cloudfront": "1.1.0", "helm-charts/charts/stack": "0.1.0" } diff --git a/api/CHANGELOG.md b/api/CHANGELOG.md index a6be65c484..0cc17f3345 100644 --- a/api/CHANGELOG.md +++ b/api/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## [0.115.1](https://github.com/chanzuckerberg/happy/compare/api-v0.115.0...api-v0.115.1) (2023-11-02) + + +### Miscellaneous Chores + +* **api:** Synchronize happy platform versions + +## [0.115.0](https://github.com/chanzuckerberg/happy/compare/api-v0.114.1...api-v0.115.0) (2023-10-31) + + +### Miscellaneous Chores + +* **api:** Synchronize happy platform versions + +## [0.114.1](https://github.com/chanzuckerberg/happy/compare/api-v0.114.0...api-v0.114.1) (2023-10-26) + + +### Bug Fixes + +* Fix default tags generated by happy infra generate ([#2645](https://github.com/chanzuckerberg/happy/issues/2645)) ([d8b2646](https://github.com/chanzuckerberg/happy/commit/d8b2646c5e0a6b5dac49b2037955d9a1cb82b0e8)) + +## [0.114.0](https://github.com/chanzuckerberg/happy/compare/api-v0.113.1...api-v0.114.0) (2023-10-24) + + +### Miscellaneous Chores + +* **api:** Synchronize happy platform versions + ## [0.113.1](https://github.com/chanzuckerberg/happy/compare/api-v0.113.0...api-v0.113.1) (2023-10-18) diff --git a/api/go.mod b/api/go.mod index 924a8fc9d7..4ad7de45ac 100644 --- a/api/go.mod +++ b/api/go.mod @@ -5,27 +5,27 @@ go 1.20 require ( entgo.io/contrib v0.3.5 entgo.io/ent v0.12.4 - github.com/aws/aws-sdk-go-v2 v1.21.2 + github.com/aws/aws-sdk-go-v2 v1.22.2 github.com/aws/aws-sdk-go-v2/config v1.18.44 github.com/blang/semver v3.5.1+incompatible github.com/chanzuckerberg/happy/shared v0.0.0 - github.com/coreos/go-oidc/v3 v3.6.0 + github.com/coreos/go-oidc/v3 v3.7.0 github.com/getsentry/sentry-go v0.25.0 github.com/getsentry/sentry-go/otel v0.25.0 github.com/go-faster/errors v0.6.1 github.com/go-faster/jx v1.1.0 github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 - github.com/go-playground/validator/v10 v10.15.5 + github.com/go-playground/validator/v10 v10.16.0 github.com/gofiber/contrib/fibersentry v1.0.4 github.com/gofiber/fiber/v2 v2.49.2 github.com/gofiber/swagger v0.1.13 github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/google/uuid v1.3.1 + github.com/google/uuid v1.4.0 github.com/hashicorp/go-multierror v1.1.1 github.com/hetiansu5/urlquery v1.2.7 github.com/lib/pq v1.10.9 - github.com/mattn/go-sqlite3 v1.14.17 + github.com/mattn/go-sqlite3 v1.14.18 github.com/mitchellh/mapstructure v1.5.0 github.com/ogen-go/ogen v0.76.0 github.com/pkg/errors v0.9.1 @@ -46,7 +46,7 @@ require ( require ( ariga.io/atlas v0.14.1-0.20230918065911-83ad451a4935 // indirect - cirello.io/dynamolock/v2 v2.0.2 // indirect + cirello.io/dynamolock/v2 v2.0.3 // indirect github.com/AlecAivazis/survey/v2 v2.3.7 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/KyleBanks/depth v1.2.1 // indirect @@ -56,35 +56,35 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 // indirect + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 // indirect + github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 // indirect + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect - github.com/aws/smithy-go v1.15.0 // indirect + github.com/aws/smithy-go v1.16.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/creasty/defaults v1.7.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dlclark/regexp2 v1.10.0 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.6+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -112,12 +112,12 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-slug v0.12.2 // indirect - github.com/hashicorp/go-tfe v1.36.0 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/go-slug v0.13.2 // indirect + github.com/hashicorp/go-tfe v1.39.2 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/hashicorp/hcl/v2 v2.19.1 // indirect github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d // indirect github.com/hashicorp/terraform-config-inspect v0.0.0-20230522202058-dbe9bfcbfe7a // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -167,7 +167,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/src-d/gcfg v1.4.0 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect @@ -183,14 +183,14 @@ require ( golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/sys v0.14.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/time v0.4.0 // indirect golang.org/x/tools v0.13.0 // indirect - google.golang.org/appengine v1.6.7 // indirect + google.golang.org/appengine v1.6.8 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -199,12 +199,12 @@ require ( gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gotest.tools/v3 v3.4.0 // indirect - k8s.io/api v0.28.2 // indirect - k8s.io/apimachinery v0.28.2 // indirect - k8s.io/client-go v0.28.2 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/apimachinery v0.28.3 // indirect + k8s.io/client-go v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect - k8s.io/kubectl v0.28.2 // indirect + k8s.io/kubectl v0.28.3 // indirect k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect diff --git a/api/go.sum b/api/go.sum index 701e8d36ad..3b8299ead4 100644 --- a/api/go.sum +++ b/api/go.sum @@ -1,7 +1,7 @@ ariga.io/atlas v0.14.1-0.20230918065911-83ad451a4935 h1:JnYs/y8RJ3+MiIUp+3RgyyeO48VHLAZimqiaZYnMKk8= ariga.io/atlas v0.14.1-0.20230918065911-83ad451a4935/go.mod h1:isZrlzJ5cpoCoKFoY9knZug7Lq4pP1cm8g3XciLZ0Pw= -cirello.io/dynamolock/v2 v2.0.2 h1:4AEs4218aQLB9NfMMc/B9nmPrZZkrDNZXOgMUC0l/As= -cirello.io/dynamolock/v2 v2.0.2/go.mod h1:kC31fXt8CEX0colxFT/4r9RRKfhZLG0PFrJJXM5A24w= +cirello.io/dynamolock/v2 v2.0.3 h1:1v6BSRa3ov/ytEX8hFtY9yMstFQEnMsj9s8+jCXFDxg= +cirello.io/dynamolock/v2 v2.0.3/go.mod h1:0GKOMMD//uxSPfZk/uxgquAI7C5FvGI5AL8B6cEVvLE= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -74,95 +74,73 @@ github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= -github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= +github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.19/go.mod h1:sMgThC49I+7ud4V7stUsJwaaM6W/KYxRHl2A5pZDrE4= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 h1:/+Z/dCO+1QHOlCm7m9G61snvIaDRUTv/HXp+8HdESiY= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25/go.mod h1:JQ0HJ+3LaAKHx3uwRUAfR/tb/gOlgAGPT6mZfIq55Ec= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.46/go.mod h1:A52W+4f5wSS/TnYTFln9ngTi6Ho1IdJKSAEcvrmfYYc= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 h1:lVqqyVoBUy7Kp2sOo9xJtC37FafV2sDtee9qpC5bm3w= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52/go.mod h1:+wabPhA5NvnAA/VSQAHIlfvdDn0nnA7P3S5Lc0Q5UiQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 h1:jlR1Rwjb3z5d1p0sqhNcuCaqdp73H+1O/X8Lc2kBDrY= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43/go.mod h1:X1HGecFASboCkBt1GJRM4a/FDYYogu9AciUoXVsbr4U= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 h1:nLwQrLSBpcZq3MtpTUcpBqPwKL5V/uO/iuYMU+STv68= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71/go.mod h1:Vjebi0MUXOcsV9YCE2Jxqrqq3FchwyIMbaIzm5NmrKw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 h1:NL2HEgcchk/QTa9/8GgrZvmfvCwqCDknvzAOMuvANnU= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1/go.mod h1:ZD/6Xew+gqhnRBg9iRXNYZOhp4BXKfqe7JRrtOnIh8s= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.2/go.mod h1:KdM++ikeFLtf0RX0WHUdF/nugF8uUntGmJS3Ywo7lVo= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.7/go.mod h1:1MNss6sqoIsFGisX92do/5doiUCBrN7EjhZCS/8DUjI= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 h1:TYq4EU2vEEluoaBG0RCPnbibSndTQSzlpbZdmT/YRcs= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1/go.mod h1:1EJb9/tJwI7iqiStZBcmHijQxcgp7dlPuD2YgoZIrJQ= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.7/go.mod h1:eRmcVwDpfeYgamYv+57cqM9hMWw+/TOqwGsbm39JHgc= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 h1:WHi9VKMYGtWt2DzqeYHXzt55aflymO2EZ6axuKla8oU= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11/go.mod h1:pP+91QTpJMvcFTqGky6puHrkBs8oqoB3XOCiGRDaXwI= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 h1:XnUTMYuPGOrQjlTcf9XoRYBLrN7xjzakkK0+QyP8fO0= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 h1:Y2zGozmCogCCQbO2fplC6tZylBTBBgt/2EcdVRRK5go= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1/go.mod h1:J9goPpIjXafA1u3XGJeoHu9WlMp5qAGwWmS1A8LfZVw= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 h1:bOS7hAfvd8+glVAG88WnvRITe5N1vopGFHh10ORe/BI= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1/go.mod h1:cxbA26Kf4UlTb40f5FON22ZPNMyEVmMS82KUJZC1E1w= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 h1:cZhJzuUYDqWEx5aWUeYEK8z0a51o5JV+uAWBpp5zArA= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6/go.mod h1:tQn6wLs+/9umB4Xj1z4RW+EMLWxPxs6ajfM5UcUlhnI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 h1:g2t+hNCOYWICWs0cQLXk86DnXQMXgx1omrAGEpF/d68= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2/go.mod h1:5ngOUsc/7/voqXQ5Mn5T5l9/rWopTMgu7hk+4Fl2AS4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.23.0/go.mod h1:1HkLh8vaL4obF95fne7ZOu7sxomS/+vkBt3/+gqqwE4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 h1:wAG9NailFhGhg8Ngg2YeCtzGmFWc63SYqJKdvN5ZMkE= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0/go.mod h1:ByrosnNlEq6xkA0d+FwB4f0HH/5KWCcgBqVxAt+Rsps= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 h1:WCeS9WZbIqEKCbgIkrHB5jw/9mO2QMYTLPF8wee3v4Y= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7/go.mod h1:uT1paW42RVCVEoAEbWKu98gEI0GMBWUsT/H+pI4ODJQ= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 h1:JCUTmTs7W1yvUCOdONMX7Hjgn7N9pj57y4/ibU4KFp4= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 h1:TA2V0OLAwEooOnCk2ZBgxTPAtb20Fgbkr7IrI/YxbAg= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0/go.mod h1:/1jvJouA9LvRdzQmTFwlvf3RKFXQz3jgL4AcPuaaoO8= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 h1:PH9chTOUwd0PPUEwunePjUYp6QD0KsZvDcUy6VToKVQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0/go.mod h1:4HwGjM2Z7cMaLV1ddXhKeI1o+hRJhp7A0WnvcgjWyRI= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 h1:d6WbsOHHsEMryKLc9oYCmvu4lrV9z9QLSQ5S44KSn0o= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0/go.mod h1:Nt5l6Vn68Hv0JWJ6dcQDKuBAKAfHUZSC9Ln8X/1fUMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.25/go.mod h1:zrjXfehNxd4la9SByaw7KQk4AmGkdmeASpOJezwed0g= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.27/go.mod h1:DfuVY36ixXnsG+uTqnoLWunXAKJ4qjccoFrXUPpj+hs= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 h1:0ZzowXTZABVqnJnwDMlTDP3eeEkuP1r6RYnhSBmgK2o= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36/go.mod h1:zAE5h/4VanzBpqyWoCZX/nJImdsqjjsGt2r3MtbKSFA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.37/go.mod h1:7xBUZyP6LeLc+5Ym9PG7atqw4sR28sBtYcHETik+bPE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 h1:aY45T0Xk+xHHrQPlQrp8IhrgN7k4SL5VF2UXhsmI2rs= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1/go.mod h1:5E/dXkj2ljMIAvuYaFuYwitKJg6ULwsDbUr3g8izVB0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 h1:z9faFYBvadv9HdY+oFBgxqCnew9TK+jp9ccxktB5fl4= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0/go.mod h1:Z6Oq1mXqvgwmUxvMrV/jMkQhwm06A9XO015dzGnS8TM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 h1:NMZiW2pbSW/PFCGT/J6R/8xaiFsF/SDdRN49q0NUhA8= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 h1:xK86ln1cEDa0cUpLaCbFFX/BABPw4ognfzpGfbF4PkY= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1/go.mod h1:eqTdeirkcyBiDviU/N1JMcImS9zEJDn5wOzX3BsU4wU= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 h1:DHZFzwbFXlfw15I0ERlTVB/YH9iHNr2C1axjRpB7/Gg= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= +github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= @@ -177,10 +155,10 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/coreos/go-oidc/v3 v3.6.0 h1:AKVxfYw1Gmkn/w96z0DbT/B/xFnzTd3MkZvWLjF4n/o= -github.com/coreos/go-oidc/v3 v3.6.0/go.mod h1:ZpHUsHBucTUj6WOkrP4E20UPynbLZzhTQ1XKCXkxyPc= +github.com/coreos/go-oidc/v3 v3.7.0 h1:FTdj0uexT4diYIPlF4yoFVI5MRO1r5+SEcIpEw9vC0o= +github.com/coreos/go-oidc/v3 v3.7.0/go.mod h1:yQzSCqBnK3e6Fs5l+f5i0F8Kwf0zpH9bPEsbY00KanM= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -195,8 +173,8 @@ github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -271,8 +249,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= -github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/gofiber/contrib/fibersentry v1.0.4 h1:RjmWbv3iU9D9ApWig/5QGHX+8xqD3qZhzcQlTPBMW0w= @@ -314,6 +292,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -354,8 +333,9 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -369,12 +349,12 @@ github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrj github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-slug v0.12.2 h1:Gb6nxnV5GI1UVa3aLJGUj66J8AOZFnjIoYalNCp2Cbo= -github.com/hashicorp/go-slug v0.12.2/go.mod h1:JZVtycnZZbiJ4oxpJ/zfhyfBD8XxT4f0uOSyjNLCqFY= -github.com/hashicorp/go-tfe v1.36.0 h1:Wq73gjjDo/f9gkKQ5MVSb+4NNJ6T7c5MVTivA0s/bZ0= -github.com/hashicorp/go-tfe v1.36.0/go.mod h1:awOuTZ4K9F1EJsKBIoxonJlb7Axn3PIb8YeBLtm/G/0= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-slug v0.13.2 h1:ArlarJ8w1Rinx4P1N6Sr00t+GmjJWtYZuSEDYPQBErA= +github.com/hashicorp/go-slug v0.13.2/go.mod h1:RA4C+ezyC2nDsiPM5+1djqagveBBJdSN/fM2QCUziYQ= +github.com/hashicorp/go-tfe v1.39.2 h1:2RrFa6UWEJghQVl248Avd9TJE+ii3NqDD75jBEcr/Tg= +github.com/hashicorp/go-tfe v1.39.2/go.mod h1:pc7+wHCH26BaoFP5txiKkM7Coi5PmB9VwNfnnT2XpKE= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -382,8 +362,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= -github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d h1:9ARUJJ1VVynB176G1HCwleORqCaXm/Vx0uUi0dL26I0= github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d/go.mod h1:Yog5+CPEM3c99L1CL2CFCYoSzgWm5vTU58idbRUaLik= github.com/hashicorp/terraform-config-inspect v0.0.0-20230522202058-dbe9bfcbfe7a h1:zKVsrHhIOWiXHYqFrOXfHacOOVDMYv+v/Wx8DUeyySs= @@ -467,8 +447,8 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= -github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -552,8 +532,8 @@ github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= @@ -729,8 +709,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -744,8 +724,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -799,8 +779,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -816,6 +796,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -825,8 +806,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -913,8 +894,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1021,18 +1003,18 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= -k8s.io/kubectl v0.28.2 h1:fOWOtU6S0smdNjG1PB9WFbqEIMlkzU5ahyHkc7ESHgM= -k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64= +k8s.io/kubectl v0.28.3 h1:H1Peu1O3EbN9zHkJCcvhiJ4NUj6lb88sGPO5wrWIM6k= +k8s.io/kubectl v0.28.3/go.mod h1:RDAudrth/2wQ3Sg46fbKKl4/g+XImzvbsSRZdP2RiyE= k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/api/pkg/api/app_fiber.go b/api/pkg/api/app_fiber.go index ecea1869ea..0a007d9c63 100644 --- a/api/pkg/api/app_fiber.go +++ b/api/pkg/api/app_fiber.go @@ -2,6 +2,7 @@ package api import ( "context" + "fmt" "time" "github.com/chanzuckerberg/happy/api/pkg/cmd" @@ -78,7 +79,7 @@ func MakeAppWithDB(ctx context.Context, cfg *setup.Configuration, db *store.DB) user := sentry.User{} oidcValues := c.Locals(request.OIDCAuthKey{}) if oidcValues != nil { - oidcValues := oidcValues.(request.OIDCAuthValues) + oidcValues := oidcValues.(*request.OIDCAuthValues) if len(oidcValues.Email) > 0 { user.Email = oidcValues.Email } @@ -123,6 +124,6 @@ func (a *APIApplication) configureLogger(cfg setup.ApiConfiguration) { })) } -// func (a *APIApplication) Listen() error { -// return a.FiberApp.Listen(fmt.Sprintf(":%d", a.Cfg.Api.Port)) -// } +func (a *APIApplication) Listen() error { + return a.FiberApp.Listen(fmt.Sprintf(":%d", a.Cfg.Api.Port)) +} diff --git a/api/pkg/api/app_test.go b/api/pkg/api/app_test.go index a73cfb79f3..5e76abd56a 100644 --- a/api/pkg/api/app_test.go +++ b/api/pkg/api/app_test.go @@ -108,7 +108,7 @@ func TestVersionCheckFail(t *testing.T) { { // unrestricted client without a version userAgent: "happy-cli", - errorMessage: "expected version so be specified for happy-cli in the User-Agent header (format: happy-cli/)", + errorMessage: "expected version to be specified for happy-cli in the User-Agent header (format: happy-cli/)", }, } diff --git a/api/pkg/cmd/config.go b/api/pkg/cmd/config.go index eb6fb43006..5dea27907d 100644 --- a/api/pkg/cmd/config.go +++ b/api/pkg/cmd/config.go @@ -35,6 +35,9 @@ func MakeConfig(db *store.DB) Config { } func MakeAppConfigFromEnt(in *ent.AppConfig) *model.AppConfig { + if in == nil { + return nil + } deletedAt := gorm.DeletedAt{ Valid: false, } @@ -157,6 +160,9 @@ func (c *dbConfig) GetResolvedAppConfig(payload *model.AppConfigLookupPayload) ( if err != nil { return nil, err } + if record == nil { + return nil, nil + } return &model.ResolvedAppConfig{AppConfig: *MakeAppConfigFromEnt(record), Source: record.Source.String()}, nil } diff --git a/api/pkg/request/auth_test.go b/api/pkg/request/auth_test.go index 16fa34b7d0..df05170ea8 100644 --- a/api/pkg/request/auth_test.go +++ b/api/pkg/request/auth_test.go @@ -130,9 +130,8 @@ func TestGithubProvider(t *testing.T) { // it was at one point but has been expired // I am using it as a test so that I can make sure that we parse Github ID tokens properly // please don't yell at me :D - tokens := []string{ - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImVCWl9jbjNzWFlBZDBjaDRUSEJLSElnT3dPRSIsImtpZCI6Ijc4MTY3RjcyN0RFQzVEODAxREQxQzg3ODRDNzA0QTFDODgwRUMwRTEifQ.eyJqdGkiOiJlMDQ4ODBjZi1iZDFlLTQ5YmUtYjVkZi03MzNkOTEzZTljNWEiLCJzdWIiOiJyZXBvOmNoYW56dWNrZXJiZXJnL3NjcnVmZnk6cmVmOnJlZnMvaGVhZHMvaGVhdGhqL3ZpZXctaWQtdG9rZW4iLCJhdWQiOiJoYXBpLmhhcGkucHJvZC5zaS5jemkudGVjaG5vbG9neSIsInJlZiI6InJlZnMvaGVhZHMvaGVhdGhqL3ZpZXctaWQtdG9rZW4iLCJzaGEiOiIwNzVmMWVmMDdkMjA2NGU0MmFjMzM1N2FhNDIyOTA2OWMwYTRiOTUwIiwicmVwb3NpdG9yeSI6ImNoYW56dWNrZXJiZXJnL3NjcnVmZnkiLCJyZXBvc2l0b3J5X293bmVyIjoiY2hhbnp1Y2tlcmJlcmciLCJyZXBvc2l0b3J5X293bmVyX2lkIjoiMTk5MTcyOTkiLCJydW5faWQiOiI2MDE3NzkyMjAxIiwicnVuX251bWJlciI6IjMiLCJydW5fYXR0ZW1wdCI6IjEiLCJyZXBvc2l0b3J5X3Zpc2liaWxpdHkiOiJpbnRlcm5hbCIsInJlcG9zaXRvcnlfaWQiOiI2Njc2MDA5MTYiLCJhY3Rvcl9pZCI6Ijc2MDExOTEzIiwiYWN0b3IiOiJqYWtleWhlYXRoIiwid29ya2Zsb3ciOiJQcmludCBJRCB0b2tlbiIsImhlYWRfcmVmIjoiIiwiYmFzZV9yZWYiOiIiLCJldmVudF9uYW1lIjoicHVzaCIsInJlZl9wcm90ZWN0ZWQiOiJmYWxzZSIsInJlZl90eXBlIjoiYnJhbmNoIiwid29ya2Zsb3dfcmVmIjoiY2hhbnp1Y2tlcmJlcmcvc2NydWZmeS8uZ2l0aHViL3dvcmtmbG93cy9wcmludC1pZC10b2tlbi55bWxAcmVmcy9oZWFkcy9oZWF0aGovdmlldy1pZC10b2tlbiIsIndvcmtmbG93X3NoYSI6IjA3NWYxZWYwN2QyMDY0ZTQyYWMzMzU3YWE0MjI5MDY5YzBhNGI5NTAiLCJqb2Jfd29ya2Zsb3dfcmVmIjoiY2hhbnp1Y2tlcmJlcmcvc2NydWZmeS8uZ2l0aHViL3dvcmtmbG93cy9wcmludC1pZC10b2tlbi55bWxAcmVmcy9oZWFkcy9oZWF0aGovdmlldy1pZC10b2tlbiIsImpvYl93b3JrZmxvd19zaGEiOiIwNzVmMWVmMDdkMjA2NGU0MmFjMzM1N2FhNDIyOTA2OWMwYTRiOTUwIiwicnVubmVyX2Vudmlyb25tZW50Ijoic2VsZi1ob3N0ZWQiLCJlbnRlcnByaXNlIjoiY2hhbi16dWNrZXJiZXJnLWluaXRpYXRpdmUiLCJpc3MiOiJodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwibmJmIjoxNjkzMzQ0NDAxLCJleHAiOjE2OTMzNDUzMDEsImlhdCI6MTY5MzM0NTAwMX0.IMZS-RwF4hL7ZXGIhjsAiP9v4s92mjYKv75feo0VZoN-5oQIp88cJRDEZvJmU-2pY5ZC5i_zxvPg-4DOlR936ZQss_8yMr9zayZsHG9bN-iP4H8_lvuaPdvUAJpCQNQj8AFYAMUOLP7lbHYlXFzfWgqzXCGmcZ-k6gMdHJBOSpkeIHoFsGg0VzmV9KeInwTKJE95ASrfxelXuOEcBjfeyF3tHAng7XXBx1Ls4v0xTZlbvhMqIcCZsCd-B5sQZF3yz2wP_84NAS_zf6E8QxoAs7VaEyG9uvJZwpEqN_1F3IBXJvjfbNmzo0Cun0BskxuSulOm6fBi2srzvqe8ICC3Xw", - } + // TODO: Get qa new token + tokens := []string{} for _, token := range tokens { idToken, err := verifier.Verify(context.Background(), token) diff --git a/api/pkg/request/version_check_handler.go b/api/pkg/request/version_check_handler.go index ce22bb021c..c9b1aaadf3 100644 --- a/api/pkg/request/version_check_handler.go +++ b/api/pkg/request/version_check_handler.go @@ -14,7 +14,7 @@ var ( func init() { MinimumVersions = map[string]string{ - "happy-cli": "0.53.6", + "happy-cli": "0.90.0", "happy-provider": "0.52.0", } @@ -50,7 +50,7 @@ func validateUserAgentVersion(userAgent string) error { } if len(clientVersionParts) < 2 { - return errors.Errorf("expected version so be specified for %s in the User-Agent header (format: %s/)", client, client) + return errors.Errorf("expected version to be specified for %s in the User-Agent header (format: %s/)", client, client) } versionStr := clientVersionParts[1] diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index 6f8f6a96bd..42147df1ab 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -1,5 +1,39 @@ # Changelog +## [0.115.1](https://github.com/chanzuckerberg/happy/compare/cli-v0.115.0...cli-v0.115.1) (2023-11-02) + + +### Miscellaneous Chores + +* **cli:** Synchronize happy platform versions + +## [0.115.0](https://github.com/chanzuckerberg/happy/compare/cli-v0.114.1...cli-v0.115.0) (2023-10-31) + + +### Features + +* Delete prior ECR images after a stack update ([#2637](https://github.com/chanzuckerberg/happy/issues/2637)) ([ac157f9](https://github.com/chanzuckerberg/happy/commit/ac157f9447eb54ba7f58119c3690bfa08902d637)) + +## [0.114.1](https://github.com/chanzuckerberg/happy/compare/cli-v0.114.0...cli-v0.114.1) (2023-10-26) + + +### Bug Fixes + +* Docker compose validation misfires for containers that need to be built, but are not listed as services ([#2636](https://github.com/chanzuckerberg/happy/issues/2636)) ([f2065cd](https://github.com/chanzuckerberg/happy/commit/f2065cd5ec54bc19d4f1bd93e502459efe2c1bdc)) +* not logging in with pushwithtag ([#2643](https://github.com/chanzuckerberg/happy/issues/2643)) ([a3c467d](https://github.com/chanzuckerberg/happy/commit/a3c467d01aa6aa880b9b66067b8e58c7e198d7e7)) + +## [0.114.0](https://github.com/chanzuckerberg/happy/compare/cli-v0.113.1...cli-v0.114.0) (2023-10-24) + + +### Features + +* fixed batch delete happy stack ([#2613](https://github.com/chanzuckerberg/happy/issues/2613)) ([21f927b](https://github.com/chanzuckerberg/happy/commit/21f927b9ac095bb2645b6e2a51d914cbfe1a265c)) + + +### Bug Fixes + +* sync go versions ([#2635](https://github.com/chanzuckerberg/happy/issues/2635)) ([e479c13](https://github.com/chanzuckerberg/happy/commit/e479c136a1f2cf83b4e6b430097e74d5512f31ee)) + ## [0.113.1](https://github.com/chanzuckerberg/happy/compare/cli-v0.113.0...cli-v0.113.1) (2023-10-18) diff --git a/cli/COVERAGE b/cli/COVERAGE index 56664f9c2b..d41beff24b 100644 --- a/cli/COVERAGE +++ b/cli/COVERAGE @@ -1 +1 @@ -22.97 \ No newline at end of file +22.19 \ No newline at end of file diff --git a/cli/cmd/COVERAGE b/cli/cmd/COVERAGE index 021bd571a2..ae27ab17be 100644 --- a/cli/cmd/COVERAGE +++ b/cli/cmd/COVERAGE @@ -1 +1 @@ -11.8 \ No newline at end of file +11.7 \ No newline at end of file diff --git a/cli/cmd/delete.go b/cli/cmd/delete.go index c575d3b20c..e802e52721 100644 --- a/cli/cmd/delete.go +++ b/cli/cmd/delete.go @@ -32,7 +32,16 @@ var deleteCmd = &cobra.Command{ Short: "Delete an existing stack", Long: "Delete the stack with the given name.", SilenceUsage: true, - RunE: runDelete, + RunE: func(cmd *cobra.Command, args []string) error { + for _, stackName := range args { + log.Infof("Deleting Happy Stack %s\n", stackName) + if err := runDelete(cmd, stackName); err != nil { + log.Errorf("Unable to delete Happy Stack %s: %s", stackName, err.Error()) + continue + } + } + return nil + }, PreRunE: happyCmd.Validate( cobra.MinimumNArgs(1), happyCmd.IsStackNameDNSCharset, @@ -46,115 +55,112 @@ var deleteCmd = &cobra.Command{ ), } -func runDelete(cmd *cobra.Command, args []string) error { - for _, stackName := range args { - happyClient, err := makeHappyClient(cmd, sliceName, stackName, []string{tag}, createTag) - if err != nil { - return errors.Wrap(err, "unable to initialize the happy client") - } - ctx := context.WithValue(cmd.Context(), options.DryRunKey, dryRun) - message := workspace_repo.Message(fmt.Sprintf("Happy %s Delete Stack [%s]", util.GetVersion().Version, stackName)) - err = validate( - validateGitTree(happyClient.HappyConfig.GetProjectRoot()), - validateStackNameAvailable(ctx, happyClient.StackService, stackName, force), - validateStackExists(ctx, stackName, happyClient, message), - validateTFEBackLog(ctx, happyClient.AWSBackend), - ) - if err != nil { - log.Warnf("failed one of the happy client validations %s", err.Error()) - continue - } - - stacks, err := happyClient.StackService.GetStacks(ctx) - if err != nil { - return err - } - - stack, ok := stacks[stackName] - if !ok { - return errors.Wrapf(err, "stack %s not found", stackName) - } - - // Run all necessary tasks before deletion - taskOrchestrator := orchestrator. - NewOrchestrator(). - WithHappyConfig(happyClient.HappyConfig). - WithBackend(happyClient.AWSBackend) - err = taskOrchestrator.RunTasks(ctx, stack, backend.TaskTypeDelete) - if err != nil { - if !force { - if !diagnostics.IsInteractiveContext(ctx) { - return err - } - proceed := false - prompt := &survey.Confirm{ - Message: fmt.Sprintf("Error running tasks while trying to delete %s (%s); Continue? ", stackName, err.Error()), - } - err = survey.AskOne(prompt, &proceed) - if err != nil { - return errors.Wrapf(err, "failed to ask for confirmation") - } - if !proceed { - return err - } - } - } - - hasState, err := happyClient.StackService.HasState(ctx, stackName) - if err != nil { - return errors.Wrapf(err, "unable to determine whether the stack has state") - } - - runopts := workspace_repo.Message(fmt.Sprintf("Happy %s Delete Stack [%s]", util.GetVersion().Version, stackName)) - if !hasState { - log.Info("No state found for stack, workspace will be removed") - return happyClient.StackService.Remove(ctx, stackName, runopts) - } +func runDelete(cmd *cobra.Command, stackName string) error { + happyClient, err := makeHappyClient(cmd, sliceName, stackName, []string{tag}, createTag) + if err != nil { + return errors.Wrap(err, "unable to initialize the happy client") + } + ctx := context.WithValue(cmd.Context(), options.DryRunKey, dryRun) + message := workspace_repo.Message(fmt.Sprintf("Happy %s Delete Stack [%s]", util.GetVersion().Version, stackName)) + err = validate( + validateGitTree(happyClient.HappyConfig.GetProjectRoot()), + validateStackNameAvailable(ctx, happyClient.StackService, stackName, force), + validateStackExists(ctx, stackName, happyClient, message), + validateTFEBackLog(ctx, happyClient.AWSBackend), + ) + if err != nil { + log.Warnf("failed one of the happy client validations %s", err.Error()) + return err + } - // Destroy the stack - destroySuccess := true - waitopts := options.WaitOptions{ - StackName: stackName, - Orchestrator: taskOrchestrator, - Services: happyClient.HappyConfig.GetServices(), - } + stacks, err := happyClient.StackService.GetStacks(ctx) + if err != nil { + return err + } - tfDirPath := happyClient.HappyConfig.TerraformDirectory() - happyProjectRoot := happyClient.HappyConfig.GetProjectRoot() - srcDir := filepath.Join(happyProjectRoot, tfDirPath) - if err = stack.Destroy(ctx, srcDir, waitopts, runopts); err != nil { - // log error and set a flag, but do not return - log.Errorf("Failed to destroy stack: '%s'", err) - destroySuccess = false - } + stack, ok := stacks[stackName] + if !ok { + return errors.Wrapf(err, "stack %s not found", stackName) + } - doRemoveWorkspace := false - if !destroySuccess { + // Run all necessary tasks before deletion + taskOrchestrator := orchestrator. + NewOrchestrator(). + WithHappyConfig(happyClient.HappyConfig). + WithBackend(happyClient.AWSBackend) + err = taskOrchestrator.RunTasks(ctx, stack, backend.TaskTypeDelete) + if err != nil { + if !force { if !diagnostics.IsInteractiveContext(ctx) { - return errors.Errorf("Error while destroying %s; resources might remain, aborting workspace removal in non-interactive mode.", stackName) + return err } - proceed := false - prompt := &survey.Confirm{Message: fmt.Sprintf("Error while destroying %s; resources might remain. Continue to remove workspace? ", stackName)} + prompt := &survey.Confirm{ + Message: fmt.Sprintf("Error running tasks while trying to delete %s (%s); Continue? ", stackName, err.Error()), + } err = survey.AskOne(prompt, &proceed) if err != nil { return errors.Wrapf(err, "failed to ask for confirmation") } - if !proceed { return err } + } + } + + hasState, err := happyClient.StackService.HasState(ctx, stackName) + if err != nil { + return errors.Wrapf(err, "unable to determine whether the stack has state") + } + + runopts := workspace_repo.Message(fmt.Sprintf("Happy %s Delete Stack [%s]", util.GetVersion().Version, stackName)) + if !hasState { + log.Info("No state found for stack, workspace will be removed") + return happyClient.StackService.Remove(ctx, stackName, runopts) + } + + // Destroy the stack + destroySuccess := true + waitopts := options.WaitOptions{ + StackName: stackName, + Orchestrator: taskOrchestrator, + Services: happyClient.HappyConfig.GetServices(), + } + + tfDirPath := happyClient.HappyConfig.TerraformDirectory() + happyProjectRoot := happyClient.HappyConfig.GetProjectRoot() + srcDir := filepath.Join(happyProjectRoot, tfDirPath) + if err = stack.Destroy(ctx, srcDir, waitopts, runopts); err != nil { + // log error and set a flag, but do not return + log.Errorf("Failed to destroy stack: '%s'", err) + destroySuccess = false + } + + doRemoveWorkspace := false + if !destroySuccess { + if !diagnostics.IsInteractiveContext(ctx) { + return errors.Errorf("Error while destroying %s; resources might remain, aborting workspace removal in non-interactive mode.", stackName) + } - doRemoveWorkspace = true + proceed := false + prompt := &survey.Confirm{Message: fmt.Sprintf("Error while destroying %s; resources might remain. Continue to remove workspace? ", stackName)} + err = survey.AskOne(prompt, &proceed) + if err != nil { + return errors.Wrapf(err, "failed to ask for confirmation") } - // Remove the stack from state - // TODO: are these the right error messages? - if destroySuccess || doRemoveWorkspace { - return happyClient.StackService.Remove(ctx, stackName, runopts) - } else { - log.Warnf("Stack %s was not deleted fully", stackName) + if !proceed { + return err } + + doRemoveWorkspace = true + } + + // Remove the stack from state + // TODO: are these the right error messages? + if destroySuccess || doRemoveWorkspace { + return happyClient.StackService.Remove(ctx, stackName, runopts) } + log.Warnf("Stack %s was not deleted fully", stackName) return nil } diff --git a/cli/cmd/init.go b/cli/cmd/init.go index 856423e5d1..2c5f954f2f 100644 --- a/cli/cmd/init.go +++ b/cli/cmd/init.go @@ -301,49 +301,50 @@ func validateConfigurationIntegirty(ctx context.Context, slice string, happyClie logrus.Debug("Scheduling validateConfigurationIntegirty()") return func() error { logrus.Debug("Running validateConfigurationIntegirty()") - // These services are configured in docker-compose.yml, and have their containers built - availableServices, err := happyClient.ArtifactBuilder.GetServices(ctx) + + // Happy configuration is spread across these files: + // * .happy/config.json defines environments, specifies services, slices, features and tasks + // * docker-compose.yml defines services and their build configuration + // * terraform code from .happy/terraform/envs//*.tf references services and their settings + + // All services referenced through TF code must be present in config.json. All services listed in config.json + // must be declared in docker-compose.yml and have a build section. + + // These services are configured in docker-compose.yml + composeServices, err := happyClient.ArtifactBuilder.GetAllServices(ctx) if err != nil { return errors.Wrap(err, "unable to get available services") } - // NOTE: availableServices will only contain the services that are a part of the slice. - // That means we have to iterate over those first to make sure they are all in the config.json and - // not the other way around. + // ConfigServices are configured in config.json, and are a subset of the services in docker-compose.yml. + // Every service from config.json must be present in docker-compose.yml and must have a build section. configServices := happyClient.HappyConfig.GetServices() ss := sets.NewStringSet().Add(configServices...) - for serviceName, service := range availableServices { - // ignore services that don't have a build section - // as these are not deployable services - if service.Build == nil { - continue - } - ok := ss.ContainsElement(serviceName) + for _, serviceName := range configServices { + service, ok := composeServices[serviceName] if !ok { - return errors.Errorf("service %s was referenced in docker-compose.yml, but not referenced in .happy/config.json services array", serviceName) + return errors.Errorf("service '%s' is not configured in docker-compose.yml, but referenced in your .happy/config.json services array", serviceName) + } + if service.Build == nil { + return errors.Errorf("service '%s' is not configured to be built in docker-compose.yml, but referenced in your .happy/config.json services array", serviceName) } } - // These services are referenced in terraform code for the environment + // These services are referenced in terraform code for the environment, and must be present in config.json + // (and docker-compose.yml as well -- see the check above). srcDir := filepath.Join(happyClient.HappyConfig.GetProjectRoot(), happyClient.HappyConfig.TerraformDirectory()) deployedServices, err := tf.NewTfParser().ParseServices(srcDir) if err != nil { return errors.Wrap(err, "unable to parse terraform code") } - for service := range deployedServices { - if _, ok := availableServices[service]; !ok { - return errors.Errorf("service %s is not configured in docker-compose.yml, but referenced in your terraform code", service) - } - found := false - for _, configuredService := range happyClient.HappyConfig.GetServices() { - if service == configuredService { - found = true - break - } + for serviceName := range deployedServices { + if _, ok := composeServices[serviceName]; !ok { + return errors.Errorf("service '%s' is not configured in docker-compose.yml, but referenced in your terraform code", serviceName) } + found := ss.ContainsElement(serviceName) if !found { - return errors.Errorf("service %s is not configured in ./happy/config.json, but referenced in your terraform code", service) + return errors.Errorf("service %s is not configured in ./happy/config.json, but referenced in your terraform code", serviceName) } } diff --git a/cli/cmd/tags.go b/cli/cmd/tags.go index c6a80deaee..76f29971de 100644 --- a/cli/cmd/tags.go +++ b/cli/cmd/tags.go @@ -24,7 +24,7 @@ func init() { } var tagsCmd = &cobra.Command{ - Use: "addtags", + Use: "addtags ", Short: "Add additional tags to already-pushed images in the ECR repo", Long: "Add additional tags to already-pushed images in the ECR repo", SilenceUsage: true, diff --git a/cli/cmd/update.go b/cli/cmd/update.go index 21550143b5..71e59e6778 100644 --- a/cli/cmd/update.go +++ b/cli/cmd/update.go @@ -125,6 +125,11 @@ func validateStackExists(ctx context.Context, stackName string, happyClient *Hap } func updateStack(ctx context.Context, cmd *cobra.Command, stack *stackservice.Stack, forceFlag bool, happyClient *HappyClient) error { + stackInfo, err := stack.GetStackInfo(ctx) + if err != nil { + return errors.Wrap(err, "unable to get stack info") + } + // 1.) update the workspace's meta variables stackMeta, err := updateStackMeta(ctx, stack.Name, happyClient) if err != nil { @@ -156,6 +161,22 @@ func updateStack(ctx context.Context, cmd *cobra.Command, stack *stackservice.St // 4.) print to stdout stack.PrintOutputs(ctx) + // Remove images with the previous tag from all ECRs, unless the previous tag is the same as the current tag + found := false + for _, tag := range happyClient.ArtifactBuilder.GetTags() { + if tag == stackInfo.StackMetadata.Tag { + found = true + break + } + } + + if !found { + err = happyClient.ArtifactBuilder.DeleteImages(ctx, stackInfo.StackMetadata.Tag) + if err != nil { + return errors.Wrap(err, "failed to delete images") + } + } + return nil } diff --git a/cli/go.mod b/cli/go.mod index e0a1dc97f0..e5b2826479 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -5,27 +5,27 @@ module github.com/chanzuckerberg/happy/cli require ( github.com/AlecAivazis/survey/v2 v2.3.7 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 - github.com/aws/aws-sdk-go-v2 v1.21.2 - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 - github.com/chanzuckerberg/go-misc v1.10.7 + github.com/aws/aws-sdk-go-v2 v1.22.2 + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.27.0 + github.com/chanzuckerberg/go-misc v1.10.11 github.com/chanzuckerberg/happy/shared v0.0.0 - github.com/fatih/color v1.15.0 + github.com/fatih/color v1.16.0 github.com/gen2brain/beeep v0.0.0-20230307103607-6e717729cb4f github.com/golang/mock v1.6.0 github.com/hashicorp/go-multierror v1.1.1 - github.com/hashicorp/go-tfe v1.36.0 + github.com/hashicorp/go-tfe v1.39.2 github.com/joho/godotenv v1.5.1 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.28.2 - k8s.io/apimachinery v0.28.2 + k8s.io/api v0.28.3 + k8s.io/apimachinery v0.28.3 ) require ( - cirello.io/dynamolock/v2 v2.0.2 // indirect + cirello.io/dynamolock/v2 v2.0.3 // indirect cloud.google.com/go v0.110.2 // indirect cloud.google.com/go/compute v1.20.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect @@ -35,31 +35,31 @@ require ( github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/aws/aws-sdk-go v1.45.12 // indirect + github.com/aws/aws-sdk-go v1.47.0 // indirect github.com/aws/aws-sdk-go-v2/config v1.18.44 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.42 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.14.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/compose-spec/compose-go v1.19.0 // indirect + github.com/compose-spec/compose-go v1.20.0 // indirect github.com/coreos/go-oidc v2.2.1+incompatible // indirect github.com/creasty/defaults v1.7.0 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/distribution/reference v0.5.0 // indirect - github.com/docker/docker v24.0.6+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect @@ -69,21 +69,21 @@ require ( github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-playground/validator/v10 v10.15.5 // indirect + github.com/go-playground/validator/v10 v10.16.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect github.com/googleapis/gax-go/v2 v2.11.0 // indirect github.com/hashicorp/go-getter v1.7.3 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/hashicorp/hcl/v2 v2.19.1 // indirect github.com/hashicorp/terraform-config-inspect v0.0.0-20230522202058-dbe9bfcbfe7a // indirect github.com/hetiansu5/urlquery v1.2.7 // indirect github.com/imdario/mergo v0.3.16 // indirect @@ -124,8 +124,8 @@ require ( go.opencensus.io v0.24.0 // indirect golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect golang.org/x/mod v0.11.0 // indirect - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sync v0.4.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.5.0 // indirect golang.org/x/tools v0.9.3 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.126.0 // indirect @@ -133,7 +133,7 @@ require ( google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.57.0 // indirect + google.golang.org/grpc v1.57.1 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect @@ -142,10 +142,10 @@ require ( gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gorm.io/gorm v1.25.5 // indirect - k8s.io/client-go v0.28.2 // indirect + k8s.io/client-go v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect - k8s.io/kubectl v0.28.2 // indirect + k8s.io/kubectl v0.28.3 // indirect k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect @@ -154,13 +154,13 @@ require ( require ( github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 - github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2 - github.com/aws/aws-sdk-go-v2/service/ecs v1.30.3 - github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 // indirect - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 // indirect - github.com/aws/smithy-go v1.15.0 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.132.0 + github.com/aws/aws-sdk-go-v2/service/ecr v1.22.1 + github.com/aws/aws-sdk-go-v2/service/ecs v1.32.1 + github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 // indirect + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 // indirect + github.com/aws/smithy-go v1.16.0 github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect @@ -172,15 +172,15 @@ require ( github.com/google/go-querystring v1.1.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect - github.com/hashicorp/go-slug v0.12.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/go-slug v0.13.2 // indirect github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/moby/term v0.5.0 // indirect @@ -193,10 +193,10 @@ require ( github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect golang.org/x/crypto v0.14.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/time v0.4.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/cli/go.sum b/cli/go.sum index 3f966e1283..3ffbc7d28c 100644 --- a/cli/go.sum +++ b/cli/go.sum @@ -1,5 +1,5 @@ -cirello.io/dynamolock/v2 v2.0.2 h1:4AEs4218aQLB9NfMMc/B9nmPrZZkrDNZXOgMUC0l/As= -cirello.io/dynamolock/v2 v2.0.2/go.mod h1:kC31fXt8CEX0colxFT/4r9RRKfhZLG0PFrJJXM5A24w= +cirello.io/dynamolock/v2 v2.0.3 h1:1v6BSRa3ov/ytEX8hFtY9yMstFQEnMsj9s8+jCXFDxg= +cirello.io/dynamolock/v2 v2.0.3/go.mod h1:0GKOMMD//uxSPfZk/uxgquAI7C5FvGI5AL8B6cEVvLE= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -215,88 +215,74 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.45.12 h1:+bKbbesGNPp+TeGrcqfrWuZoqcIEhjwKyBMHQPp80Jo= -github.com/aws/aws-sdk-go v1.45.12/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= +github.com/aws/aws-sdk-go v1.47.0 h1:/JUg9V1+xh+qBn8A6ec/l15ETPaMaBqxkjz+gg63dNk= +github.com/aws/aws-sdk-go v1.47.0/go.mod h1:DlEaEbWKZmsITVbqlSVvekPARM1HzeV9PMYg15ymSDA= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= +github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= -github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.19/go.mod h1:sMgThC49I+7ud4V7stUsJwaaM6W/KYxRHl2A5pZDrE4= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 h1:/+Z/dCO+1QHOlCm7m9G61snvIaDRUTv/HXp+8HdESiY= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25/go.mod h1:JQ0HJ+3LaAKHx3uwRUAfR/tb/gOlgAGPT6mZfIq55Ec= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.46/go.mod h1:A52W+4f5wSS/TnYTFln9ngTi6Ho1IdJKSAEcvrmfYYc= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 h1:lVqqyVoBUy7Kp2sOo9xJtC37FafV2sDtee9qpC5bm3w= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52/go.mod h1:+wabPhA5NvnAA/VSQAHIlfvdDn0nnA7P3S5Lc0Q5UiQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= +github.com/aws/aws-sdk-go-v2/credentials v1.14.0 h1:LQquqPE7cL55RQmA/UBoBKehDlEtMnQKm3B0Q672ePE= +github.com/aws/aws-sdk-go-v2/credentials v1.14.0/go.mod h1:q/3oaTPlamrQWHPwJe56Mjq9g1TYDgddvgTgWJtHTmE= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 h1:jlR1Rwjb3z5d1p0sqhNcuCaqdp73H+1O/X8Lc2kBDrY= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43/go.mod h1:X1HGecFASboCkBt1GJRM4a/FDYYogu9AciUoXVsbr4U= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 h1:nLwQrLSBpcZq3MtpTUcpBqPwKL5V/uO/iuYMU+STv68= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71/go.mod h1:Vjebi0MUXOcsV9YCE2Jxqrqq3FchwyIMbaIzm5NmrKw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 h1:lF/cVllNAPKgjDwN2RsQUX9g/f6hXer9f10ubLFSoug= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0/go.mod h1:c28nJNzMVVb9TQpZ5q4tzZvwEJwf/7So7Ie2s90l1Fw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 h1:g2t+hNCOYWICWs0cQLXk86DnXQMXgx1omrAGEpF/d68= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2/go.mod h1:5ngOUsc/7/voqXQ5Mn5T5l9/rWopTMgu7hk+4Fl2AS4= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.2/go.mod h1:KdM++ikeFLtf0RX0WHUdF/nugF8uUntGmJS3Ywo7lVo= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.7/go.mod h1:1MNss6sqoIsFGisX92do/5doiUCBrN7EjhZCS/8DUjI= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 h1:TYq4EU2vEEluoaBG0RCPnbibSndTQSzlpbZdmT/YRcs= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1/go.mod h1:1EJb9/tJwI7iqiStZBcmHijQxcgp7dlPuD2YgoZIrJQ= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.7/go.mod h1:eRmcVwDpfeYgamYv+57cqM9hMWw+/TOqwGsbm39JHgc= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 h1:WHi9VKMYGtWt2DzqeYHXzt55aflymO2EZ6axuKla8oU= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11/go.mod h1:pP+91QTpJMvcFTqGky6puHrkBs8oqoB3XOCiGRDaXwI= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 h1:XnUTMYuPGOrQjlTcf9XoRYBLrN7xjzakkK0+QyP8fO0= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2 h1:y6LX9GUoEA3mO0qpFl1ZQHj1rFyPWVphlzebiSt2tKE= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2/go.mod h1:Q0LcmaN/Qr8+4aSBrdrXXePqoX0eOuYpJLbYpilmWnA= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.3 h1:kaUxW8ZGd3cZYNfZ4QvCUUu+6GeyznPTk4qCYIjvtRc= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.3/go.mod h1:1pSCxO2RQKwIg2ibxUcSmg9jbIZtfrXrVU72nY2jF3g= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 h1:cZhJzuUYDqWEx5aWUeYEK8z0a51o5JV+uAWBpp5zArA= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6/go.mod h1:tQn6wLs+/9umB4Xj1z4RW+EMLWxPxs6ajfM5UcUlhnI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.27.0 h1:EfzUo8opXSJQQwvamM75qEcwRA0Sx09cFXwP7kk8zXw= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.27.0/go.mod h1:lpRt5/CBzqTtrB4sI7J4WH5E/QoKok4RnxRQjovF/kA= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.23.0/go.mod h1:1HkLh8vaL4obF95fne7ZOu7sxomS/+vkBt3/+gqqwE4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 h1:wAG9NailFhGhg8Ngg2YeCtzGmFWc63SYqJKdvN5ZMkE= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0/go.mod h1:ByrosnNlEq6xkA0d+FwB4f0HH/5KWCcgBqVxAt+Rsps= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 h1:WCeS9WZbIqEKCbgIkrHB5jw/9mO2QMYTLPF8wee3v4Y= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7/go.mod h1:uT1paW42RVCVEoAEbWKu98gEI0GMBWUsT/H+pI4ODJQ= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.132.0 h1:JCujezP7Ia2pN6a9WDaT6pS7w1c/uJvuztxdbzc3Fks= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.132.0/go.mod h1:NOPsghjhZRkrVvKIxrDrEL7zhVIFYJsHqdeol50Eodk= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.1 h1:ekQH3O3gUYin2nZ2t0oI0E7FJbnb5WxoyfD6G3YFO1Q= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.1/go.mod h1:EJ/S70FD7FPFMbEK/YXW8bXzdk3i8+i9WTNsRxNm+xI= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.1 h1:C6myGko1ZnCgqo2MXHMaMY9Q/AHC8MjiZXSD7+Xr940= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.1/go.mod h1:rnB+V3K3SIy73lAHyeuyvkSGD6a4wq1EkYM1Ly7hVPc= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 h1:d6WbsOHHsEMryKLc9oYCmvu4lrV9z9QLSQ5S44KSn0o= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0/go.mod h1:Nt5l6Vn68Hv0JWJ6dcQDKuBAKAfHUZSC9Ln8X/1fUMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.25/go.mod h1:zrjXfehNxd4la9SByaw7KQk4AmGkdmeASpOJezwed0g= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.27/go.mod h1:DfuVY36ixXnsG+uTqnoLWunXAKJ4qjccoFrXUPpj+hs= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 h1:0ZzowXTZABVqnJnwDMlTDP3eeEkuP1r6RYnhSBmgK2o= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36/go.mod h1:zAE5h/4VanzBpqyWoCZX/nJImdsqjjsGt2r3MtbKSFA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.37/go.mod h1:7xBUZyP6LeLc+5Ym9PG7atqw4sR28sBtYcHETik+bPE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 h1:aY45T0Xk+xHHrQPlQrp8IhrgN7k4SL5VF2UXhsmI2rs= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1/go.mod h1:5E/dXkj2ljMIAvuYaFuYwitKJg6ULwsDbUr3g8izVB0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 h1:z9faFYBvadv9HdY+oFBgxqCnew9TK+jp9ccxktB5fl4= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0/go.mod h1:Z6Oq1mXqvgwmUxvMrV/jMkQhwm06A9XO015dzGnS8TM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 h1:NMZiW2pbSW/PFCGT/J6R/8xaiFsF/SDdRN49q0NUhA8= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 h1:ZN3bxw9OYC5D6umLw6f57rNJfGfhg1DIAAcKpzyUTOE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 h1:xK86ln1cEDa0cUpLaCbFFX/BABPw4ognfzpGfbF4PkY= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1/go.mod h1:eqTdeirkcyBiDviU/N1JMcImS9zEJDn5wOzX3BsU4wU= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 h1:DHZFzwbFXlfw15I0ERlTVB/YH9iHNr2C1axjRpB7/Gg= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 h1:fSCCJuT5i6ht8TqGdZc5Q5K9pz/atrf7qH4iK5C9XzU= +github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 h1:ZIlR6Wr/EgYwBdEz1NWBqdUsTh0mV7A68pId3YZl6H0= +github.com/aws/aws-sdk-go-v2/service/sso v1.16.0/go.mod h1:O7B5cpuhhJKefAKkM7onb0McmpHyKnsH4RrHJhOyq7M= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 h1:3BZyJei4k1SHdSAFhg9Qg15NnG3v5zosZyFWPm7df/A= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0/go.mod h1:Td8EvzggonY02wLaqSpwybI3GbmA0PWoprKGil2uwJg= github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= +github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 h1:f/V5Y9OaHuNRrA9MntNQNAtMFXqhKj8HTEPnH81eXMI= +github.com/aws/aws-sdk-go-v2/service/sts v1.24.0/go.mod h1:HnCUMNz2XqwnEEk5X6oeDYB2HgOLFpJ/LyfilN8WErs= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= +github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -304,8 +290,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chanzuckerberg/go-misc v1.10.7 h1:n/y5g2cAjigdiZ4qeqBR0ha5FcObPaM7h3m6ECVZZCI= -github.com/chanzuckerberg/go-misc v1.10.7/go.mod h1:Qs6hWHqlqnOqAv9K3ZFmLu4eMNxjjCUnNnFrzhljpng= +github.com/chanzuckerberg/go-misc v1.10.11 h1:uNrZA6FoGCmFdMxaZNWd+lozsDDxHg5RA8wOSdqbOac= +github.com/chanzuckerberg/go-misc v1.10.11/go.mod h1:iswBrzMc3ZTHOJNYwJfmueDiPTZNHN7q4zkKS/haBd8= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -320,11 +306,11 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/compose-spec/compose-go v1.19.0 h1:t68gAcwStDg0hy2kFvqHJIksf6xkqRnlSKfL45/ETqo= -github.com/compose-spec/compose-go v1.19.0/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= +github.com/compose-spec/compose-go v1.20.0 h1:h4ZKOst1EF/DwZp7dWkb+wbTVE4nEyT9Lc89to84Ol4= +github.com/compose-spec/compose-go v1.20.0/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -341,8 +327,8 @@ github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -366,8 +352,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= @@ -393,8 +379,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= -github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 h1:qZNfIGkIANxGv/OqtnntR4DfOY2+BgwR60cAcu/i3SE= @@ -491,8 +477,8 @@ github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -523,14 +509,14 @@ github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrj github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-slug v0.9.1 h1:gYNVJ3t0jAWx8AT2eYZci3Xd7NBHyjayW9AR1DU4ki0= github.com/hashicorp/go-slug v0.9.1/go.mod h1:Ib+IWBYfEfJGI1ZyXMGNbu2BU+aa3Dzu41RKLH301v4= -github.com/hashicorp/go-tfe v1.36.0 h1:Wq73gjjDo/f9gkKQ5MVSb+4NNJ6T7c5MVTivA0s/bZ0= -github.com/hashicorp/go-tfe v1.36.0/go.mod h1:awOuTZ4K9F1EJsKBIoxonJlb7Axn3PIb8YeBLtm/G/0= +github.com/hashicorp/go-tfe v1.39.2 h1:2RrFa6UWEJghQVl248Avd9TJE+ii3NqDD75jBEcr/Tg= +github.com/hashicorp/go-tfe v1.39.2/go.mod h1:pc7+wHCH26BaoFP5txiKkM7Coi5PmB9VwNfnnT2XpKE= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -538,8 +524,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= -github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d h1:9ARUJJ1VVynB176G1HCwleORqCaXm/Vx0uUi0dL26I0= github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d/go.mod h1:Yog5+CPEM3c99L1CL2CFCYoSzgWm5vTU58idbRUaLik= github.com/hashicorp/terraform-config-inspect v0.0.0-20230522202058-dbe9bfcbfe7a h1:zKVsrHhIOWiXHYqFrOXfHacOOVDMYv+v/Wx8DUeyySs= @@ -614,8 +600,8 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -679,8 +665,8 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= @@ -863,8 +849,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -879,8 +865,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -952,8 +938,8 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -975,8 +961,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1243,8 +1229,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= +google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1302,18 +1288,18 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= -k8s.io/kubectl v0.28.2 h1:fOWOtU6S0smdNjG1PB9WFbqEIMlkzU5ahyHkc7ESHgM= -k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64= +k8s.io/kubectl v0.28.3 h1:H1Peu1O3EbN9zHkJCcvhiJ4NUj6lb88sGPO5wrWIM6k= +k8s.io/kubectl v0.28.3/go.mod h1:RDAudrth/2wQ3Sg46fbKKl4/g+XImzvbsSRZdP2RiyE= k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/cli/mocks/mock_artifact_builder.go b/cli/mocks/mock_artifact_builder.go index 77daf1f01b..db74818db6 100644 --- a/cli/mocks/mock_artifact_builder.go +++ b/cli/mocks/mock_artifact_builder.go @@ -80,6 +80,20 @@ func (mr *MockArtifactBuilderIfaceMockRecorder) CheckImageExists(arg0, arg1 inte return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckImageExists", reflect.TypeOf((*MockArtifactBuilderIface)(nil).CheckImageExists), arg0, arg1) } +// DeleteImages mocks base method. +func (m *MockArtifactBuilderIface) DeleteImages(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteImages", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteImages indicates an expected call of DeleteImages. +func (mr *MockArtifactBuilderIfaceMockRecorder) DeleteImages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteImages", reflect.TypeOf((*MockArtifactBuilderIface)(nil).DeleteImages), arg0, arg1) +} + // GetECRsForServices mocks base method. func (m *MockArtifactBuilderIface) GetECRsForServices(arg0 context.Context) (map[string]*config.RegistryConfig, error) { m.ctrl.T.Helper() diff --git a/cli/pkg/artifact_builder/COVERAGE b/cli/pkg/artifact_builder/COVERAGE index 32ccc6d5b4..25cb04c2a0 100644 --- a/cli/pkg/artifact_builder/COVERAGE +++ b/cli/pkg/artifact_builder/COVERAGE @@ -1 +1 @@ -58.8 \ No newline at end of file +53.5 \ No newline at end of file diff --git a/cli/pkg/artifact_builder/artifact_builder.go b/cli/pkg/artifact_builder/artifact_builder.go index fedf08d4ee..ac9881ffe7 100644 --- a/cli/pkg/artifact_builder/artifact_builder.go +++ b/cli/pkg/artifact_builder/artifact_builder.go @@ -199,23 +199,9 @@ func (ab ArtifactBuilder) RetagImages( } func (ab ArtifactBuilder) getRegistryImages(ctx context.Context, registry *config.RegistryConfig, tag string) (*ecr.BatchGetImageOutput, *RegistryDescriptor, error) { - parts := strings.SplitN(registry.URL, "/", 2) - if len(parts) < 2 { - return nil, nil, errors.Errorf("invalid registry url format: %s", registry.URL) - } - registryId := parts[0] - repositoryName := parts[1] - - if util.IsLocalstackMode() { - registryId = "000000000000" - } else { - parts = strings.Split(registryId, ".") - if len(parts) == 6 { - // Real AWS registry ID - registryId = parts[0] - } else { - return nil, nil, errors.Errorf("invalid registry format: %s", registryId) - } + registryId, repositoryName, err := parseRepositoryURL(registry.URL) + if err != nil { + return nil, nil, errors.Wrapf(err, "invalid registry url format: %s", registry.URL) } input := &ecr.BatchGetImageInput{ @@ -394,6 +380,47 @@ func (ab ArtifactBuilder) push(ctx context.Context, tags []string, servicesImage return nil } +func (ab ArtifactBuilder) DeleteImages(ctx context.Context, tag string) error { + if !ab.happyConfig.GetData().FeatureFlags.EnableUnusedImageDeletion { + return nil + } + defer diagnostics.AddProfilerRuntime(ctx, time.Now(), "DeleteImages") + err := ab.validate() + if err != nil { + return errors.Wrap(err, "artifact builder configuration is incomplete") + } + + serviceRegistries := ab.backend.Conf().GetServiceRegistries() + + stackECRS, err := ab.GetECRsForServices(ctx) + if err != nil { + log.Debugf("unable to get ECRs for services: %s", err) + } + if len(stackECRS) > 0 && err == nil { + serviceRegistries = stackECRS + } + + ecrClient := ab.backend.GetECRClient() + + for serviceName, registry := range serviceRegistries { + registryId, repositoryName, err := parseRepositoryURL(registry.URL) + if err != nil { + log.Debugf("unable to parse repository URL %s: %s", registry.URL, err.Error()) + } + log.Debugf("Deleting image %s:%s from ECR\n", registry.URL, tag) + _, err = ecrClient.BatchDeleteImage(ctx, &ecr.BatchDeleteImageInput{ + RegistryId: aws.String(registryId), + RepositoryName: aws.String(repositoryName), + ImageIds: []ecrtypes.ImageIdentifier{{ImageTag: aws.String(tag)}}, + }) + if err != nil { + log.Debugf("unable to delete service %s image from ECR - %s:%s : %s\n", serviceName, registry.URL, tag, err.Error()) + } + } + + return nil +} + type repositoryConfig struct { scanOnPush bool descriptor *RegistryDescriptor @@ -566,6 +593,11 @@ func (ab ArtifactBuilder) Push(ctx context.Context, tags []string) error { // PushFrom allows the caller to specify where the images are coming from and also what tags // to pull from. func (ab ArtifactBuilder) PushFromWithTag(ctx context.Context, servicesImage map[string]string, tag string) error { + err := ab.RegistryLogin(ctx) + if err != nil { + return err + } + return ab.push(ctx, []string{tag}, servicesImage) } @@ -595,3 +627,33 @@ func (ab ArtifactBuilder) GetServices(ctx context.Context) (map[string]ServiceCo } return config.Services, nil } + +func parseRepositoryURL(url string) (registryId string, repositoryName string, err error) { + parts := strings.SplitN(url, "/", 2) + if len(parts) < 2 { + return "", "", errors.Errorf("invalid repository url format: %s", url) + } + registryId = parts[0] + repositoryName = parts[1] + if util.IsLocalstackMode() { + registryId = "000000000000" + } else { + parts = strings.Split(registryId, ".") + if len(parts) != 6 { + return "", "", errors.Errorf("invalid registry format: %s", registryId) + } + registryId = parts[0] + } + return registryId, repositoryName, nil +} + +func (ab ArtifactBuilder) GetAllServices(ctx context.Context) (map[string]ServiceConfig, error) { + bc := ab.config.Clone() + bc.configData = nil + bc.Profile = nil + config, err := bc.GetConfigData(ctx) + if err != nil { + return nil, errors.Wrap(err, "unable to get config data") + } + return config.Services, nil +} diff --git a/cli/pkg/artifact_builder/artifact_builder_factory.go b/cli/pkg/artifact_builder/artifact_builder_factory.go index 2a8eca0bb0..34ece45d1c 100644 --- a/cli/pkg/artifact_builder/artifact_builder_factory.go +++ b/cli/pkg/artifact_builder/artifact_builder_factory.go @@ -30,7 +30,9 @@ type ArtifactBuilderIface interface { PushFromWithTag(ctx context.Context, servicesImage map[string]string, tag string) error Pull(ctx context.Context, stackName, tag string) (map[string]string, error) BuildAndPush(ctx context.Context) error + DeleteImages(ctx context.Context, tag string) error GetServices(ctx context.Context) (map[string]ServiceConfig, error) + GetAllServices(ctx context.Context) (map[string]ServiceConfig, error) } func CreateArtifactBuilder(ctx context.Context) ArtifactBuilderIface { diff --git a/cli/pkg/artifact_builder/artifact_builder_test.go b/cli/pkg/artifact_builder/artifact_builder_test.go index 6162bb3ff1..09e442024a 100644 --- a/cli/pkg/artifact_builder/artifact_builder_test.go +++ b/cli/pkg/artifact_builder/artifact_builder_test.go @@ -190,3 +190,11 @@ func TestBuildAndPush(t *testing.T) { err = artifactBuilder.BuildAndPush(ctx) r.NoError(err) } + +func TestParseRegistryURL(t *testing.T) { + r := require.New(t) + registryId, repositoryName, err := parseRepositoryURL("1234567890.dkr.ecr.us-west-2.amazonaws.com/stackname/envname/servicename") + r.NoError(err) + r.Equal("1234567890", registryId) + r.Equal("stackname/envname/servicename", repositoryName) +} diff --git a/cli/pkg/artifact_builder/builder_config.go b/cli/pkg/artifact_builder/builder_config.go index 125ccb201d..fe7ca598ec 100644 --- a/cli/pkg/artifact_builder/builder_config.go +++ b/cli/pkg/artifact_builder/builder_config.go @@ -46,6 +46,20 @@ func NewBuilderConfig() *BuilderConfig { } } +func (b *BuilderConfig) Clone() *BuilderConfig { + return &BuilderConfig{ + composeFile: b.composeFile, + composeEnvFile: b.composeEnvFile, + dockerRepo: b.dockerRepo, + env: b.env, + StackName: b.StackName, + Profile: b.Profile, + configData: b.configData, + Executor: b.Executor, + DryRun: b.DryRun, + } +} + func (b *BuilderConfig) WithBootstrap(bootstrap *config.Bootstrap) *BuilderConfig { b.composeFile = bootstrap.DockerComposeConfigPath return b diff --git a/cli/pkg/artifact_builder/dry_run_artifact_builder.go b/cli/pkg/artifact_builder/dry_run_artifact_builder.go index 01fbd4e164..6c2082d547 100644 --- a/cli/pkg/artifact_builder/dry_run_artifact_builder.go +++ b/cli/pkg/artifact_builder/dry_run_artifact_builder.go @@ -96,3 +96,18 @@ func (ab *DryRunArtifactBuilder) GetServices(ctx context.Context) (map[string]Se } return config.Services, nil } + +func (ab *DryRunArtifactBuilder) DeleteImages(ctx context.Context, tag string) error { + return nil +} + +func (ab *DryRunArtifactBuilder) GetAllServices(ctx context.Context) (map[string]ServiceConfig, error) { + bc := ab.config.Clone() + bc.configData = nil + bc.Profile = nil + config, err := bc.GetConfigData(ctx) + if err != nil { + return nil, errors.Wrap(err, "unable to get config data") + } + return config.Services, nil +} diff --git a/examples/integration_test/.happy/terraform/envs/rdev/main.tf b/examples/integration_test/.happy/terraform/envs/rdev/main.tf index 3047aba84b..28136f56aa 100644 --- a/examples/integration_test/.happy/terraform/envs/rdev/main.tf +++ b/examples/integration_test/.happy/terraform/envs/rdev/main.tf @@ -1,5 +1,5 @@ module "stack" { - source = "github.com:chanzuckerberg/happy//terraform/modules/happy-stack-eks?ref=main" + source = "git@github.com:chanzuckerberg/happy//terraform/modules/happy-stack-eks?ref=main" image_tag = var.image_tag image_tags = jsondecode(var.image_tags) @@ -16,15 +16,17 @@ module "stack" { services = { frontend = { name = "frontend" - desired_count = 1 + desired_count = 10 // the maximum number of copies of this service it can autoscale to max_count = 50 // the signal used to trigger autoscaling (ie. 50% of CPU means scale up) scaling_cpu_threshold_percentage = 50 // the port the service is running on - port = 3000 - memory = "100Mi" - cpu = "100m" + port = 3000 + memory = "500Mi" + memory_requests = "300Mi" + cpu = "500m" + cpu_requests = "500m" // an endpoint that returns a 200. Your service will not start if this endpoint is not healthy health_check_path = "/health" // oneof: INTERNAL, EXTERNAL, PRIVATE, TARGET_GROUP_ONLY, IMAGE_TEMPLATE @@ -42,8 +44,8 @@ module "stack" { // Try to always select arm since it comes with a lot of cost savings and performance // benefits and has little to no impact on developers. platform_architecture = "arm64" - scan_on_push = true - tag_mutability = false + scan_on_push = true + tag_mutability = false } } diff --git a/examples/integration_test/src/api/Dockerfile b/examples/integration_test/src/api/Dockerfile index e23a38d129..d957783247 100644 --- a/examples/integration_test/src/api/Dockerfile +++ b/examples/integration_test/src/api/Dockerfile @@ -9,11 +9,12 @@ RUN GOPROXY=direct go build -o api FROM alpine:3.9 WORKDIR /app RUN apk update && apk upgrade && apk --no-cache add curl -RUN apk add --no-cache git make gcc g++ libc-dev pkgconfig \ - libxml2-dev libxslt-dev postgresql-dev coreutils curl wget bash \ - gnupg tar linux-headers bison readline-dev readline zlib-dev \ - zlib yaml-dev autoconf ncurses-dev curl-dev apache2-dev \ - libx11-dev libffi-dev tcl-dev tk-dev openjdk8 +# # Uncomment the statement below to detect vulnerabilities +# RUN apk add --no-cache git make gcc g++ libc-dev pkgconfig \ +# libxml2-dev libxslt-dev postgresql-dev coreutils curl wget bash \ +# gnupg tar linux-headers bison readline-dev readline zlib-dev \ +# zlib yaml-dev autoconf ncurses-dev curl-dev apache2-dev \ +# libx11-dev libffi-dev tcl-dev tk-dev openjdk8 COPY --from=builder /app/api /app/ EXPOSE 3000 ENTRYPOINT ./api \ No newline at end of file diff --git a/helm-charts/charts/stack/CHANGELOG.md b/helm-charts/charts/stack/CHANGELOG.md index 0245e2254d..28366de118 100644 --- a/helm-charts/charts/stack/CHANGELOG.md +++ b/helm-charts/charts/stack/CHANGELOG.md @@ -1,5 +1,34 @@ # Changelog +## [0.1.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-helm-chart-v0.1.0...happy-stack-helm-chart-v0.1.0) (2023-11-03) + + +### Features + +* Chart cleanup and pod disruption budgets support ([#2642](https://github.com/chanzuckerberg/happy/issues/2642)) ([b7bdadc](https://github.com/chanzuckerberg/happy/commit/b7bdadca2d4cb38220987f0398de88bb217c3b68)) +* Happy-stack-helm-eks module ([#2662](https://github.com/chanzuckerberg/happy/issues/2662)) ([fbfa09c](https://github.com/chanzuckerberg/happy/commit/fbfa09ca527cdfdd43dd44e02392688efd4d31d6)) + +## [0.1.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-helm-chart-v0.1.0...happy-stack-helm-chart-v0.1.0) (2023-11-02) + + +### Features + +* Chart cleanup and pod disruption budgets support ([#2642](https://github.com/chanzuckerberg/happy/issues/2642)) ([b7bdadc](https://github.com/chanzuckerberg/happy/commit/b7bdadca2d4cb38220987f0398de88bb217c3b68)) + +## [0.1.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-helm-chart-v0.1.0...happy-stack-helm-chart-v0.1.0) (2023-10-31) + + +### Features + +* Chart cleanup and pod disruption budgets support ([#2642](https://github.com/chanzuckerberg/happy/issues/2642)) ([b7bdadc](https://github.com/chanzuckerberg/happy/commit/b7bdadca2d4cb38220987f0398de88bb217c3b68)) + +## [0.1.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-helm-chart-v0.1.0...happy-stack-helm-chart-v0.1.0) (2023-10-26) + + +### Features + +* Chart cleanup and pod disruption budgets support ([#2642](https://github.com/chanzuckerberg/happy/issues/2642)) ([b7bdadc](https://github.com/chanzuckerberg/happy/commit/b7bdadca2d4cb38220987f0398de88bb217c3b68)) + ## 0.1.0 (2023-10-16) diff --git a/helm-charts/charts/stack/templates/_helpers.tpl b/helm-charts/charts/stack/templates/_helpers.tpl index f69001b5bb..39190ab2b9 100644 --- a/helm-charts/charts/stack/templates/_helpers.tpl +++ b/helm-charts/charts/stack/templates/_helpers.tpl @@ -81,25 +81,25 @@ alb.ingress.kubernetes.io/tags: env={{.Values.deploymentStage}},happy_env={{.Val {{- define "container.probes" -}} livenessProbe: - failureThreshold: 3 - httpGet: + failureThreshold: 3 + httpGet: path: {{ .healthCheck.path | quote }} port: {{ .routing.port | int }} scheme: {{ .routing.scheme | quote }} - initialDelaySeconds: {{ .healthCheck.initialDelaySeconds | int }} - periodSeconds: {{ .healthCheck.periodSeconds | int }} - successThreshold: 1 - timeoutSeconds: 1 + initialDelaySeconds: {{ .healthCheck.initialDelaySeconds | int }} + periodSeconds: {{ .healthCheck.periodSeconds | int }} + successThreshold: 1 + timeoutSeconds: 1 readinessProbe: - failureThreshold: 3 - httpGet: + failureThreshold: 3 + httpGet: path: {{ .healthCheck.path | quote }} port: {{ .routing.port | int }} scheme: {{ .routing.scheme | quote }} - initialDelaySeconds: {{ .healthCheck.initialDelaySeconds | int }} - periodSeconds: {{ .healthCheck.periodSeconds | int }} - successThreshold: 1 - timeoutSeconds: 1 + initialDelaySeconds: {{ .healthCheck.initialDelaySeconds | int }} + periodSeconds: {{ .healthCheck.periodSeconds | int }} + successThreshold: 1 + timeoutSeconds: 1 {{- end }} {{/* diff --git a/helm-charts/charts/stack/templates/cronjob.yaml b/helm-charts/charts/stack/templates/cronjob.yaml index 6dd50660c6..06d3080e67 100644 --- a/helm-charts/charts/stack/templates/cronjob.yaml +++ b/helm-charts/charts/stack/templates/cronjob.yaml @@ -13,8 +13,6 @@ spec: concurrencyPolicy: Forbid failedJobsHistoryLimit: 5 jobTemplate: - metadata: - creationTimestamp: null spec: backoffLimit: 2 completions: 1 @@ -40,7 +38,8 @@ spec: schedulerName: default-scheduler securityContext: {} serviceAccountName: {{ $fullTaskName }} - nodeSelector: {{- toYaml (merge $value.additionalNodeSelectors (dict "kubernetes.io/arch" $value.image.platformArchitecture)) }} + nodeSelector: + {{- toYaml (merge $value.additionalNodeSelectors (dict "kubernetes.io/arch" $value.image.platformArchitecture)) | nindent 12}} shareProcessNamespace: false terminationGracePeriodSeconds: 30 ttlSecondsAfterFinished: 10 diff --git a/helm-charts/charts/stack/templates/deployment.yaml b/helm-charts/charts/stack/templates/deployment.yaml index aaf21de87b..af30f263ce 100644 --- a/helm-charts/charts/stack/templates/deployment.yaml +++ b/helm-charts/charts/stack/templates/deployment.yaml @@ -1,7 +1,7 @@ {{ $global := . }} {{- range $key, $value := .Values.services }} {{- $fullServiceName := printf "%s-%s" $global.Values.stackName $value.name | trunc 63 | trimSuffix "-" }} - +{{ if ne $value.routing.serviceType "IMAGE_TEMPLATE" }} --- apiVersion: apps/v1 kind: Deployment @@ -12,14 +12,14 @@ metadata: {{- include "stack.labels" $global | nindent 4 }} annotations: {{- if eq $global.Values.datadog.enabled true }} - ad.datadoghq.com/tags: '{"deployment_stage":"{{$global.deploymentStage}}","env":"{{$global.deploymentStage}}","happy_compute":"eks","happy_service":"{{$fullServiceName}}","happy_stack":"{{ include "stack.name" $global }}","managedby":"happy","owner":"{{$global.Values.aws.tags.owner}}","project":"{{$global.Values.aws.tags.project}}","service":"{{$global.Values.aws.tags.service}}"}' + ad.datadoghq.com/tags: '{"deployment_stage":"{{ $global.deploymentStage }}","env":"{{ $global.deploymentStage }}","happy_compute":"eks","happy_service":"{{ $fullServiceName }}","happy_stack":"{{ include "stack.name" $global }}","managedby":"happy","owner":"{{ $global.Values.aws.tags.owner }}","project":"{{ $global.Values.aws.tags.project }}","service":"{{ $global.Values.aws.tags.service }}"}' {{- end }} - linkerd.io/inject: {{if eq $global.Values.serviceMesh.enabled true}}enabled{{else}}disabled{{end}} + linkerd.io/inject: {{ if eq $global.Values.serviceMesh.enabled true }}enabled{{ else }}disabled{{ end }} spec: replicas: {{ $value.scaling.desiredCount }} selector: matchLabels: - app: {{$fullServiceName}} + app: {{ $fullServiceName }} template: metadata: labels: @@ -27,7 +27,7 @@ spec: {{- include "stack.labels" $global | nindent 8 }} annotations: {{- if eq $global.Values.datadog.enabled true }} - ad.datadoghq.com/tags: '{"deployment_stage":"{{$global.deploymentStage}}","env":"{{$global.deploymentStage}}","happy_compute":"eks","happy_service":"{{$fullServiceName}}","happy_stack":"{{ include "stack.name" $global }}","managedby":"happy","owner":"{{$global.Values.aws.tags.owner}}","project":"{{$global.Values.aws.tags.project}}","service":"{{$global.Values.aws.tags.service}}"}' + ad.datadoghq.com/tags: '{"deployment_stage":"{{ $global.deploymentStage }}","env":"{{ $global.deploymentStage }}","happy_compute":"eks","happy_service":"{{ $fullServiceName }}","happy_stack":"{{ include "stack.name" $global }}","managedby":"happy","owner":"{{ $global.Values.aws.tags.owner }}","project":"{{ $global.Values.aws.tags.project }}","service":"{{ $global.Values.aws.tags.service }}"}' {{- end }} {{ if eq $global.Values.serviceMesh.enabled true -}} config.linkerd.io/default-inbound-policy: all-authenticated @@ -36,6 +36,39 @@ spec: {{- else }}{{ end }} spec: automountServiceAccountToken: true + topologySpreadConstraint: + - maxSkew: 3 + minDomains: 3 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: DoNotSchedule + labelSelector: + matchLabels: + app: {{ $fullServiceName }} + nodeSelector: + {{- toYaml (merge $value.additionalNodeSelectors (dict "kubernetes.io/arch" $value.image.platformArchitecture)) | nindent 8 }} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - {{ $value.image.platformArchitecture }} + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app: {{ $fullServiceName }} + topologyKey: kubernetes.io/hostname + weight: 49 + - podAffinityTerm: + labelSelector: + matchLabels: + app: {{ $fullServiceName }} + topologyKey: topology.kubernetes.io/zone + weight: 51 containers: - env: {{- $value.env.additionalEnvVars| default list | toYaml | nindent 10 }} envFrom: {{- (concat $value.env.additionalEnvVarsFromConfigMaps $value.env.additionalEnvVarsFromSecrets) | default list | toYaml | nindent 10}} @@ -46,7 +79,7 @@ spec: - containerPort: {{ $value.routing.port | int }} name: http protocol: TCP - {{- include "container.probes" $value | nindent 10 }} + {{- include "container.probes" $value | nindent 8 }} resources: {{- toYaml $value.resources | nindent 10 }} volumeMounts: {{- $intSecretVM := get ((include "happy.intSecretVolumeMount" .) | fromYaml) "anchor" }} @@ -59,7 +92,7 @@ spec: - containerPort: {{ $v.port | int }} name: http protocol: TCP - {{- include "container.probes" $v | nindent 10 }} + {{- include "container.probes" $v | nindent 8 }} resources: {{- toYaml $v.resources | nindent 10 }} volumeMounts: {{- $intSecretVM := get ((include "happy.intSecretVolumeMount" .) | fromYaml) "anchor" }} @@ -69,7 +102,6 @@ spec: env: {{- $combinedEnv | default list | toYaml | nindent 10 }} envFrom: {{- (concat $value.env.additionalEnvVarsFromConfigMaps $value.env.additionalEnvVarsFromSecrets) | default list | toYaml | nindent 10 }} {{- end }} - nodeSelector: {{- toYaml (merge $value.additionalNodeSelectors (dict "kubernetes.io/arch" $value.image.platformArchitecture)) }} restartPolicy: Always serviceAccountName: {{ $fullServiceName }} volumes: @@ -87,3 +119,4 @@ spec: secret: secretName: integration-secret {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/charts/stack/templates/hpa.yaml b/helm-charts/charts/stack/templates/hpa.yaml index 020b12ce7a..456d2f886b 100644 --- a/helm-charts/charts/stack/templates/hpa.yaml +++ b/helm-charts/charts/stack/templates/hpa.yaml @@ -1,6 +1,7 @@ {{ $global := . }} {{- range $key, $value := .Values.services }} {{- $fullServiceName := printf "%s-%s" $global.Values.stackName $value.name | trunc 63 | trimSuffix "-" }} +{{ if ne $value.routing.serviceType "IMAGE_TEMPLATE" }} --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler @@ -23,4 +24,5 @@ spec: apiVersion: apps/v1 kind: Deployment name: {{ $fullServiceName }} +{{- end }} {{- end }} \ No newline at end of file diff --git a/helm-charts/charts/stack/templates/ingress_bypass.yaml b/helm-charts/charts/stack/templates/ingress_bypass.yaml index 231137fb52..4f2d084df7 100644 --- a/helm-charts/charts/stack/templates/ingress_bypass.yaml +++ b/helm-charts/charts/stack/templates/ingress_bypass.yaml @@ -20,9 +20,9 @@ metadata: {{- include "stack.labels" $global | nindent 4 }} annotations: {{- include "ingress.base.annotations" $service | nindent 4 }} - alb.ingress.kubernetes.io/group.order: {{$i | quote }} + alb.ingress.kubernetes.io/group.order: {{ $i | quote }} alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]' - alb.ingress.kubernetes.io/conditions.{{ $fullServiceName }}: {{ toJson . | quote }} + alb.ingress.kubernetes.io/conditions.{{ $fullServiceName }}: {{ toJson . | list | quote }} {{- end }} {{- $bypassI = add1 $bypassI }} spec: @@ -34,7 +34,7 @@ spec: service: name: {{ $fullServiceName }} port: - number: {{if eq $global.Values.serviceMesh.enabled true}}443{{else}}{{$value.routing.servicePort | int }}{{ end }} + number: {{ if eq $global.Values.serviceMesh.enabled true }}443{{ else }}{{ $value.routing.servicePort | int }}{{ end }} pathType: ImplementationSpecific {{- end }} {{- end }} diff --git a/helm-charts/charts/stack/templates/ingress_main.yaml b/helm-charts/charts/stack/templates/ingress_main.yaml index 78b3d8c042..1fc6284619 100644 --- a/helm-charts/charts/stack/templates/ingress_main.yaml +++ b/helm-charts/charts/stack/templates/ingress_main.yaml @@ -42,7 +42,7 @@ spec: service: name: {{ $fullServiceName }} port: - number: {{if eq $global.Values.serviceMesh.enabled true}}443{{else}}{{$value.routing.port | int }}{{ end }} + number: {{ if eq $global.Values.serviceMesh.enabled true }}443{{ else }}{{ $value.routing.port | int }}{{ end }} path: /* pathType: ImplementationSpecific {{- end }} diff --git a/helm-charts/charts/stack/templates/linkerd_authz_policy.yaml b/helm-charts/charts/stack/templates/linkerd_authz_policy.yaml index 1681decc6b..803e84e2b7 100644 --- a/helm-charts/charts/stack/templates/linkerd_authz_policy.yaml +++ b/helm-charts/charts/stack/templates/linkerd_authz_policy.yaml @@ -1,5 +1,5 @@ {{ $global := . }} -{{if eq .Values.serviceMesh.enabled true}} +{{ if eq .Values.serviceMesh.enabled true }} {{- range $key, $value := .Values.services }} {{- $fullServiceName := printf "%s-%s" $global.Values.stackName $value.name | trunc 63 | trimSuffix "-" }} --- diff --git a/helm-charts/charts/stack/templates/linkerd_ingress.yaml b/helm-charts/charts/stack/templates/linkerd_ingress.yaml index df5e391ed1..c9547c724f 100644 --- a/helm-charts/charts/stack/templates/linkerd_ingress.yaml +++ b/helm-charts/charts/stack/templates/linkerd_ingress.yaml @@ -1,5 +1,5 @@ {{ $global := . }} -{{if eq .Values.serviceMesh.enabled true}} +{{ if eq .Values.serviceMesh.enabled true }} {{- range $key, $value := .Values.services }} {{- $fullServiceName := printf "%s-%s" $global.Values.stackName $value.name | trunc 63 | trimSuffix "-" }} --- diff --git a/helm-charts/charts/stack/templates/linkerd_mesh_tls_auth.yaml b/helm-charts/charts/stack/templates/linkerd_mesh_tls_auth.yaml index 7542858c8c..3cd6a1757b 100644 --- a/helm-charts/charts/stack/templates/linkerd_mesh_tls_auth.yaml +++ b/helm-charts/charts/stack/templates/linkerd_mesh_tls_auth.yaml @@ -1,5 +1,5 @@ {{ $global := . }} -{{if eq .Values.serviceMesh.enabled true}} +{{ if eq .Values.serviceMesh.enabled true }} {{- range $key, $value := .Values.services }} {{- $fullServiceName := printf "%s-%s" $global.Values.stackName $value.name | trunc 63 | trimSuffix "-" }} --- diff --git a/helm-charts/charts/stack/templates/linkerd_server.yaml b/helm-charts/charts/stack/templates/linkerd_server.yaml index 638ed8e67b..e82c8ca2f3 100644 --- a/helm-charts/charts/stack/templates/linkerd_server.yaml +++ b/helm-charts/charts/stack/templates/linkerd_server.yaml @@ -13,7 +13,7 @@ metadata: spec: podSelector: matchLabels: - app: {{$fullServiceName}} + app: {{ $fullServiceName }} port: {{ $value.routing.port | int }} {{- end }} {{- end }} \ No newline at end of file diff --git a/helm-charts/charts/stack/templates/oidc_secret.yaml b/helm-charts/charts/stack/templates/oidc_secret.yaml index 7eafdc8c49..e5f447c81b 100644 --- a/helm-charts/charts/stack/templates/oidc_secret.yaml +++ b/helm-charts/charts/stack/templates/oidc_secret.yaml @@ -7,6 +7,9 @@ apiVersion: v1 kind: Secret metadata: name: {{ $fullServiceName }}-oidc-config + {{ if eq .Values.serviceMesh.enabled true }} + namespace: nginx-encrypted-ingress + {{- end }} labels: {{- include "service.labels" $fullServiceName | nindent 4 }} {{- include "stack.labels" $global | nindent 4 }} diff --git a/helm-charts/charts/stack/templates/pdb.yaml b/helm-charts/charts/stack/templates/pdb.yaml new file mode 100644 index 0000000000..cf33819f48 --- /dev/null +++ b/helm-charts/charts/stack/templates/pdb.yaml @@ -0,0 +1,19 @@ +{{ $global := . }} +{{- range $key, $value := .Values.services }} +{{- $fullServiceName := printf "%s-%s" $global.Values.stackName $value.name | trunc 63 | trimSuffix "-" }} +{{ if ne $value.routing.serviceType "IMAGE_TEMPLATE" }} +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ $fullServiceName }} + labels: + {{- include "service.labels" $fullServiceName | nindent 4 }} + {{- include "stack.labels" $global | nindent 4 }} +spec: + maxUnavailable: {{ $value.scaling.maxUnavailable | default 1 }} + selector: + matchLabels: + app: {{ $fullServiceName }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/charts/stack/templates/sa.yaml b/helm-charts/charts/stack/templates/sa.yaml index 25988dd23f..1703f10647 100644 --- a/helm-charts/charts/stack/templates/sa.yaml +++ b/helm-charts/charts/stack/templates/sa.yaml @@ -1,6 +1,7 @@ {{ $global := . }} {{- range $key, $value := .Values.tasks }} {{ $fullTaskName := (printf "%s-%s" $global.Values.stackName $value.name) | trunc 63 | trimSuffix "-" }} +--- apiVersion: v1 kind: ServiceAccount metadata: @@ -14,6 +15,7 @@ metadata: {{- range $key, $value := .Values.services }} {{ $fullServiceName := (printf "%s-%s" $global.Values.stackName $value.name) | trunc 63 | trimSuffix "-" }} +{{ if ne $value.routing.serviceType "IMAGE_TEMPLATE" }} --- apiVersion: v1 kind: ServiceAccount @@ -24,4 +26,5 @@ metadata: {{- include "stack.labels" $global | nindent 4 }} annotations: eks.amazonaws.com/role-arn: {{ $value.awsIam.roleArn }} +{{- end }} {{- end }} \ No newline at end of file diff --git a/helm-charts/charts/stack/templates/target_group_binding.yaml b/helm-charts/charts/stack/templates/target_group_binding.yaml index 0a48991fc8..d6576eff1b 100644 --- a/helm-charts/charts/stack/templates/target_group_binding.yaml +++ b/helm-charts/charts/stack/templates/target_group_binding.yaml @@ -17,8 +17,10 @@ spec: networking: ingress: - from: + {{- range $sg := $service.routing.alb.securityGroups -}} - securityGroup: - groupID: {{ required ".Values.services[].routing.alb.securityGroup is required" $service.routing.alb.securityGroup }} + groupID: {{ $sg }} + {{- end }} ports: - protocol: TCP serviceRef: diff --git a/helm-charts/charts/stack/values.yaml b/helm-charts/charts/stack/values.yaml index 02c4938bd8..f6177104a0 100644 --- a/helm-charts/charts/stack/values.yaml +++ b/helm-charts/charts/stack/values.yaml @@ -35,51 +35,29 @@ services: resources: limits: cpu: "100m" - gpu: null memory: "100Mi" requests: cpu: "10m" - gpu: null memory: "10Mi" scaling: desiredCount: 2 maxCount: 2 cpuThresholdPercentage: 80 + maxUnavailable: 1 env: additionalEnvVars: [] # additionalEnvVars: [{name: "balh", value: "blah"}] - # - # additionalEnvVarsFromConfigMaps: [] - # additionalEnvVarsFromConfigMaps: [ - # {configMapRef: {name: "balh"}, prefix: "blah"} - #] + # additionalEnvVarsFromConfigMaps: [{configMapRef: {name: "balh"}, prefix: "blah"}] additionalEnvVarsFromSecrets: [] - # additionalEnvVarsFromSecrets: [ - # {secretRef: {name: "balh"}, prefix: "blah"} - #] + # additionalEnvVarsFromSecrets: [{secretRef: {name: "balh"}, prefix: "blah"}] volumes: - additionalVolumesFromSecrets: [{mountPath: "blah2", readOnly: true, name: "blah2"}] - # additionalEnvVarsFromSecrets: [ - # {mountPath: "blah", readOnly: true, name: "blah"} - # - name: config-vol - configMap: - name: log-config - items: - - key: log_level - path: log_level - #] - additionalVolumesFromConfigMaps: [{mountPath: "blah", readOnly: true, name: "blah"}] - # additionalEnvVarsFromSecrets: [ - # {mountPath: "blah", readOnly: true, name: "blah"} - #] - stackPrefix: "" - datadog: - createDashboard: false - skipConfigInjection: false + additionalVolumesFromSecrets: [] + # additionalEnvVarsFromSecrets: [mountPath: "blah", readOnly: true, name: "blah"}] + additionalVolumesFromConfigMaps: [] + # additionalEnvVarsFromSecrets: [{mountPath: "blah", readOnly: true, name: "blah"}] waitForSteadyState: true certificateArn: "blahblahbs" - serviceEndpoints: {} healthCheck: path: "/" periodSeconds: 3 @@ -93,12 +71,12 @@ services: alb: loadBalancerAttributes: - idle_timeout.timeout_seconds=60 - securityGroup: sg-123 + securityGroups: + - sg-123 targetGroupArn: arn:aws:elasticloadbalancing:us-west-2:00000000000:targetgroup/zzz/zzz targetGroup: group1 priority: 4 path: "/*" - serviceName: "" port: 3000 scheme: "HTTP" successCodes: "200-499" @@ -120,19 +98,6 @@ services: Values: - /blah - /test/skip - - # sidecars: - # sidecar1: - # image: "sidecar-image-1" - # tag: "1.0.0" - # port: 8080 - # scheme: "HTTP" - # memory: "256Mi" - # cpu: "250m" - # imagePullPolicy: "IfNotPresent" - # healthCheckPath: "/health" - # initialDelaySeconds: 15 - # periodSeconds: 5 # sidecars: {} sidecars: - name: sidecar1 @@ -141,7 +106,7 @@ services: tag: "tag1" routing: port: 8080 - scheme: "HTTP" + scheme: "HTTP" resources: limits: cpu: "100m" @@ -154,8 +119,6 @@ services: path: "/health" periodSeconds: 3 initialDelaySeconds: 30 - initialDelaySeconds: 15 - periodSeconds: 5 regionalWafv2Arn: null additionalNodeSelectors: {} additionalPodLabels: {} @@ -186,30 +149,14 @@ tasks: env: additionalEnvVars: [] # additionalEnvVars: [{name: "balh", value: "blah"}] - # - # additionalEnvVarsFromConfigMaps: [] - # additionalEnvVarsFromConfigMaps: [ - # {configMapRef: {name: "balh"}, prefix: "blah"} - #] + # additionalEnvVarsFromConfigMaps: [{configMapRef: {name: "balh"}, prefix: "blah"}] additionalEnvVarsFromSecrets: [] - # additionalEnvVarsFromSecrets: [ - # {secretRef: {name: "balh"}, prefix: "blah"} - #] + # additionalEnvVarsFromSecrets: [{secretRef: {name: "balh"}, prefix: "blah"}] volumes: - additionalVolumesFromSecrets: [{mountPath: "blah2", readOnly: true, name: "blah2"}] - # additionalEnvVarsFromSecrets: [ - # {mountPath: "blah", readOnly: true, name: "blah"} - # - name: config-vol - configMap: - name: log-config - items: - - key: log_level - path: log_level - #] - additionalVolumesFromConfigMaps: [{mountPath: "blah", readOnly: true, name: "blah"}] - # additionalEnvVarsFromSecrets: [ - # {mountPath: "blah", readOnly: true, name: "blah"} - #] + additionalVolumesFromSecrets: [] + additionalVolumesFromConfigMaps: [] + # additionalVolumesFromSecrets: [{mountPath: "blah2", readOnly: true, name: "blah2"}] + # additionalVolumesFromConfigMaps: [{mountPath: "blah", readOnly: true, name: "blah"}] additionalNodeSelectors: {} additionalPodLabels: {} diff --git a/hvm/CHANGELOG.md b/hvm/CHANGELOG.md index 9c82e8329a..00e5d338c3 100644 --- a/hvm/CHANGELOG.md +++ b/hvm/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## [0.115.1](https://github.com/chanzuckerberg/happy/compare/hvm-v0.115.0...hvm-v0.115.1) (2023-11-02) + + +### Miscellaneous Chores + +* **hvm:** Synchronize happy platform versions + +## [0.115.0](https://github.com/chanzuckerberg/happy/compare/hvm-v0.114.1...hvm-v0.115.0) (2023-10-31) + + +### Miscellaneous Chores + +* **hvm:** Synchronize happy platform versions + +## [0.114.1](https://github.com/chanzuckerberg/happy/compare/hvm-v0.114.0...hvm-v0.114.1) (2023-10-26) + + +### Miscellaneous Chores + +* **hvm:** Synchronize happy platform versions + +## [0.114.0](https://github.com/chanzuckerberg/happy/compare/hvm-v0.113.1...hvm-v0.114.0) (2023-10-24) + + +### Miscellaneous Chores + +* **hvm:** Synchronize happy platform versions + ## [0.113.1](https://github.com/chanzuckerberg/happy/compare/hvm-v0.113.0...hvm-v0.113.1) (2023-10-18) diff --git a/hvm/cmd/version.go b/hvm/cmd/version.go new file mode 100644 index 0000000000..baae03cc18 --- /dev/null +++ b/hvm/cmd/version.go @@ -0,0 +1,28 @@ +/* +HVM Version Commands +*/ +package cmd + +import ( + "fmt" + "github.com/chanzuckerberg/happy/shared/util" + "github.com/spf13/cobra" +) + +// installCmd represents the install command +var versionCmd = &cobra.Command{ + Use: "version", + Short: "Output version of HVM", + Long: `Output the current version of the HVM CLI`, + RunE: outputVersion, +} + +func init() { + rootCmd.AddCommand(versionCmd) +} + +func outputVersion(cmd *cobra.Command, args []string) error { + v := util.GetVersion().String() + fmt.Fprintln(cmd.OutOrStdout(), v) + return nil +} diff --git a/hvm/go.mod b/hvm/go.mod index a42f4deafa..6db1590975 100644 --- a/hvm/go.mod +++ b/hvm/go.mod @@ -8,44 +8,44 @@ require ( github.com/codeclysm/extract v2.2.0+incompatible github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 ) require ( - cirello.io/dynamolock/v2 v2.0.2 // indirect + cirello.io/dynamolock/v2 v2.0.3 // indirect github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect - github.com/aws/aws-sdk-go-v2 v1.21.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.22.2 // indirect github.com/aws/aws-sdk-go-v2/config v1.18.44 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.42 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 // indirect + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 // indirect + github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect - github.com/aws/smithy-go v1.15.0 // indirect + github.com/aws/smithy-go v1.16.0 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/creasty/defaults v1.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.6+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -59,7 +59,7 @@ require ( github.com/go-openapi/swag v0.22.3 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.15.5 // indirect + github.com/go-playground/validator/v10 v10.16.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect @@ -68,7 +68,7 @@ require ( github.com/google/go-github/v53 v53.2.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/h2non/filetype v1.1.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -104,10 +104,10 @@ require ( golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/time v0.4.0 // indirect golang.org/x/tools v0.9.3 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect @@ -119,9 +119,9 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.0 // indirect - k8s.io/api v0.28.2 // indirect - k8s.io/apimachinery v0.28.2 // indirect - k8s.io/client-go v0.28.2 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/apimachinery v0.28.3 // indirect + k8s.io/client-go v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect diff --git a/hvm/go.sum b/hvm/go.sum index 0552ce62bb..30287c6ca5 100644 --- a/hvm/go.sum +++ b/hvm/go.sum @@ -1,5 +1,5 @@ -cirello.io/dynamolock/v2 v2.0.2 h1:4AEs4218aQLB9NfMMc/B9nmPrZZkrDNZXOgMUC0l/As= -cirello.io/dynamolock/v2 v2.0.2/go.mod h1:kC31fXt8CEX0colxFT/4r9RRKfhZLG0PFrJJXM5A24w= +cirello.io/dynamolock/v2 v2.0.3 h1:1v6BSRa3ov/ytEX8hFtY9yMstFQEnMsj9s8+jCXFDxg= +cirello.io/dynamolock/v2 v2.0.3/go.mod h1:0GKOMMD//uxSPfZk/uxgquAI7C5FvGI5AL8B6cEVvLE= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= @@ -14,90 +14,72 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= -github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= +github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= -github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.19/go.mod h1:sMgThC49I+7ud4V7stUsJwaaM6W/KYxRHl2A5pZDrE4= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 h1:/+Z/dCO+1QHOlCm7m9G61snvIaDRUTv/HXp+8HdESiY= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25/go.mod h1:JQ0HJ+3LaAKHx3uwRUAfR/tb/gOlgAGPT6mZfIq55Ec= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.46/go.mod h1:A52W+4f5wSS/TnYTFln9ngTi6Ho1IdJKSAEcvrmfYYc= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 h1:lVqqyVoBUy7Kp2sOo9xJtC37FafV2sDtee9qpC5bm3w= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52/go.mod h1:+wabPhA5NvnAA/VSQAHIlfvdDn0nnA7P3S5Lc0Q5UiQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 h1:jlR1Rwjb3z5d1p0sqhNcuCaqdp73H+1O/X8Lc2kBDrY= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43/go.mod h1:X1HGecFASboCkBt1GJRM4a/FDYYogu9AciUoXVsbr4U= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 h1:nLwQrLSBpcZq3MtpTUcpBqPwKL5V/uO/iuYMU+STv68= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71/go.mod h1:Vjebi0MUXOcsV9YCE2Jxqrqq3FchwyIMbaIzm5NmrKw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 h1:NL2HEgcchk/QTa9/8GgrZvmfvCwqCDknvzAOMuvANnU= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1/go.mod h1:ZD/6Xew+gqhnRBg9iRXNYZOhp4BXKfqe7JRrtOnIh8s= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.2/go.mod h1:KdM++ikeFLtf0RX0WHUdF/nugF8uUntGmJS3Ywo7lVo= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.7/go.mod h1:1MNss6sqoIsFGisX92do/5doiUCBrN7EjhZCS/8DUjI= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 h1:TYq4EU2vEEluoaBG0RCPnbibSndTQSzlpbZdmT/YRcs= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1/go.mod h1:1EJb9/tJwI7iqiStZBcmHijQxcgp7dlPuD2YgoZIrJQ= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.7/go.mod h1:eRmcVwDpfeYgamYv+57cqM9hMWw+/TOqwGsbm39JHgc= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 h1:WHi9VKMYGtWt2DzqeYHXzt55aflymO2EZ6axuKla8oU= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11/go.mod h1:pP+91QTpJMvcFTqGky6puHrkBs8oqoB3XOCiGRDaXwI= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 h1:XnUTMYuPGOrQjlTcf9XoRYBLrN7xjzakkK0+QyP8fO0= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 h1:Y2zGozmCogCCQbO2fplC6tZylBTBBgt/2EcdVRRK5go= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1/go.mod h1:J9goPpIjXafA1u3XGJeoHu9WlMp5qAGwWmS1A8LfZVw= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 h1:bOS7hAfvd8+glVAG88WnvRITe5N1vopGFHh10ORe/BI= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1/go.mod h1:cxbA26Kf4UlTb40f5FON22ZPNMyEVmMS82KUJZC1E1w= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 h1:cZhJzuUYDqWEx5aWUeYEK8z0a51o5JV+uAWBpp5zArA= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6/go.mod h1:tQn6wLs+/9umB4Xj1z4RW+EMLWxPxs6ajfM5UcUlhnI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 h1:g2t+hNCOYWICWs0cQLXk86DnXQMXgx1omrAGEpF/d68= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2/go.mod h1:5ngOUsc/7/voqXQ5Mn5T5l9/rWopTMgu7hk+4Fl2AS4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.23.0/go.mod h1:1HkLh8vaL4obF95fne7ZOu7sxomS/+vkBt3/+gqqwE4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 h1:wAG9NailFhGhg8Ngg2YeCtzGmFWc63SYqJKdvN5ZMkE= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0/go.mod h1:ByrosnNlEq6xkA0d+FwB4f0HH/5KWCcgBqVxAt+Rsps= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 h1:WCeS9WZbIqEKCbgIkrHB5jw/9mO2QMYTLPF8wee3v4Y= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7/go.mod h1:uT1paW42RVCVEoAEbWKu98gEI0GMBWUsT/H+pI4ODJQ= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 h1:JCUTmTs7W1yvUCOdONMX7Hjgn7N9pj57y4/ibU4KFp4= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 h1:TA2V0OLAwEooOnCk2ZBgxTPAtb20Fgbkr7IrI/YxbAg= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0/go.mod h1:/1jvJouA9LvRdzQmTFwlvf3RKFXQz3jgL4AcPuaaoO8= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 h1:PH9chTOUwd0PPUEwunePjUYp6QD0KsZvDcUy6VToKVQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0/go.mod h1:4HwGjM2Z7cMaLV1ddXhKeI1o+hRJhp7A0WnvcgjWyRI= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 h1:d6WbsOHHsEMryKLc9oYCmvu4lrV9z9QLSQ5S44KSn0o= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0/go.mod h1:Nt5l6Vn68Hv0JWJ6dcQDKuBAKAfHUZSC9Ln8X/1fUMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.25/go.mod h1:zrjXfehNxd4la9SByaw7KQk4AmGkdmeASpOJezwed0g= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.27/go.mod h1:DfuVY36ixXnsG+uTqnoLWunXAKJ4qjccoFrXUPpj+hs= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 h1:0ZzowXTZABVqnJnwDMlTDP3eeEkuP1r6RYnhSBmgK2o= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36/go.mod h1:zAE5h/4VanzBpqyWoCZX/nJImdsqjjsGt2r3MtbKSFA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.37/go.mod h1:7xBUZyP6LeLc+5Ym9PG7atqw4sR28sBtYcHETik+bPE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 h1:aY45T0Xk+xHHrQPlQrp8IhrgN7k4SL5VF2UXhsmI2rs= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1/go.mod h1:5E/dXkj2ljMIAvuYaFuYwitKJg6ULwsDbUr3g8izVB0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 h1:z9faFYBvadv9HdY+oFBgxqCnew9TK+jp9ccxktB5fl4= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0/go.mod h1:Z6Oq1mXqvgwmUxvMrV/jMkQhwm06A9XO015dzGnS8TM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 h1:NMZiW2pbSW/PFCGT/J6R/8xaiFsF/SDdRN49q0NUhA8= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 h1:ZN3bxw9OYC5D6umLw6f57rNJfGfhg1DIAAcKpzyUTOE= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 h1:xK86ln1cEDa0cUpLaCbFFX/BABPw4ognfzpGfbF4PkY= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1/go.mod h1:eqTdeirkcyBiDviU/N1JMcImS9zEJDn5wOzX3BsU4wU= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 h1:DHZFzwbFXlfw15I0ERlTVB/YH9iHNr2C1axjRpB7/Gg= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 h1:fSCCJuT5i6ht8TqGdZc5Q5K9pz/atrf7qH4iK5C9XzU= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= +github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/chanzuckerberg/go-misc v1.10.3 h1:uqUEZCJS7dm4nPOQ9vPr0KObpJyn0L1nyxmzswRyohI= github.com/chanzuckerberg/go-misc v1.10.3/go.mod h1:FNU4+AalBFCWSxbhu7ePIKJhurEP+tRGxLZiV2ZGmSg= @@ -106,7 +88,7 @@ github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEM github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/codeclysm/extract v2.2.0+incompatible h1:q3wyckoA30bhUSiwdQezMqVhwd8+WGE64/GL//LtUhI= github.com/codeclysm/extract v2.2.0+incompatible/go.mod h1:2nhFMPHiU9At61hz+12bfrlpXSUrOnK+wR+KlGO4Uks= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA= @@ -116,8 +98,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -150,8 +132,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= -github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -177,8 +159,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -270,8 +252,8 @@ github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NF github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= @@ -326,7 +308,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -343,8 +325,8 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= @@ -354,8 +336,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -400,12 +382,12 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index 50d5f53581..0461df7f47 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## [0.115.1](https://github.com/chanzuckerberg/happy/compare/shared-v0.115.0...shared-v0.115.1) (2023-11-02) + + +### Bug Fixes + +* Wait for the pods to appear before failing when migration job runs ([#2671](https://github.com/chanzuckerberg/happy/issues/2671)) ([9f072e9](https://github.com/chanzuckerberg/happy/commit/9f072e93031287688b7e9536d6521d3b5a7744d5)) + +## [0.115.0](https://github.com/chanzuckerberg/happy/compare/shared-v0.114.1...shared-v0.115.0) (2023-10-31) + + +### Features + +* Delete prior ECR images after a stack update ([#2637](https://github.com/chanzuckerberg/happy/issues/2637)) ([ac157f9](https://github.com/chanzuckerberg/happy/commit/ac157f9447eb54ba7f58119c3690bfa08902d637)) + +## [0.114.1](https://github.com/chanzuckerberg/happy/compare/shared-v0.114.0...shared-v0.114.1) (2023-10-26) + + +### Bug Fixes + +* Fix default tags generated by happy infra generate ([#2645](https://github.com/chanzuckerberg/happy/issues/2645)) ([d8b2646](https://github.com/chanzuckerberg/happy/commit/d8b2646c5e0a6b5dac49b2037955d9a1cb82b0e8)) + +## [0.114.0](https://github.com/chanzuckerberg/happy/compare/shared-v0.113.1...shared-v0.114.0) (2023-10-24) + + +### Bug Fixes + +* sync go versions ([#2635](https://github.com/chanzuckerberg/happy/issues/2635)) ([e479c13](https://github.com/chanzuckerberg/happy/commit/e479c136a1f2cf83b4e6b430097e74d5512f31ee)) + ## [0.113.1](https://github.com/chanzuckerberg/happy/compare/shared-v0.113.0...shared-v0.113.1) (2023-10-18) diff --git a/shared/aws/interfaces/ecr.go b/shared/aws/interfaces/ecr.go index 86ceb14a3c..080cdf5d78 100644 --- a/shared/aws/interfaces/ecr.go +++ b/shared/aws/interfaces/ecr.go @@ -13,4 +13,5 @@ type ECRAPI interface { DescribeImageScanFindings(context.Context, *ecr.DescribeImageScanFindingsInput, ...func(*ecr.Options)) (*ecr.DescribeImageScanFindingsOutput, error) BatchGetRepositoryScanningConfiguration(ctx context.Context, params *ecr.BatchGetRepositoryScanningConfigurationInput, optFns ...func(*ecr.Options)) (*ecr.BatchGetRepositoryScanningConfigurationOutput, error) GetRegistryScanningConfiguration(ctx context.Context, params *ecr.GetRegistryScanningConfigurationInput, optFns ...func(*ecr.Options)) (*ecr.GetRegistryScanningConfigurationOutput, error) + BatchDeleteImage(ctx context.Context, params *ecr.BatchDeleteImageInput, optFns ...func(*ecr.Options)) (*ecr.BatchDeleteImageOutput, error) } diff --git a/shared/aws/interfaces/mock_aws_ecr.go b/shared/aws/interfaces/mock_aws_ecr.go index 0ea1635d48..945aef029a 100644 --- a/shared/aws/interfaces/mock_aws_ecr.go +++ b/shared/aws/interfaces/mock_aws_ecr.go @@ -35,6 +35,26 @@ func (m *MockECRAPI) EXPECT() *MockECRAPIMockRecorder { return m.recorder } +// BatchDeleteImage mocks base method. +func (m *MockECRAPI) BatchDeleteImage(arg0 context.Context, arg1 *ecr.BatchDeleteImageInput, arg2 ...func(*ecr.Options)) (*ecr.BatchDeleteImageOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "BatchDeleteImage", varargs...) + ret0, _ := ret[0].(*ecr.BatchDeleteImageOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BatchDeleteImage indicates an expected call of BatchDeleteImage. +func (mr *MockECRAPIMockRecorder) BatchDeleteImage(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BatchDeleteImage", reflect.TypeOf((*MockECRAPI)(nil).BatchDeleteImage), varargs...) +} + // BatchGetImage mocks base method. func (m *MockECRAPI) BatchGetImage(arg0 context.Context, arg1 *ecr.BatchGetImageInput, arg2 ...func(*ecr.Options)) (*ecr.BatchGetImageOutput, error) { m.ctrl.T.Helper() diff --git a/shared/backend/aws/k8s_compute_backend.go b/shared/backend/aws/k8s_compute_backend.go index 16f68a3095..88ec787dbf 100644 --- a/shared/backend/aws/k8s_compute_backend.go +++ b/shared/backend/aws/k8s_compute_backend.go @@ -229,11 +229,56 @@ func (k8s *K8SComputeBackend) RunTask(ctx context.Context, taskDefArn string, la if err != nil { return errors.Wrap(err, "unable to create a k8s job") } + logrus.Infof("Created a k8s job '%s'", jobId) - logrus.Debug("Waiting for all the pods to start") + timeout := int64(600) + watch, err := k8s.ClientSet.BatchV1().Jobs(k8s.KubeConfig.Namespace).Watch(ctx, v1.ListOptions{ + FieldSelector: "metadata.name=" + jobId, + TimeoutSeconds: &timeout, + }) + if err != nil { + return errors.Wrap(err, "unable to start a k8s job watch") + } + + _, err = k8s.ClientSet.BatchV1().Jobs(k8s.KubeConfig.Namespace).Get(ctx, jobId, v1.GetOptions{}) + if err != nil { + return errors.Wrap(err, "k8s job was not created") + } + + events := watch.ResultChan() + for { + event := <-events + if event.Object == nil { + return fmt.Errorf("job '%s' result channel closed", jobId) + } + job, ok := event.Object.(*batchv1.Job) + if !ok { + return fmt.Errorf("unexpected object type: %T", event.Object) + } + + terminate := false + conditions := job.Status.Conditions + for _, condition := range conditions { + switch condition.Type { + case batchv1.JobComplete: + logrus.Infof("k8s job '%s' completed successfully", jobId) + terminate = true + case batchv1.JobFailed: + return errors.Wrapf(err, "k8s job '%s' failed", job.ObjectMeta.Name) + default: + logrus.Debugf("unexpected k8s job '%s' condition: %s", jobId, condition.Type) + terminate = true + } + } + if terminate { + break + } + } + + logrus.Debug("Interrogating pod jobs") podsRef, err := util.IntervalWithTimeout(func() (*corev1.PodList, error) { - pods, err := k8s.getJobPods(ctx, jb.Name) + pods, err := k8s.getJobPods(ctx, jb) if err != nil { return nil, errors.Wrapf(err, "unable to retrieve job pods, will retry") } @@ -254,7 +299,7 @@ func (k8s *K8SComputeBackend) RunTask(ctx context.Context, taskDefArn string, la } return pods, nil - }, 10*time.Second, 5*time.Minute) + }, 10*time.Second, 2*time.Minute) if err != nil { return errors.Wrap(err, "pods did not successfuly start on time") @@ -318,9 +363,18 @@ func (k8s *K8SComputeBackend) getTargetGroupBindings(ctx context.Context, stackN return resources, nil } -func (k8s *K8SComputeBackend) getJobPods(ctx context.Context, taskDefArn string) (*corev1.PodList, error) { - labelSelector := v1.LabelSelector{MatchLabels: map[string]string{"job-name": taskDefArn}} - return k8s.getSelectorPods(ctx, labelSelector) +func (k8s *K8SComputeBackend) getJobPods(ctx context.Context, job *batchv1.Job) (*corev1.PodList, error) { + labelSelector, err := v1.LabelSelectorAsSelector(job.Spec.Selector) + if err != nil { + return nil, errors.Wrapf(err, "unable to parse a secelector: %v", job.Spec.Selector) + } + pods, err := k8s.ClientSet.CoreV1().Pods(k8s.KubeConfig.Namespace).List(ctx, v1.ListOptions{ + LabelSelector: labelSelector.String(), + }) + if err != nil { + return nil, errors.Wrapf(err, "unable to retrieve a list of pods for selector %s", labelSelector.String()) + } + return pods, nil } func (k8s *K8SComputeBackend) getSelectorPods(ctx context.Context, labelSelector v1.LabelSelector) (*corev1.PodList, error) { diff --git a/shared/client/util.go b/shared/client/util.go index 579591b290..34ef9f0d5e 100644 --- a/shared/client/util.go +++ b/shared/client/util.go @@ -21,7 +21,6 @@ func ParseResponse[T interface{}](resp *http.Response, result *T) error { if err != nil { return errors.Wrap(err, "failed to unmarshal response body") } - return nil } diff --git a/shared/config/happy_config.go b/shared/config/happy_config.go index f5c9060656..8445c5882d 100644 --- a/shared/config/happy_config.go +++ b/shared/config/happy_config.go @@ -44,10 +44,11 @@ type EnvironmentContext struct { } type Features struct { - EnableDynamoLocking bool `yaml:"enable_dynamo_locking" json:"enable_dynamo_locking,omitempty"` - EnableHappyApiUsage bool `yaml:"enable_happy_api_usage" json:"enable_happy_api_usage,omitempty"` - EnableECRAutoCreation bool `yaml:"enable_ecr_auto_creation" json:"enable_ecr_auto_creation,omitempty"` - EnableUnifiedConfig bool `yaml:"enable_unified_config" json:"enable_unified_config,omitempty"` + EnableDynamoLocking bool `yaml:"enable_dynamo_locking" json:"enable_dynamo_locking,omitempty"` + EnableHappyApiUsage bool `yaml:"enable_happy_api_usage" json:"enable_happy_api_usage,omitempty"` + EnableECRAutoCreation bool `yaml:"enable_ecr_auto_creation" json:"enable_ecr_auto_creation,omitempty"` + EnableUnifiedConfig bool `yaml:"enable_unified_config" json:"enable_unified_config,omitempty"` + EnableUnusedImageDeletion bool `yaml:"enable_unused_image_deletion" json:"enable_unused_image_deletion,omitempty"` } type HappyApiConfig struct { diff --git a/shared/go.mod b/shared/go.mod index 4ac1baad31..e80a373155 100644 --- a/shared/go.mod +++ b/shared/go.mod @@ -3,35 +3,35 @@ module github.com/chanzuckerberg/happy/shared go 1.20 require ( - cirello.io/dynamolock/v2 v2.0.2 + cirello.io/dynamolock/v2 v2.0.3 github.com/AlecAivazis/survey/v2 v2.3.7 github.com/Masterminds/semver/v3 v3.2.1 - github.com/aws/aws-sdk-go-v2 v1.21.2 - github.com/aws/aws-sdk-go-v2/credentials v1.13.42 - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 - github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 - github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 - github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 - github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 - github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 + github.com/aws/aws-sdk-go-v2 v1.22.2 + github.com/aws/aws-sdk-go-v2/credentials v1.13.43 + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 + github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 + github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 + github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 + github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 github.com/chanzuckerberg/happy/hvm v0.0.0 - github.com/compose-spec/compose-go v1.19.0 + github.com/compose-spec/compose-go v1.20.0 github.com/creasty/defaults v1.7.0 - github.com/docker/docker v24.0.6+incompatible + github.com/docker/docker v24.0.7+incompatible github.com/docker/go-units v0.5.0 github.com/fatih/color v1.15.0 - github.com/go-playground/validator/v10 v10.15.5 + github.com/go-playground/validator/v10 v10.16.0 github.com/golang/mock v1.6.0 github.com/google/go-github/v53 v53.2.0 - github.com/google/uuid v1.3.1 + github.com/google/uuid v1.4.0 github.com/hashicorp/go-getter v1.7.3 github.com/hashicorp/go-multierror v1.1.1 - github.com/hashicorp/go-tfe v1.36.0 + github.com/hashicorp/go-tfe v1.39.2 github.com/hashicorp/go-uuid v1.0.3 - github.com/hashicorp/hcl/v2 v2.18.1 + github.com/hashicorp/hcl/v2 v2.19.1 github.com/hashicorp/terraform-config-inspect v0.0.0-20230522202058-dbe9bfcbfe7a github.com/hetiansu5/urlquery v1.2.7 github.com/jeremywohl/flatten v1.0.1 @@ -42,14 +42,14 @@ require ( github.com/moby/term v0.5.0 github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 github.com/zclconf/go-cty v1.14.1 golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 - golang.org/x/sync v0.4.0 + golang.org/x/sync v0.5.0 gopkg.in/src-d/go-git.v4 v4.13.1 gorm.io/gorm v1.25.5 - k8s.io/kubectl v0.28.2 + k8s.io/kubectl v0.28.3 ) require ( @@ -65,18 +65,18 @@ require ( github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/aws/aws-sdk-go v1.44.122 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/distribution/reference v0.5.0 // indirect @@ -96,9 +96,9 @@ require ( github.com/googleapis/gax-go/v2 v2.11.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect - github.com/hashicorp/go-retryablehttp v0.7.4 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect - github.com/hashicorp/go-slug v0.12.2 // indirect + github.com/hashicorp/go-slug v0.13.2 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d // indirect @@ -144,14 +144,14 @@ require ( google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.56.0 // indirect + google.golang.org/grpc v1.56.3 // indirect gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect ) require ( github.com/aws/aws-sdk-go-v2/config v1.18.44 - github.com/aws/smithy-go v1.15.0 + github.com/aws/smithy-go v1.16.0 github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/go-logr/logr v1.2.4 // indirect @@ -173,19 +173,19 @@ require ( github.com/sirupsen/logrus v1.9.3 golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.12.0 - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/time v0.4.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.28.2 - k8s.io/apimachinery v0.28.2 - k8s.io/client-go v0.28.2 + k8s.io/api v0.28.3 + k8s.io/apimachinery v0.28.3 + k8s.io/client-go v0.28.3 k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect diff --git a/shared/go.sum b/shared/go.sum index 675cf46d3e..6ce040c470 100644 --- a/shared/go.sum +++ b/shared/go.sum @@ -1,5 +1,5 @@ -cirello.io/dynamolock/v2 v2.0.2 h1:4AEs4218aQLB9NfMMc/B9nmPrZZkrDNZXOgMUC0l/As= -cirello.io/dynamolock/v2 v2.0.2/go.mod h1:kC31fXt8CEX0colxFT/4r9RRKfhZLG0PFrJJXM5A24w= +cirello.io/dynamolock/v2 v2.0.3 h1:1v6BSRa3ov/ytEX8hFtY9yMstFQEnMsj9s8+jCXFDxg= +cirello.io/dynamolock/v2 v2.0.3/go.mod h1:0GKOMMD//uxSPfZk/uxgquAI7C5FvGI5AL8B6cEVvLE= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -217,90 +217,72 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= -github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= +github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= -github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.19/go.mod h1:sMgThC49I+7ud4V7stUsJwaaM6W/KYxRHl2A5pZDrE4= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 h1:/+Z/dCO+1QHOlCm7m9G61snvIaDRUTv/HXp+8HdESiY= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25/go.mod h1:JQ0HJ+3LaAKHx3uwRUAfR/tb/gOlgAGPT6mZfIq55Ec= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.46/go.mod h1:A52W+4f5wSS/TnYTFln9ngTi6Ho1IdJKSAEcvrmfYYc= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 h1:lVqqyVoBUy7Kp2sOo9xJtC37FafV2sDtee9qpC5bm3w= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52/go.mod h1:+wabPhA5NvnAA/VSQAHIlfvdDn0nnA7P3S5Lc0Q5UiQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 h1:jlR1Rwjb3z5d1p0sqhNcuCaqdp73H+1O/X8Lc2kBDrY= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43/go.mod h1:X1HGecFASboCkBt1GJRM4a/FDYYogu9AciUoXVsbr4U= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 h1:nLwQrLSBpcZq3MtpTUcpBqPwKL5V/uO/iuYMU+STv68= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71/go.mod h1:Vjebi0MUXOcsV9YCE2Jxqrqq3FchwyIMbaIzm5NmrKw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 h1:NL2HEgcchk/QTa9/8GgrZvmfvCwqCDknvzAOMuvANnU= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1/go.mod h1:ZD/6Xew+gqhnRBg9iRXNYZOhp4BXKfqe7JRrtOnIh8s= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.2/go.mod h1:KdM++ikeFLtf0RX0WHUdF/nugF8uUntGmJS3Ywo7lVo= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.7/go.mod h1:1MNss6sqoIsFGisX92do/5doiUCBrN7EjhZCS/8DUjI= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 h1:TYq4EU2vEEluoaBG0RCPnbibSndTQSzlpbZdmT/YRcs= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1/go.mod h1:1EJb9/tJwI7iqiStZBcmHijQxcgp7dlPuD2YgoZIrJQ= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.7/go.mod h1:eRmcVwDpfeYgamYv+57cqM9hMWw+/TOqwGsbm39JHgc= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 h1:WHi9VKMYGtWt2DzqeYHXzt55aflymO2EZ6axuKla8oU= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11/go.mod h1:pP+91QTpJMvcFTqGky6puHrkBs8oqoB3XOCiGRDaXwI= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 h1:XnUTMYuPGOrQjlTcf9XoRYBLrN7xjzakkK0+QyP8fO0= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 h1:Y2zGozmCogCCQbO2fplC6tZylBTBBgt/2EcdVRRK5go= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1/go.mod h1:J9goPpIjXafA1u3XGJeoHu9WlMp5qAGwWmS1A8LfZVw= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 h1:bOS7hAfvd8+glVAG88WnvRITe5N1vopGFHh10ORe/BI= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1/go.mod h1:cxbA26Kf4UlTb40f5FON22ZPNMyEVmMS82KUJZC1E1w= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 h1:cZhJzuUYDqWEx5aWUeYEK8z0a51o5JV+uAWBpp5zArA= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6/go.mod h1:tQn6wLs+/9umB4Xj1z4RW+EMLWxPxs6ajfM5UcUlhnI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 h1:g2t+hNCOYWICWs0cQLXk86DnXQMXgx1omrAGEpF/d68= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2/go.mod h1:5ngOUsc/7/voqXQ5Mn5T5l9/rWopTMgu7hk+4Fl2AS4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.23.0/go.mod h1:1HkLh8vaL4obF95fne7ZOu7sxomS/+vkBt3/+gqqwE4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 h1:wAG9NailFhGhg8Ngg2YeCtzGmFWc63SYqJKdvN5ZMkE= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0/go.mod h1:ByrosnNlEq6xkA0d+FwB4f0HH/5KWCcgBqVxAt+Rsps= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 h1:WCeS9WZbIqEKCbgIkrHB5jw/9mO2QMYTLPF8wee3v4Y= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7/go.mod h1:uT1paW42RVCVEoAEbWKu98gEI0GMBWUsT/H+pI4ODJQ= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 h1:JCUTmTs7W1yvUCOdONMX7Hjgn7N9pj57y4/ibU4KFp4= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 h1:TA2V0OLAwEooOnCk2ZBgxTPAtb20Fgbkr7IrI/YxbAg= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0/go.mod h1:/1jvJouA9LvRdzQmTFwlvf3RKFXQz3jgL4AcPuaaoO8= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 h1:PH9chTOUwd0PPUEwunePjUYp6QD0KsZvDcUy6VToKVQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0/go.mod h1:4HwGjM2Z7cMaLV1ddXhKeI1o+hRJhp7A0WnvcgjWyRI= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 h1:d6WbsOHHsEMryKLc9oYCmvu4lrV9z9QLSQ5S44KSn0o= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0/go.mod h1:Nt5l6Vn68Hv0JWJ6dcQDKuBAKAfHUZSC9Ln8X/1fUMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.25/go.mod h1:zrjXfehNxd4la9SByaw7KQk4AmGkdmeASpOJezwed0g= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.27/go.mod h1:DfuVY36ixXnsG+uTqnoLWunXAKJ4qjccoFrXUPpj+hs= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 h1:0ZzowXTZABVqnJnwDMlTDP3eeEkuP1r6RYnhSBmgK2o= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36/go.mod h1:zAE5h/4VanzBpqyWoCZX/nJImdsqjjsGt2r3MtbKSFA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.37/go.mod h1:7xBUZyP6LeLc+5Ym9PG7atqw4sR28sBtYcHETik+bPE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 h1:aY45T0Xk+xHHrQPlQrp8IhrgN7k4SL5VF2UXhsmI2rs= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1/go.mod h1:5E/dXkj2ljMIAvuYaFuYwitKJg6ULwsDbUr3g8izVB0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 h1:z9faFYBvadv9HdY+oFBgxqCnew9TK+jp9ccxktB5fl4= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0/go.mod h1:Z6Oq1mXqvgwmUxvMrV/jMkQhwm06A9XO015dzGnS8TM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 h1:NMZiW2pbSW/PFCGT/J6R/8xaiFsF/SDdRN49q0NUhA8= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 h1:ZN3bxw9OYC5D6umLw6f57rNJfGfhg1DIAAcKpzyUTOE= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 h1:xK86ln1cEDa0cUpLaCbFFX/BABPw4ognfzpGfbF4PkY= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1/go.mod h1:eqTdeirkcyBiDviU/N1JMcImS9zEJDn5wOzX3BsU4wU= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 h1:DHZFzwbFXlfw15I0ERlTVB/YH9iHNr2C1axjRpB7/Gg= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 h1:fSCCJuT5i6ht8TqGdZc5Q5K9pz/atrf7qH4iK5C9XzU= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= +github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= @@ -324,9 +306,9 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/compose-spec/compose-go v1.19.0 h1:t68gAcwStDg0hy2kFvqHJIksf6xkqRnlSKfL45/ETqo= -github.com/compose-spec/compose-go v1.19.0/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/compose-spec/compose-go v1.20.0 h1:h4ZKOst1EF/DwZp7dWkb+wbTVE4nEyT9Lc89to84Ol4= +github.com/compose-spec/compose-go v1.20.0/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -340,8 +322,8 @@ github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -392,8 +374,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= -github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -487,8 +469,8 @@ github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -520,14 +502,14 @@ github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+ github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-slug v0.12.2 h1:Gb6nxnV5GI1UVa3aLJGUj66J8AOZFnjIoYalNCp2Cbo= -github.com/hashicorp/go-slug v0.12.2/go.mod h1:JZVtycnZZbiJ4oxpJ/zfhyfBD8XxT4f0uOSyjNLCqFY= -github.com/hashicorp/go-tfe v1.36.0 h1:Wq73gjjDo/f9gkKQ5MVSb+4NNJ6T7c5MVTivA0s/bZ0= -github.com/hashicorp/go-tfe v1.36.0/go.mod h1:awOuTZ4K9F1EJsKBIoxonJlb7Axn3PIb8YeBLtm/G/0= +github.com/hashicorp/go-slug v0.13.2 h1:ArlarJ8w1Rinx4P1N6Sr00t+GmjJWtYZuSEDYPQBErA= +github.com/hashicorp/go-slug v0.13.2/go.mod h1:RA4C+ezyC2nDsiPM5+1djqagveBBJdSN/fM2QCUziYQ= +github.com/hashicorp/go-tfe v1.39.2 h1:2RrFa6UWEJghQVl248Avd9TJE+ii3NqDD75jBEcr/Tg= +github.com/hashicorp/go-tfe v1.39.2/go.mod h1:pc7+wHCH26BaoFP5txiKkM7Coi5PmB9VwNfnnT2XpKE= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= @@ -536,8 +518,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= -github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d h1:9ARUJJ1VVynB176G1HCwleORqCaXm/Vx0uUi0dL26I0= github.com/hashicorp/jsonapi v0.0.0-20210826224640-ee7dae0fb22d/go.mod h1:Yog5+CPEM3c99L1CL2CFCYoSzgWm5vTU58idbRUaLik= github.com/hashicorp/terraform-config-inspect v0.0.0-20230522202058-dbe9bfcbfe7a h1:zKVsrHhIOWiXHYqFrOXfHacOOVDMYv+v/Wx8DUeyySs= @@ -675,8 +657,8 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= @@ -871,8 +853,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -947,8 +929,8 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -970,8 +952,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1238,8 +1220,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.56.0 h1:+y7Bs8rtMd07LeXmL3NxcTLn7mUkbKZqEpPhMNkwJEE= -google.golang.org/grpc v1.56.0/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1295,18 +1277,18 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= -k8s.io/kubectl v0.28.2 h1:fOWOtU6S0smdNjG1PB9WFbqEIMlkzU5ahyHkc7ESHgM= -k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64= +k8s.io/kubectl v0.28.3 h1:H1Peu1O3EbN9zHkJCcvhiJ4NUj6lb88sGPO5wrWIM6k= +k8s.io/kubectl v0.28.3/go.mod h1:RDAudrth/2wQ3Sg46fbKKl4/g+XImzvbsSRZdP2RiyE= k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/shared/util/tf/tf_generator.go b/shared/util/tf/tf_generator.go index 4e77f196d5..2ec3b9381e 100644 --- a/shared/util/tf/tf_generator.go +++ b/shared/util/tf/tf_generator.go @@ -113,6 +113,10 @@ var requiredVariables []variable = []variable{ const requiredTerraformVersion = ">= 1.3" +var tagsAttrs = []string{"TFC_RUN_ID", "TFC_WORKSPACE_NAME", "TFC_WORKSPACE_SLUG", "TFC_CONFIGURATION_VERSION_GIT_BRANCH", + "TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA", "TFC_CONFIGURATION_VERSION_GIT_TAG", "TFC_PROJECT_NAME", + "project", "env", "service", "owner"} + type TfGenerator struct { happyConfig *config.HappyConfig } @@ -394,21 +398,18 @@ func (tf TfGenerator) generateAwsProvider(rootBody *hclwrite.Body, alias, accoun assumeRoleBlockBody.SetAttributeRaw("role_arn", tokens(fmt.Sprintf("\"arn:aws:iam::%s:role/%s\"", accountIdExpr, roleExpr))) defaultTagsBlockBody := awsProviderBody.AppendNewBlock("default_tags", nil).Body() - tagsBlockBody := defaultTagsBlockBody.AppendNewBlock("tags", nil).Body() - tagsAttrs := [...]string{"TFC_RUN_ID", "TFC_WORKSPACE_NAME", "TFC_WORKSPACE_SLUG", "TFC_CONFIGURATION_VERSION_GIT_BRANCH", - "TFC_CONFIGURATION_VERSION_GIT_COMMIT_SHA", "TFC_CONFIGURATION_VERSION_GIT_TAG", "TFC_PROJECT_NAME", - "project", "env", "service", "owner"} + attrs := []hclwrite.ObjectAttrTokens{} + for _, tagAttr := range tagsAttrs { - s := "" - if strings.HasPrefix(tagAttr, "TFC_") { - s = fmt.Sprintf("coalesce(var.%s, \"unknown\")", tagAttr) - } else { - s = fmt.Sprintf("coalesce(var.tags.%s, \"unknown\")", tagAttr) - } - tagsBlockBody.SetAttributeRaw(tagAttr, tokens(s)) + s := fmt.Sprintf("coalesce(var.%s, \"unknown\")", tagAttr) + + attrs = append(attrs, hclwrite.ObjectAttrTokens{Name: tokens(tagAttr), Value: tokens(s)}) } - tagsBlockBody.SetAttributeRaw("managedBy", tokens("terraform")) + attrs = append(attrs, hclwrite.ObjectAttrTokens{Name: tokens("managedBy"), Value: tokens("\"terraform\"")}) + + tks := hclwrite.TokensForObject(attrs) + defaultTagsBlockBody.SetAttributeRaw("tags", tks) awsProviderBody.SetAttributeRaw("allowed_account_ids", tokens(fmt.Sprintf("[\"%s\"]", accountIdExpr))) return nil @@ -502,6 +503,14 @@ func (tf *TfGenerator) GenerateVariables(srcDir string) error { variableBody.SetAttributeValue("default", variable.Default) } } + for _, tag := range tagsAttrs { + variableBody := rootBody.AppendNewBlock("variable", []string{tag}).Body() + tokens := hclwrite.TokensForTraversal(hcl.Traversal{ + hcl.TraverseRoot{Name: "string"}, + }) + variableBody.SetAttributeRaw("type", tokens) + variableBody.SetAttributeValue("default", cty.StringVal("unknown")) + } _, err = tfFile.Write(hclFile.Bytes()) diff --git a/terraform/modules/happy-cloudfront/CHANGELOG.md b/terraform/modules/happy-cloudfront/CHANGELOG.md index 011cb29c5f..69a1bfd462 100644 --- a/terraform/modules/happy-cloudfront/CHANGELOG.md +++ b/terraform/modules/happy-cloudfront/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [1.1.0](https://github.com/chanzuckerberg/happy/compare/happy-cloudfront-v1.0.1...happy-cloudfront-v1.1.0) (2023-11-02) + + +### Features + +* separate configuration of allow methods and allowed cache methods ([#2667](https://github.com/chanzuckerberg/happy/issues/2667)) ([af4518a](https://github.com/chanzuckerberg/happy/commit/af4518ac1cc90096294b2bb1c629e62db2f6b700)) + +## [1.0.1](https://github.com/chanzuckerberg/happy/compare/happy-cloudfront-v1.0.0...happy-cloudfront-v1.0.1) (2023-10-31) + + +### Bug Fixes + +* redirect HTTP traffic to HTTPS from viewer to CloudFront ([#2665](https://github.com/chanzuckerberg/happy/issues/2665)) ([fd95af9](https://github.com/chanzuckerberg/happy/commit/fd95af94e710d05becd2a769f6afe5c3be2ee532)) + ## 1.0.0 (2023-10-03) diff --git a/terraform/modules/happy-cloudfront/README.md b/terraform/modules/happy-cloudfront/README.md index 23d32d0d1d..df302384db 100644 --- a/terraform/modules/happy-cloudfront/README.md +++ b/terraform/modules/happy-cloudfront/README.md @@ -33,8 +33,9 @@ | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| +| [allowed\_methods](#input\_allowed\_methods) | The allowed HTTP methods for the CloudFront distribution. | `set(string)` |
[
"DELETE",
"GET",
"HEAD",
"OPTIONS",
"PATCH",
"POST",
"PUT"
]
| no | | [cache](#input\_cache) | The cache settings for the CloudFront distribution. |
object({
min_ttl = optional(number, 0)
default_ttl = optional(number, 300)
max_ttl = optional(number, 300)
compress = optional(bool, true)
})
| `{}` | no | -| [cache\_allowed\_methods](#input\_cache\_allowed\_methods) | The allowed methods for the CloudFront distribution. | `set(string)` |
[
"GET",
"HEAD"
]
| no | +| [cache\_allowed\_methods](#input\_cache\_allowed\_methods) | The allowed cache methods for the CloudFront distribution. | `set(string)` |
[
"GET",
"HEAD"
]
| no | | [cache\_policy\_id](#input\_cache\_policy\_id) | The cache policy ID for the CloudFront distribution. | `string` | `"4135ea2d-6df8-44a3-9df3-4b5a84be39ad"` | no | | [frontend](#input\_frontend) | The domain name and zone ID the user will see. |
object({
domain_name = string
zone_id = string
})
| n/a | yes | | [geo\_restriction\_locations](#input\_geo\_restriction\_locations) | The countries to whitelist for the CloudFront distribution. | `set(string)` |
[
"US"
]
| no | diff --git a/terraform/modules/happy-cloudfront/main.tf b/terraform/modules/happy-cloudfront/main.tf index aa8a6781a0..3f0a4bbb21 100644 --- a/terraform/modules/happy-cloudfront/main.tf +++ b/terraform/modules/happy-cloudfront/main.tf @@ -45,9 +45,9 @@ resource "aws_cloudfront_distribution" "this" { } default_cache_behavior { - viewer_protocol_policy = "https-only" + viewer_protocol_policy = "redirect-to-https" target_origin_id = local.origin_id - allowed_methods = var.cache_allowed_methods + allowed_methods = var.allowed_methods cached_methods = var.cache_allowed_methods origin_request_policy_id = var.origin_request_policy_id cache_policy_id = var.cache_policy_id @@ -90,4 +90,4 @@ resource "aws_route53_record" "alias_ipv6" { zone_id = aws_cloudfront_distribution.this.hosted_zone_id evaluate_target_health = false } -} \ No newline at end of file +} diff --git a/terraform/modules/happy-cloudfront/variables.tf b/terraform/modules/happy-cloudfront/variables.tf index c03033a53b..261f987d38 100644 --- a/terraform/modules/happy-cloudfront/variables.tf +++ b/terraform/modules/happy-cloudfront/variables.tf @@ -33,7 +33,13 @@ variable "geo_restriction_locations" { variable "cache_allowed_methods" { type = set(string) default = ["GET", "HEAD"] - description = "The allowed methods for the CloudFront distribution." + description = "The allowed cache methods for the CloudFront distribution." +} + +variable "allowed_methods" { + type = set(string) + default = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"] + description = "The allowed HTTP methods for the CloudFront distribution." } variable "origin_request_policy_id" { diff --git a/terraform/modules/happy-ingress-eks/CHANGELOG.md b/terraform/modules/happy-ingress-eks/CHANGELOG.md index 91284ad584..b6c1d32f1a 100644 --- a/terraform/modules/happy-ingress-eks/CHANGELOG.md +++ b/terraform/modules/happy-ingress-eks/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.10.0](https://github.com/chanzuckerberg/happy/compare/happy-ingress-eks-v2.9.0...happy-ingress-eks-v2.10.0) (2023-11-02) + + +### Features + +* allow multiple hosts to be specified for a stack ([#2669](https://github.com/chanzuckerberg/happy/issues/2669)) ([f2023a3](https://github.com/chanzuckerberg/happy/commit/f2023a329322e59fd603208d8f1cb309e2b7541f)) + ## [2.9.0](https://github.com/chanzuckerberg/happy/compare/happy-ingress-eks-v2.8.0...happy-ingress-eks-v2.9.0) (2023-09-22) diff --git a/terraform/modules/happy-ingress-eks/README.md b/terraform/modules/happy-ingress-eks/README.md index 4e7fdbc0b2..5ec57f5704 100644 --- a/terraform/modules/happy-ingress-eks/README.md +++ b/terraform/modules/happy-ingress-eks/README.md @@ -4,13 +4,14 @@ | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.3 | +| [aws](#requirement\_aws) | >= 4.0 | | [kubernetes](#requirement\_kubernetes) | >= 2.16 | ## Providers | Name | Version | |------|---------| -| [aws](#provider\_aws) | n/a | +| [aws](#provider\_aws) | >= 4.0 | | [kubernetes](#provider\_kubernetes) | >= 2.16 | ## Modules @@ -29,6 +30,7 @@ No modules. | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| +| [additional\_annotations](#input\_additional\_annotations) | Additional annotations to apply to the ingress resource | `map(string)` | `{}` | no | | [aws\_alb\_healthcheck\_interval\_seconds](#input\_aws\_alb\_healthcheck\_interval\_seconds) | The time in seconds to ping the target group for a health check; defaults to a high numbers since k8s also has a healthcheck | `string` | `"300"` | no | | [certificate\_arn](#input\_certificate\_arn) | ACM certificate ARN to attach to the load balancer listener | `string` | n/a | yes | | [cloud\_env](#input\_cloud\_env) | Typically data.terraform\_remote\_state.cloud-env.outputs |
object({
public_subnets : list(string),
private_subnets : list(string),
database_subnets : list(string),
database_subnet_group : string,
vpc_id : string,
vpc_cidr_block : string,
})
| n/a | yes | diff --git a/terraform/modules/happy-ingress-eks/main.tf b/terraform/modules/happy-ingress-eks/main.tf index b26553b628..b1ba830d94 100644 --- a/terraform/modules/happy-ingress-eks/main.tf +++ b/terraform/modules/happy-ingress-eks/main.tf @@ -55,6 +55,7 @@ locals { local.ingress_tls_annotations, local.ingress_base_annotations, local.ingress_wafv2_annotations, + var.additional_annotations, ) additional_ingress_annotations = { diff --git a/terraform/modules/happy-ingress-eks/variables.tf b/terraform/modules/happy-ingress-eks/variables.tf index 2d323802ae..bfad8694dd 100644 --- a/terraform/modules/happy-ingress-eks/variables.tf +++ b/terraform/modules/happy-ingress-eks/variables.tf @@ -121,3 +121,9 @@ variable "aws_alb_healthcheck_interval_seconds" { description = "The time in seconds to ping the target group for a health check; defaults to a high numbers since k8s also has a healthcheck" default = "300" // 60 * 5 } + +variable "additional_annotations" { + type = map(string) + description = "Additional annotations to apply to the ingress resource" + default = {} +} \ No newline at end of file diff --git a/terraform/modules/happy-ingress-eks/versions.tf b/terraform/modules/happy-ingress-eks/versions.tf index aaaa5766e8..b33fd5d449 100644 --- a/terraform/modules/happy-ingress-eks/versions.tf +++ b/terraform/modules/happy-ingress-eks/versions.tf @@ -4,6 +4,10 @@ terraform { source = "hashicorp/kubernetes" version = ">= 2.16" } + aws = { + source = "hashicorp/aws" + version = ">= 4.0" + } } required_version = ">= 1.3" } diff --git a/terraform/modules/happy-nginx-ingress-eks/README.md b/terraform/modules/happy-nginx-ingress-eks/README.md index f4701b076f..0d4279fdfb 100644 --- a/terraform/modules/happy-nginx-ingress-eks/README.md +++ b/terraform/modules/happy-nginx-ingress-eks/README.md @@ -33,6 +33,7 @@ No modules. | [labels](#input\_labels) | Labels to apply to ingress resource | `map(string)` | n/a | yes | | [target\_service\_name](#input\_target\_service\_name) | Name of destination service that the ingress should route to | `string` | n/a | yes | | [target\_service\_port](#input\_target\_service\_port) | Port of destination service that the ingress should route to | `string` | n/a | yes | +| [timeout](#input\_timeout) | Timeout for the ingress resource | `number` | `60` | no | ## Outputs diff --git a/terraform/modules/happy-nginx-ingress-eks/main.tf b/terraform/modules/happy-nginx-ingress-eks/main.tf index 356484260e..6ff9b892fa 100644 --- a/terraform/modules/happy-nginx-ingress-eks/main.tf +++ b/terraform/modules/happy-nginx-ingress-eks/main.tf @@ -5,13 +5,13 @@ resource "kubernetes_ingress_v1" "ingress" { name = var.ingress_name namespace = var.k8s_namespace annotations = { - "cert-manager.io/cluster-issuer" = "nginx-issuer" - "nginx.ingress.kubernetes.io/service-upstream" = "true" - "linkerd.io/inject" = "enabled" - "external-dns.alpha.kubernetes.io/exclude" = "true" + "cert-manager.io/cluster-issuer" = "nginx-issuer" + "nginx.ingress.kubernetes.io/service-upstream" = "true" + "linkerd.io/inject" = "enabled" + "external-dns.alpha.kubernetes.io/exclude" = "true" "nginx.ingress.kubernetes.io/proxy-connect-timeout" = var.timeout - "nginx.ingress.kubernetes.io/proxy-send-timeout" = var.timeout - "nginx.ingress.kubernetes.io/proxy-read-timeout" = var.timeout + "nginx.ingress.kubernetes.io/proxy-send-timeout" = var.timeout + "nginx.ingress.kubernetes.io/proxy-read-timeout" = var.timeout } labels = var.labels } diff --git a/terraform/modules/happy-nginx-ingress-eks/variables.tf b/terraform/modules/happy-nginx-ingress-eks/variables.tf index 93559eacf7..02bd0a2f00 100644 --- a/terraform/modules/happy-nginx-ingress-eks/variables.tf +++ b/terraform/modules/happy-nginx-ingress-eks/variables.tf @@ -40,4 +40,4 @@ variable "timeout" { type = number description = "Timeout for the ingress resource" default = 60 -} +} \ No newline at end of file diff --git a/terraform/modules/happy-service-eks/CHANGELOG.md b/terraform/modules/happy-service-eks/CHANGELOG.md index 487a8bdfa7..ccaf518a11 100644 --- a/terraform/modules/happy-service-eks/CHANGELOG.md +++ b/terraform/modules/happy-service-eks/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [3.19.0](https://github.com/chanzuckerberg/happy/compare/happy-service-eks-v3.18.1...happy-service-eks-v3.19.0) (2023-11-02) + + +### Features + +* allow multiple hosts to be specified for a stack ([#2669](https://github.com/chanzuckerberg/happy/issues/2669)) ([f2023a3](https://github.com/chanzuckerberg/happy/commit/f2023a329322e59fd603208d8f1cb309e2b7541f)) +* CCIE-2069: Add liveness and readiness timeouts ([#2664](https://github.com/chanzuckerberg/happy/issues/2664)) ([aa5734a](https://github.com/chanzuckerberg/happy/commit/aa5734afa18a40f011975f2557205fd1bea0bdd3)) + +## [3.18.1](https://github.com/chanzuckerberg/happy/compare/happy-service-eks-v3.18.0...happy-service-eks-v3.18.1) (2023-10-31) + + +### Bug Fixes + +* Do not create a pod disruption budget for deployment with the desired_count=max_unavailable_count ([#2663](https://github.com/chanzuckerberg/happy/issues/2663)) ([6a63976](https://github.com/chanzuckerberg/happy/commit/6a639761fe383fc01b3707e82c7840a22c0a74d7)) + +## [3.18.0](https://github.com/chanzuckerberg/happy/compare/happy-service-eks-v3.17.2...happy-service-eks-v3.18.0) (2023-10-24) + + +### Features + +* Enable support for pod disruption budgets and pod anti-affinity rules ([#2532](https://github.com/chanzuckerberg/happy/issues/2532)) ([71e7cd6](https://github.com/chanzuckerberg/happy/commit/71e7cd6b49aa1a3f7411fee8bf0e88c9b30df625)) + ## [3.17.2](https://github.com/chanzuckerberg/happy/compare/happy-service-eks-v3.17.1...happy-service-eks-v3.17.2) (2023-10-16) diff --git a/terraform/modules/happy-service-eks/README.md b/terraform/modules/happy-service-eks/README.md index 5463512dca..f6d7acd86f 100644 --- a/terraform/modules/happy-service-eks/README.md +++ b/terraform/modules/happy-service-eks/README.md @@ -23,6 +23,7 @@ | [ecr](#module\_ecr) | git@github.com:chanzuckerberg/cztack//aws-ecr-repo | v0.59.0 | | [iam\_service\_account](#module\_iam\_service\_account) | ../happy-iam-service-account-eks | n/a | | [ingress](#module\_ingress) | ../happy-ingress-eks | n/a | +| [ingress\_exclude\_external\_dns](#module\_ingress\_exclude\_external\_dns) | ../happy-ingress-eks | n/a | | [mesh-access-control](#module\_mesh-access-control) | ../happy-mesh-access-control | n/a | | [nginx-ingress](#module\_nginx-ingress) | ../happy-nginx-ingress-eks | n/a | @@ -35,6 +36,7 @@ | [kubernetes_deployment_v1.deployment](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment_v1) | resource | | [kubernetes_horizontal_pod_autoscaler_v1.hpa](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/horizontal_pod_autoscaler_v1) | resource | | [kubernetes_manifest.this](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/manifest) | resource | +| [kubernetes_pod_disruption_budget_v1.pdb](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/pod_disruption_budget_v1) | resource | | [kubernetes_service_v1.service](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service_v1) | resource | | [random_pet.this](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet) | resource | | [aws_lb.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/lb) | data source | @@ -48,7 +50,6 @@ | [additional\_env\_vars](#input\_additional\_env\_vars) | Additional environment variables to add to the task definition | `map(string)` | `{}` | no | | [additional\_env\_vars\_from\_config\_maps](#input\_additional\_env\_vars\_from\_config\_maps) | Additional environment variables to add to the container from the following config maps |
object({
items : optional(list(string), []),
prefix : optional(string, ""),
})
|
{
"items": [],
"prefix": ""
}
| no | | [additional\_env\_vars\_from\_secrets](#input\_additional\_env\_vars\_from\_secrets) | Additional environment variables to add to the container from the following secrets |
object({
items : optional(list(string), []),
prefix : optional(string, ""),
})
|
{
"items": [],
"prefix": ""
}
| no | -| [additional\_node\_selectors](#input\_additional\_node\_selectors) | Additional node selector to add to the pods. | `map(string)` | `{}` | no | | [additional\_pod\_labels](#input\_additional\_pod\_labels) | Additional labels to add to the pods. | `map(string)` | `{}` | no | | [additional\_volumes\_from\_config\_maps](#input\_additional\_volumes\_from\_config\_maps) | Additional volumes to add to the container from the following config maps |
object({
items : optional(list(string), []),
})
|
{
"items": []
}
| no | | [additional\_volumes\_from\_secrets](#input\_additional\_volumes\_from\_secrets) | Additional volumes to add to the container from the following secrets |
object({
items : optional(list(string), []),
base_dir : optional(string, "/var"),
})
|
{
"base_dir": "/var",
"items": []
}
| no | @@ -71,17 +72,20 @@ | [ingress\_security\_groups](#input\_ingress\_security\_groups) | A list of security groups that should be allowed to communicate with the ALB ingress. Currently only used when the service\_type is VPC. | `list(string)` | `[]` | no | | [initial\_delay\_seconds](#input\_initial\_delay\_seconds) | The initial delay in seconds for the liveness and readiness probes. | `number` | `30` | no | | [k8s\_namespace](#input\_k8s\_namespace) | K8S namespace for this service | `string` | n/a | yes | +| [liveness\_timeout\_seconds](#input\_liveness\_timeout\_seconds) | Timeout for liveness probe. | `number` | `30` | no | | [max\_count](#input\_max\_count) | The maximum number of instances of this task that should be running across our cluster | `number` | `2` | no | +| [max\_unavailable\_count](#input\_max\_unavailable\_count) | The maximum number or percentage of pods that can be unavailable during a rolling update. For example: `1` or `20%` | `string` | `"1"` | no | | [memory](#input\_memory) | Memory in megabits per pod | `string` | `"100Mi"` | no | | [memory\_requests](#input\_memory\_requests) | Memory requests per pod | `string` | `"10Mi"` | no | | [period\_seconds](#input\_period\_seconds) | The period in seconds used for the liveness and readiness probes. | `number` | `3` | no | | [platform\_architecture](#input\_platform\_architecture) | The platform to deploy to (valid values: `amd64`, `arm64`). Defaults to `amd64`. | `string` | `"amd64"` | no | +| [readiness\_timeout\_seconds](#input\_readiness\_timeout\_seconds) | Readiness probe timeout seconds | `number` | `30` | no | | [regional\_wafv2\_arn](#input\_regional\_wafv2\_arn) | A WAF to protect the EKS Ingress if needed | `string` | `null` | no | -| [routing](#input\_routing) | Routing configuration for the ingress |
object({
method : optional(string, "DOMAIN")
host_match : string
group_name : string
alb : optional(object({
name : string,
listener_port : number,
}), null)
priority : number
path : optional(string, "/*")
service_name : string
port : number
service_port : number
alb_idle_timeout : optional(number, 60) // in seconds
service_scheme : optional(string, "HTTP")
scheme : optional(string, "HTTP")
success_codes : optional(string, "200-499")
service_type : string
service_mesh : bool
allow_mesh_services : optional(list(object({
service : optional(string, null),
stack : optional(string, null),
service_account_name : optional(string, null),
})), null)
oidc_config : optional(object({
issuer : string
authorizationEndpoint : string
tokenEndpoint : string
userInfoEndpoint : string
secretName : string
}), {
issuer = ""
authorizationEndpoint = ""
tokenEndpoint = ""
userInfoEndpoint = ""
secretName = ""
})
bypasses : optional(map(object({
paths = optional(set(string), [])
methods = optional(set(string), [])
})))
})
| n/a | yes | +| [routing](#input\_routing) | Routing configuration for the ingress |
object({
method : optional(string, "DOMAIN")
host_match : string
additional_hostnames : optional(set(string), [])
group_name : string
alb : optional(object({
name : string,
listener_port : number,
}), null)
priority : number
path : optional(string, "/*")
service_name : string
port : number
service_port : number
alb_idle_timeout : optional(number, 60) // in seconds
service_scheme : optional(string, "HTTP")
scheme : optional(string, "HTTP")
success_codes : optional(string, "200-499")
service_type : string
service_mesh : bool
allow_mesh_services : optional(list(object({
service : optional(string, null),
stack : optional(string, null),
service_account_name : optional(string, null),
})), null)
oidc_config : optional(object({
issuer : string
authorizationEndpoint : string
tokenEndpoint : string
userInfoEndpoint : string
secretName : string
}), {
issuer = ""
authorizationEndpoint = ""
tokenEndpoint = ""
userInfoEndpoint = ""
secretName = ""
})
bypasses : optional(map(object({
paths = optional(set(string), [])
methods = optional(set(string), [])
})))
})
| n/a | yes | | [scaling\_cpu\_threshold\_percentage](#input\_scaling\_cpu\_threshold\_percentage) | The CPU threshold percentage at which we should scale up | `number` | `80` | no | | [scan\_on\_push](#input\_scan\_on\_push) | Whether to enable image scan on push, disabled by default. | `bool` | `false` | no | | [service\_endpoints](#input\_service\_endpoints) | Service endpoints to be injected for service discovery | `map(string)` | `{}` | no | -| [sidecars](#input\_sidecars) | Map of sidecar containers to be deployed alongside the service |
map(object({
image : string
tag : string
port : optional(number, 80)
scheme : optional(string, "HTTP")
memory : optional(string, "100Mi")
cpu : optional(string, "100m")
image_pull_policy : optional(string, "IfNotPresent")
health_check_path : optional(string, "/")
initial_delay_seconds : optional(number, 30),
period_seconds : optional(number, 3),
}))
| `{}` | no | +| [sidecars](#input\_sidecars) | Map of sidecar containers to be deployed alongside the service |
map(object({
image : string
tag : string
port : optional(number, 80)
scheme : optional(string, "HTTP")
memory : optional(string, "100Mi")
cpu : optional(string, "100m")
image_pull_policy : optional(string, "IfNotPresent")
health_check_path : optional(string, "/")
initial_delay_seconds : optional(number, 30),
period_seconds : optional(number, 3),
liveness_timeout_seconds : optional(number, 30),
readiness_timeout_seconds : optional(number, 30),
}))
| `{}` | no | | [stack\_name](#input\_stack\_name) | Happy Path stack name | `string` | n/a | yes | | [tag\_mutability](#input\_tag\_mutability) | Whether to allow tag mutability or not. When set to `true` tags can be overwritten (default). When set to `false` tags are immutable. | `bool` | `true` | no | | [tags](#input\_tags) | Standard tags to attach to all happy services |
object({
env : string,
owner : string,
project : string,
service : string,
managedBy : string,
})
|
{
"env": "ADDTAGS",
"managedBy": "ADDTAGS",
"owner": "ADDTAGS",
"project": "ADDTAGS",
"service": "ADDTAGS"
}
| no | diff --git a/terraform/modules/happy-service-eks/main.tf b/terraform/modules/happy-service-eks/main.tf index 597e3a8eff..e841b1c6f7 100644 --- a/terraform/modules/happy-service-eks/main.tf +++ b/terraform/modules/happy-service-eks/main.tf @@ -3,6 +3,9 @@ data "aws_region" "current" {} locals { tags_string = join(",", [for key, val in local.routing_tags : "${key}=${val}"]) service_type = (var.routing.service_type == "PRIVATE" || var.routing.service_mesh) ? "ClusterIP" : "NodePort" + match_labels = { + app = var.routing.service_name + } labels = merge({ app = var.routing.service_name "app.kubernetes.io/name" = var.stack_name @@ -10,6 +13,24 @@ locals { "app.kubernetes.io/part-of" = var.stack_name "app.kubernetes.io/managed-by" = "happy" }, var.additional_pod_labels) + + external_dns_exclude_annotation = { + "external-dns.alpha.kubernetes.io/exclude" = "true" + } + + base_ingress_variables = { + ingress_name = var.routing.service_name + target_service_port = var.routing.service_mesh ? 443 : var.routing.service_port + target_service_name = var.routing.service_mesh ? "nginx-ingress-ingress-nginx-controller" : var.routing.service_name + target_service_scheme = var.routing.service_mesh ? "HTTPS" : var.routing.service_scheme + cloud_env = var.cloud_env + k8s_namespace = var.routing.service_mesh ? "nginx-encrypted-ingress" : var.k8s_namespace + certificate_arn = var.certificate_arn + tags_string = local.tags_string + labels = local.labels + regional_wafv2_arn = var.regional_wafv2_arn + ingress_security_groups = var.ingress_security_groups + } } resource "kubernetes_deployment_v1" "deployment" { @@ -48,9 +69,7 @@ resource "kubernetes_deployment_v1" "deployment" { } selector { - match_labels = { - app = var.routing.service_name - } + match_labels = local.match_labels } template { @@ -79,9 +98,7 @@ resource "kubernetes_deployment_v1" "deployment" { spec { service_account_name = var.aws_iam.service_account_name == null ? module.iam_service_account.service_account_name : var.aws_iam.service_account_name - node_selector = merge({ - "kubernetes.io/arch" = var.gpu != null ? "amd64" : var.platform_architecture - }, var.gpu != null ? { "nvidia.com/gpu.present" = "true" } : {}, var.additional_node_selectors) + dynamic "toleration" { for_each = var.gpu != null ? [1] : [] content { @@ -99,6 +116,51 @@ resource "kubernetes_deployment_v1" "deployment" { } } + topology_spread_constraint { + max_skew = 3 + #TODO: Once min_domains are supported, uncomment line below. https://github.com/hashicorp/terraform-provider-kubernetes/issues/2292 + #min_domains = 3 + topology_key = "topology.kubernetes.io/zone" + when_unsatisfiable = "DoNotSchedule" + label_selector { + match_labels = local.match_labels + } + } + + affinity { + node_affinity { + required_during_scheduling_ignored_during_execution { + node_selector_term { + match_expressions { + key = "kubernetes.io/arch" + operator = "In" + values = [var.platform_architecture] + } + } + } + } + pod_anti_affinity { + preferred_during_scheduling_ignored_during_execution { + weight = 100 + pod_affinity_term { + topology_key = "kubernetes.io/hostname" + label_selector { + match_labels = local.match_labels + } + } + } + preferred_during_scheduling_ignored_during_execution { + weight = 100 + pod_affinity_term { + topology_key = "topology.kubernetes.io/zone" + label_selector { + match_labels = local.match_labels + } + } + } + } + } + restart_policy = "Always" container { @@ -223,6 +285,7 @@ resource "kubernetes_deployment_v1" "deployment" { initial_delay_seconds = var.initial_delay_seconds period_seconds = var.period_seconds + timeout_seconds = var.liveness_timeout_seconds } readiness_probe { @@ -234,6 +297,7 @@ resource "kubernetes_deployment_v1" "deployment" { initial_delay_seconds = var.initial_delay_seconds period_seconds = var.period_seconds + timeout_seconds = var.readiness_timeout_seconds } } @@ -269,6 +333,7 @@ resource "kubernetes_deployment_v1" "deployment" { initial_delay_seconds = container.value.initial_delay_seconds period_seconds = container.value.period_seconds + timeout_seconds = container.value.liveness_timeout_seconds } readiness_probe { @@ -280,6 +345,7 @@ resource "kubernetes_deployment_v1" "deployment" { initial_delay_seconds = container.value.initial_delay_seconds period_seconds = container.value.period_seconds + timeout_seconds = container.value.readiness_timeout_seconds } dynamic "volume_mount" { @@ -412,29 +478,51 @@ resource "kubernetes_service_v1" "service" { } module "ingress" { - count = (var.routing.service_type == "EXTERNAL" || var.routing.service_type == "INTERNAL" || var.routing.service_type == "VPC") ? 1 : 0 - - source = "../happy-ingress-eks" - ingress_name = var.routing.service_name - target_service_port = var.routing.service_mesh ? 443 : var.routing.service_port - target_service_name = var.routing.service_mesh ? "nginx-ingress-ingress-nginx-controller" : var.routing.service_name - target_service_scheme = var.routing.service_mesh ? "HTTPS" : var.routing.service_scheme - cloud_env = var.cloud_env - k8s_namespace = var.routing.service_mesh ? "nginx-encrypted-ingress" : var.k8s_namespace - certificate_arn = var.certificate_arn - tags_string = local.tags_string - routing = var.routing - labels = local.labels - regional_wafv2_arn = var.regional_wafv2_arn - ingress_security_groups = var.ingress_security_groups + count = (var.routing.service_type == "EXTERNAL" || var.routing.service_type == "INTERNAL" || var.routing.service_type == "VPC") ? 1 : 0 + source = "../happy-ingress-eks" + + ingress_name = local.base_ingress_variables.ingress_name + target_service_port = local.base_ingress_variables.target_service_port + target_service_name = local.base_ingress_variables.target_service_name + target_service_scheme = local.base_ingress_variables.target_service_scheme + cloud_env = local.base_ingress_variables.cloud_env + k8s_namespace = local.base_ingress_variables.k8s_namespace + certificate_arn = local.base_ingress_variables.certificate_arn + tags_string = local.base_ingress_variables.tags_string + labels = local.base_ingress_variables.labels + regional_wafv2_arn = local.base_ingress_variables.regional_wafv2_arn + ingress_security_groups = local.base_ingress_variables.ingress_security_groups + + routing = var.routing +} + +module "ingress_exclude_external_dns" { + for_each = (var.routing.service_type == "EXTERNAL" || var.routing.service_type == "INTERNAL" || var.routing.service_type == "VPC") ? var.routing.additional_hostnames : [] + source = "../happy-ingress-eks" + + ingress_name = replace("${local.base_ingress_variables.ingress_name}-${each.value}", ".", "-") + target_service_port = local.base_ingress_variables.target_service_port + target_service_name = local.base_ingress_variables.target_service_name + target_service_scheme = local.base_ingress_variables.target_service_scheme + cloud_env = local.base_ingress_variables.cloud_env + k8s_namespace = local.base_ingress_variables.k8s_namespace + certificate_arn = local.base_ingress_variables.certificate_arn + tags_string = local.base_ingress_variables.tags_string + labels = local.base_ingress_variables.labels + regional_wafv2_arn = local.base_ingress_variables.regional_wafv2_arn + ingress_security_groups = local.base_ingress_variables.ingress_security_groups + + routing = merge(var.routing, { host_match : "" }) + additional_annotations = local.external_dns_exclude_annotation } module "nginx-ingress" { - count = ((var.routing.service_type == "EXTERNAL" || var.routing.service_type == "INTERNAL" || var.routing.service_type == "VPC") && var.routing.service_mesh) ? 1 : 0 - source = "../happy-nginx-ingress-eks" - ingress_name = "${var.routing.service_name}-nginx" + for_each = ((var.routing.service_type == "EXTERNAL" || var.routing.service_type == "INTERNAL" || var.routing.service_type == "VPC") && var.routing.service_mesh) ? setunion([var.routing.host_match], var.routing.additional_hostnames) : [] + source = "../happy-nginx-ingress-eks" + + ingress_name = replace("${var.routing.service_name}-${each.value}-nginx", ".", "-") k8s_namespace = var.k8s_namespace - host_match = var.routing.host_match + host_match = each.value host_path = replace(var.routing.path, "/\\*$/", "") //NGINX does not support paths that end with * target_service_name = var.routing.service_name target_service_port = var.routing.service_port @@ -475,3 +563,19 @@ resource "kubernetes_horizontal_pod_autoscaler_v1" "hpa" { } } } + +resource "kubernetes_pod_disruption_budget_v1" "pdb" { + count = var.routing.service_type == "IMAGE_TEMPLATE" || var.max_unavailable_count >= var.desired_count ? 0 : 1 + metadata { + name = var.routing.service_name + namespace = var.k8s_namespace + labels = local.labels + } + + spec { + max_unavailable = var.max_unavailable_count + selector { + match_labels = local.match_labels + } + } +} diff --git a/terraform/modules/happy-service-eks/target_group_only.tf b/terraform/modules/happy-service-eks/target_group_only.tf index b8d3f88450..933ec3733a 100644 --- a/terraform/modules/happy-service-eks/target_group_only.tf +++ b/terraform/modules/happy-service-eks/target_group_only.tf @@ -6,7 +6,7 @@ resource "random_pet" "this" { locals { # only hyphens and a max of 32 characters - target_group_name = replace(substr("${random_pet.this.id}", 0, 32), "_", "-") + target_group_name = replace(substr(random_pet.this.id, 0, 32), "_", "-") } data "aws_lb" "this" { diff --git a/terraform/modules/happy-service-eks/variables.tf b/terraform/modules/happy-service-eks/variables.tf index b47cfdbfdb..64e20c4515 100644 --- a/terraform/modules/happy-service-eks/variables.tf +++ b/terraform/modules/happy-service-eks/variables.tf @@ -137,6 +137,18 @@ variable "period_seconds" { description = "The period in seconds used for the liveness and readiness probes." } +variable "liveness_timeout_seconds" { + type = number + default = 30 + description = "Timeout for liveness probe." +} + +variable "readiness_timeout_seconds" { + type = number + default = 30 + description = "Readiness probe timeout seconds" +} + variable "initial_delay_seconds" { type = number default = 30 @@ -239,6 +251,7 @@ variable "routing" { type = object({ method : optional(string, "DOMAIN") host_match : string + additional_hostnames : optional(set(string), []) group_name : string alb : optional(object({ name : string, @@ -298,6 +311,8 @@ variable "sidecars" { health_check_path : optional(string, "/") initial_delay_seconds : optional(number, 30), period_seconds : optional(number, 3), + liveness_timeout_seconds : optional(number, 30), + readiness_timeout_seconds : optional(number, 30), })) default = {} description = "Map of sidecar containers to be deployed alongside the service" @@ -347,12 +362,6 @@ variable "ingress_security_groups" { default = [] } -variable "additional_node_selectors" { - type = map(string) - description = "Additional node selector to add to the pods." - default = {} -} - variable "tag_mutability" { type = bool description = "Whether to allow tag mutability or not. When set to `true` tags can be overwritten (default). When set to `false` tags are immutable." @@ -363,4 +372,10 @@ variable "scan_on_push" { type = bool description = "Whether to enable image scan on push, disabled by default." default = false -} \ No newline at end of file +} + +variable "max_unavailable_count" { + type = string + description = "The maximum number or percentage of pods that can be unavailable during a rolling update. For example: `1` or `20%`" + default = "1" +} diff --git a/terraform/modules/happy-stack-ecs/CHANGELOG.md b/terraform/modules/happy-stack-ecs/CHANGELOG.md index 88f37dd1c4..b119dac1ba 100644 --- a/terraform/modules/happy-stack-ecs/CHANGELOG.md +++ b/terraform/modules/happy-stack-ecs/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.2.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-ecs-v2.1.0...happy-stack-ecs-v2.2.0) (2023-10-24) + + +### Features + +* bump happy provider version ([#2508](https://github.com/chanzuckerberg/happy/issues/2508)) ([334cb3e](https://github.com/chanzuckerberg/happy/commit/334cb3e673a1e362973fabfa268649a6baa32f5d)) + ## [2.1.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-ecs-v2.0.1...happy-stack-ecs-v2.1.0) (2023-08-29) diff --git a/terraform/modules/happy-stack-ecs/README.md b/terraform/modules/happy-stack-ecs/README.md index 8c4f02b941..2cca5dc0df 100644 --- a/terraform/modules/happy-stack-ecs/README.md +++ b/terraform/modules/happy-stack-ecs/README.md @@ -6,7 +6,7 @@ | [terraform](#requirement\_terraform) | >= 1.3 | | [aws](#requirement\_aws) | >= 5.14 | | [datadog](#requirement\_datadog) | >= 3.20.0 | -| [happy](#requirement\_happy) | >= 0.97.1 | +| [happy](#requirement\_happy) | >= 0.108.0 | ## Providers @@ -14,7 +14,7 @@ |------|---------| | [aws](#provider\_aws) | >= 5.14 | | [datadog](#provider\_datadog) | >= 3.20.0 | -| [happy](#provider\_happy) | >= 0.97.1 | +| [happy](#provider\_happy) | >= 0.108.0 | ## Modules diff --git a/terraform/modules/happy-stack-ecs/versions.tf b/terraform/modules/happy-stack-ecs/versions.tf index b86391d9c3..b311dc1176 100644 --- a/terraform/modules/happy-stack-ecs/versions.tf +++ b/terraform/modules/happy-stack-ecs/versions.tf @@ -10,7 +10,7 @@ terraform { } happy = { source = "chanzuckerberg/happy" - version = ">= 0.97.1" + version = ">= 0.108.0" } } required_version = ">= 1.3" diff --git a/terraform/modules/happy-stack-eks/CHANGELOG.md b/terraform/modules/happy-stack-eks/CHANGELOG.md index 8782d7e91c..f89a8a6b6c 100644 --- a/terraform/modules/happy-stack-eks/CHANGELOG.md +++ b/terraform/modules/happy-stack-eks/CHANGELOG.md @@ -1,5 +1,35 @@ # Changelog +## [4.23.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-eks-v4.22.0...happy-stack-eks-v4.23.0) (2023-11-02) + + +### Features + +* allow multiple hosts to be specified for a stack ([#2669](https://github.com/chanzuckerberg/happy/issues/2669)) ([f2023a3](https://github.com/chanzuckerberg/happy/commit/f2023a329322e59fd603208d8f1cb309e2b7541f)) +* CCIE-2069: Add liveness and readiness timeouts ([#2664](https://github.com/chanzuckerberg/happy/issues/2664)) ([aa5734a](https://github.com/chanzuckerberg/happy/commit/aa5734afa18a40f011975f2557205fd1bea0bdd3)) + +## [4.22.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-eks-v4.21.0...happy-stack-eks-v4.22.0) (2023-10-31) + + +### Features + +* allow services to specify additional env vars ([#2647](https://github.com/chanzuckerberg/happy/issues/2647)) ([12fd0a1](https://github.com/chanzuckerberg/happy/commit/12fd0a12cb4b586972ae5cd0a4565c7611505d63)) + +## [4.21.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-eks-v4.20.0...happy-stack-eks-v4.21.0) (2023-10-24) + + +### Features + +* bump happy provider version ([#2508](https://github.com/chanzuckerberg/happy/issues/2508)) ([334cb3e](https://github.com/chanzuckerberg/happy/commit/334cb3e673a1e362973fabfa268649a6baa32f5d)) +* Enable support for pod disruption budgets and pod anti-affinity rules ([#2532](https://github.com/chanzuckerberg/happy/issues/2532)) ([71e7cd6](https://github.com/chanzuckerberg/happy/commit/71e7cd6b49aa1a3f7411fee8bf0e88c9b30df625)) + +## [4.20.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-eks-v4.19.0...happy-stack-eks-v4.20.0) (2023-10-23) + + +### Features + +* allow stacks to change cpu/mem requests ([#2614](https://github.com/chanzuckerberg/happy/issues/2614)) ([a1affe8](https://github.com/chanzuckerberg/happy/commit/a1affe852cd433cbd7a1e494f97307595e20314b)) + ## [4.19.0](https://github.com/chanzuckerberg/happy/compare/happy-stack-eks-v4.18.0...happy-stack-eks-v4.19.0) (2023-10-03) diff --git a/terraform/modules/happy-stack-eks/README.md b/terraform/modules/happy-stack-eks/README.md index 485583c965..7b6ea4b762 100644 --- a/terraform/modules/happy-stack-eks/README.md +++ b/terraform/modules/happy-stack-eks/README.md @@ -6,7 +6,7 @@ | [terraform](#requirement\_terraform) | >= 1.3 | | [aws](#requirement\_aws) | >= 5.14 | | [datadog](#requirement\_datadog) | >= 3.20.0 | -| [happy](#requirement\_happy) | >= 0.53.5 | +| [happy](#requirement\_happy) | >= 0.108.0 | | [kubernetes](#requirement\_kubernetes) | >= 2.16 | | [random](#requirement\_random) | >= 3.4.3 | | [validation](#requirement\_validation) | 1.0.0 | @@ -16,7 +16,7 @@ | Name | Version | |------|---------| | [datadog](#provider\_datadog) | >= 3.20.0 | -| [happy](#provider\_happy) | >= 0.53.5 | +| [happy](#provider\_happy) | >= 0.108.0 | | [kubernetes](#provider\_kubernetes) | >= 2.16 | | [random](#provider\_random) | >= 3.4.3 | | [validation](#provider\_validation) | 1.0.0 | @@ -48,6 +48,7 @@ | [additional\_env\_vars](#input\_additional\_env\_vars) | Additional environment variables to add to the container | `map(string)` | `{}` | no | | [additional\_env\_vars\_from\_config\_maps](#input\_additional\_env\_vars\_from\_config\_maps) | Additional environment variables to add to the container from the following config maps |
object({
items : optional(list(string), []),
prefix : optional(string, ""),
})
|
{
"items": [],
"prefix": ""
}
| no | | [additional\_env\_vars\_from\_secrets](#input\_additional\_env\_vars\_from\_secrets) | Additional environment variables to add to the container from the following secrets |
object({
items : optional(list(string), []),
prefix : optional(string, ""),
})
|
{
"items": [],
"prefix": ""
}
| no | +| [additional\_hostnames](#input\_additional\_hostnames) | The set of hostnames that will be allowed by the corresponding load balancers and ingress'. These hosts can be configured outside of happy, for instance through a CloudFront distribution. | `set(string)` | `[]` | no | | [additional\_pod\_labels](#input\_additional\_pod\_labels) | Additional labels to add to the pods. | `map(string)` | `{}` | no | | [additional\_volumes\_from\_config\_maps](#input\_additional\_volumes\_from\_config\_maps) | Additional volumes to add to the container from the following config maps |
object({
items : optional(list(string), []),
})
|
{
"items": []
}
| no | | [additional\_volumes\_from\_secrets](#input\_additional\_volumes\_from\_secrets) | Additional volumes to add to the container from the following secrets |
object({
items : optional(list(string), []),
base_dir : optional(string, "/var"),
})
|
{
"base_dir": "/var",
"items": []
}
| no | @@ -59,11 +60,11 @@ | [image\_tags](#input\_image\_tags) | Override image tag for each docker image | `map(string)` | `{}` | no | | [k8s\_namespace](#input\_k8s\_namespace) | K8S namespace for this stack | `string` | n/a | yes | | [routing\_method](#input\_routing\_method) | Traffic routing method for this stack. Valid options are 'DOMAIN', when every service gets a unique domain name, or a 'CONTEXT' when all services share the same domain name, and routing is done by request path. | `string` | `"DOMAIN"` | no | -| [services](#input\_services) | The services you want to deploy as part of this stack. |
map(object({
name : string,
service_type : optional(string, "INTERNAL"),
allow_mesh_services : optional(list(object({
service : optional(string, null),
stack : optional(string, null),
service_account_name : optional(string, null)
})), null),
ingress_security_groups : optional(list(string), []), // Only used for VPC service_type
alb : optional(object({
name : string,
listener_port : number,
}), null), // Only used for TARGET_GROUP_ONLY
desired_count : optional(number, 2),
max_count : optional(number, 2),
scaling_cpu_threshold_percentage : optional(number, 80),
port : optional(number, 80),
scheme : optional(string, "HTTP"),
cmd : optional(list(string), []),
args : optional(list(string), []),
image_pull_policy : optional(string, "IfNotPresent"), // Supported values: IfNotPresent, Always, Never
tag_mutability : optional(bool, true),
scan_on_push : optional(bool, false),
service_port : optional(number, null),
service_scheme : optional(string, "HTTP"),
memory : optional(string, "100Mi"),
memory_requests : optional(string, "100Mi"),
cpu : optional(string, "100m"),
cpu_requests : optional(string, "100m"),
gpu : optional(number, null), // Whole number of GPUs to request, 0 will schedule all available GPUs. Requires GPU-enabled nodes in the cluster, `k8s-device-plugin` installed, platform_architecture = "amd64", and additional_node_selectors = { "nvidia.com/gpu.present" = "true" } present.
health_check_path : optional(string, "/"),
aws_iam : optional(object({
policy_json : optional(string, ""),
service_account_name : optional(string, null),
}), {}),
path : optional(string, "/*"), // Only used for CONTEXT and TARGET_GROUP_ONLY routing
priority : optional(number, 0), // Only used for CONTEXT and TARGET_GROUP_ONLY routing
success_codes : optional(string, "200-499"),
synthetics : optional(bool, false),
initial_delay_seconds : optional(number, 30),
alb_idle_timeout : optional(number, 60) // in seconds
period_seconds : optional(number, 3),
platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64; GPU nodes are amd64 only.
additional_node_selectors : optional(map(string), {}), // For GPU use: { "nvidia.com/gpu.present" = "true" }
bypasses : optional(map(object({ // Only used for INTERNAL service_type
paths = optional(set(string), [])
methods = optional(set(string), [])
})), {})
sidecars : optional(map(object({
image : string
tag : string
port : optional(number, 80),
scheme : optional(string, "HTTP"),
memory : optional(string, "100Mi")
cpu : optional(string, "100m")
image_pull_policy : optional(string, "IfNotPresent") // Supported values: IfNotPresent, Always, Never
health_check_path : optional(string, "/")
initial_delay_seconds : optional(number, 30),
period_seconds : optional(number, 3),
})), {})
}))
| n/a | yes | +| [services](#input\_services) | The services you want to deploy as part of this stack. |
map(object({
name : string,
service_type : optional(string, "INTERNAL"),
allow_mesh_services : optional(list(object({
service : optional(string, null),
stack : optional(string, null),
service_account_name : optional(string, null)
})), null),
ingress_security_groups : optional(list(string), []), // Only used for VPC service_type
alb : optional(object({
name : string,
listener_port : number,
}), null), // Only used for TARGET_GROUP_ONLY
desired_count : optional(number, 2),
max_count : optional(number, 2),
max_unavailable_count : optional(string, "1"),
scaling_cpu_threshold_percentage : optional(number, 80),
port : optional(number, 80),
scheme : optional(string, "HTTP"),
cmd : optional(list(string), []),
args : optional(list(string), []),
image_pull_policy : optional(string, "IfNotPresent"), // Supported values: IfNotPresent, Always, Never
tag_mutability : optional(bool, true),
scan_on_push : optional(bool, false),
service_port : optional(number, null),
service_scheme : optional(string, "HTTP"),
memory : optional(string, "100Mi"),
memory_requests : optional(string, "100Mi"),
cpu : optional(string, "100m"),
cpu_requests : optional(string, "100m"),
gpu : optional(number, null), // Whole number of GPUs to request, 0 will schedule all available GPUs. Requires GPU-enabled nodes in the cluster, `k8s-device-plugin` installed, platform_architecture = "amd64", and additional_node_selectors = { "nvidia.com/gpu.present" = "true" } present.
health_check_path : optional(string, "/"),
aws_iam : optional(object({
policy_json : optional(string, ""),
service_account_name : optional(string, null),
}), {}),
path : optional(string, "/*"), // Only used for CONTEXT and TARGET_GROUP_ONLY routing
priority : optional(number, 0), // Only used for CONTEXT and TARGET_GROUP_ONLY routing
success_codes : optional(string, "200-499"),
synthetics : optional(bool, false),
initial_delay_seconds : optional(number, 30),
alb_idle_timeout : optional(number, 60) // in seconds
period_seconds : optional(number, 3),
liveness_timeout_seconds : optional(number, 30),
readiness_timeout_seconds : optional(number, 30),
platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64; GPU nodes are amd64 only.
additional_node_selectors : optional(map(string), {}), // For GPU use: { "nvidia.com/gpu.present" = "true" }
bypasses : optional(map(object({ // Only used for INTERNAL service_type
paths = optional(set(string), [])
methods = optional(set(string), [])
})), {})
sidecars : optional(map(object({
image : string
tag : string
port : optional(number, 80),
scheme : optional(string, "HTTP"),
memory : optional(string, "100Mi")
cpu : optional(string, "100m")
image_pull_policy : optional(string, "IfNotPresent") // Supported values: IfNotPresent, Always, Never
health_check_path : optional(string, "/")
initial_delay_seconds : optional(number, 30),
period_seconds : optional(number, 3),
liveness_timeout_seconds : optional(number, 30),
readiness_timeout_seconds : optional(number, 30),
})), {})
additional_env_vars : optional(map(string), {}),
}))
| n/a | yes | | [skip\_config\_injection](#input\_skip\_config\_injection) | Skip injecting app configs into the services / tasks | `bool` | `false` | no | | [stack\_name](#input\_stack\_name) | Happy Path stack name | `string` | n/a | yes | | [stack\_prefix](#input\_stack\_prefix) | Do bucket storage paths and db schemas need to be prefixed with the stack name? (Usually '/{stack\_name}' for dev stacks, and '' for staging/prod stacks) | `string` | `""` | no | -| [tasks](#input\_tasks) | The deletion/migration tasks you want to run when a stack comes up and down. |
map(object({
image : string,
memory : optional(string, "10Mi"),
cpu : optional(string, "10m"),
cmd : optional(list(string), []),
args : optional(list(string), []),
platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64
is_cron_job : optional(bool, false),
aws_iam : optional(object({
policy_json : optional(string, ""),
service_account_name : optional(string, null),
}), {}),
cron_schedule : optional(string, "0 0 1 1 *"),
}))
| `{}` | no | +| [tasks](#input\_tasks) | The deletion/migration tasks you want to run when a stack comes up and down. |
map(object({
image : string,
memory : optional(string, "10Mi"),
cpu : optional(string, "10m"),
cmd : optional(list(string), []),
args : optional(list(string), []),
platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64
is_cron_job : optional(bool, false),
aws_iam : optional(object({
policy_json : optional(string, ""),
service_account_name : optional(string, null),
}), {}),
cron_schedule : optional(string, "0 0 1 1 *"),
additional_env_vars : optional(map(string), {}),
}))
| `{}` | no | ## Outputs diff --git a/terraform/modules/happy-stack-eks/main.tf b/terraform/modules/happy-stack-eks/main.tf index 93fa1e60ee..7c9cb3437a 100644 --- a/terraform/modules/happy-stack-eks/main.tf +++ b/terraform/modules/happy-stack-eks/main.tf @@ -167,6 +167,7 @@ module "services" { stack_name = var.stack_name desired_count = each.value.desired_count max_count = try(each.value.max_count, each.value.desired_count) + max_unavailable_count = each.value.max_unavailable_count scaling_cpu_threshold_percentage = each.value.scaling_cpu_threshold_percentage memory = each.value.memory memory_requests = each.value.memory_requests @@ -183,6 +184,8 @@ module "services" { eks_cluster = local.secret["eks_cluster"] initial_delay_seconds = each.value.initial_delay_seconds period_seconds = each.value.period_seconds + liveness_timeout_seconds = each.value.liveness_timeout_seconds + readiness_timeout_seconds = each.value.readiness_timeout_seconds platform_architecture = each.value.platform_architecture image_pull_policy = each.value.image_pull_policy cmd = each.value.cmd @@ -191,27 +194,28 @@ module "services" { ingress_security_groups = each.value.ingress_security_groups routing = { - method = var.routing_method - host_match = each.value.host_match - group_name = each.value.group_name - priority = each.value.priority * local.priority_spread - path = each.value.path - service_name = each.value.service_name - port = each.value.port - service_port = coalesce(each.value.service_port, each.value.port) - scheme = each.value.scheme - service_scheme = each.value.service_scheme - success_codes = each.value.success_codes - service_type = each.value.service_type - service_mesh = var.enable_service_mesh - allow_mesh_services = each.value.allow_mesh_services - oidc_config = local.oidc_config - bypasses = each.value.bypasses - alb = each.value.alb - alb_idle_timeout = each.value.alb_idle_timeout + method = var.routing_method + host_match = each.value.host_match + additional_hostnames = var.additional_hostnames + group_name = each.value.group_name + priority = each.value.priority * local.priority_spread + path = each.value.path + service_name = each.value.service_name + port = each.value.port + service_port = coalesce(each.value.service_port, each.value.port) + scheme = each.value.scheme + service_scheme = each.value.service_scheme + success_codes = each.value.success_codes + service_type = each.value.service_type + service_mesh = var.enable_service_mesh + allow_mesh_services = each.value.allow_mesh_services + oidc_config = local.oidc_config + bypasses = each.value.bypasses + alb = each.value.alb + alb_idle_timeout = each.value.alb_idle_timeout } - additional_env_vars = merge(local.db_env_vars, var.additional_env_vars, local.stack_configs) + additional_env_vars = merge(local.db_env_vars, var.additional_env_vars, local.stack_configs, each.value.additional_env_vars) additional_env_vars_from_config_maps = var.additional_env_vars_from_config_maps additional_env_vars_from_secrets = var.additional_env_vars_from_secrets additional_volumes_from_secrets = var.additional_volumes_from_secrets @@ -242,7 +246,7 @@ module "tasks" { is_cron_job = each.value.is_cron_job cron_schedule = each.value.cron_schedule - additional_env_vars = merge(local.db_env_vars, var.additional_env_vars, local.stack_configs) + additional_env_vars = merge(local.db_env_vars, var.additional_env_vars, local.stack_configs, each.value.additional_env_vars) additional_env_vars_from_config_maps = var.additional_env_vars_from_config_maps additional_env_vars_from_secrets = var.additional_env_vars_from_secrets additional_volumes_from_secrets = var.additional_volumes_from_secrets diff --git a/terraform/modules/happy-stack-eks/variables.tf b/terraform/modules/happy-stack-eks/variables.tf index 79f8b64d92..27ad09fa37 100644 --- a/terraform/modules/happy-stack-eks/variables.tf +++ b/terraform/modules/happy-stack-eks/variables.tf @@ -58,6 +58,7 @@ variable "services" { }), null), // Only used for TARGET_GROUP_ONLY desired_count : optional(number, 2), max_count : optional(number, 2), + max_unavailable_count : optional(string, "1"), scaling_cpu_threshold_percentage : optional(number, 80), port : optional(number, 80), scheme : optional(string, "HTTP"), @@ -85,6 +86,8 @@ variable "services" { initial_delay_seconds : optional(number, 30), alb_idle_timeout : optional(number, 60) // in seconds period_seconds : optional(number, 3), + liveness_timeout_seconds : optional(number, 30), + readiness_timeout_seconds : optional(number, 30), platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64; GPU nodes are amd64 only. additional_node_selectors : optional(map(string), {}), // For GPU use: { "nvidia.com/gpu.present" = "true" } bypasses : optional(map(object({ // Only used for INTERNAL service_type @@ -102,7 +105,10 @@ variable "services" { health_check_path : optional(string, "/") initial_delay_seconds : optional(number, 30), period_seconds : optional(number, 3), + liveness_timeout_seconds : optional(number, 30), + readiness_timeout_seconds : optional(number, 30), })), {}) + additional_env_vars : optional(map(string), {}), })) description = "The services you want to deploy as part of this stack." @@ -187,11 +193,18 @@ variable "tasks" { service_account_name : optional(string, null), }), {}), cron_schedule : optional(string, "0 0 1 1 *"), + additional_env_vars : optional(map(string), {}), })) description = "The deletion/migration tasks you want to run when a stack comes up and down." default = {} } +variable "additional_hostnames" { + type = set(string) + description = "The set of hostnames that will be allowed by the corresponding load balancers and ingress'. These hosts can be configured outside of happy, for instance through a CloudFront distribution." + default = [] +} + variable "routing_method" { type = string description = "Traffic routing method for this stack. Valid options are 'DOMAIN', when every service gets a unique domain name, or a 'CONTEXT' when all services share the same domain name, and routing is done by request path." diff --git a/terraform/modules/happy-stack-eks/versions.tf b/terraform/modules/happy-stack-eks/versions.tf index 5c18439b31..de1cf1ed9a 100644 --- a/terraform/modules/happy-stack-eks/versions.tf +++ b/terraform/modules/happy-stack-eks/versions.tf @@ -18,7 +18,7 @@ terraform { } happy = { source = "chanzuckerberg/happy" - version = ">= 0.53.5" + version = ">= 0.108.0" } random = { source = "hashicorp/random" diff --git a/terraform/modules/happy-stack-helm-eks/README.md b/terraform/modules/happy-stack-helm-eks/README.md new file mode 100644 index 0000000000..beb4c7a18b --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/README.md @@ -0,0 +1,77 @@ + +## Requirements + +| Name | Version | +|------|---------| +| [terraform](#requirement\_terraform) | >= 1.3 | +| [aws](#requirement\_aws) | >= 5.23 | +| [datadog](#requirement\_datadog) | >= 3.31 | +| [happy](#requirement\_happy) | >= 0.108 | +| [helm](#requirement\_helm) | >= 2.11 | +| [kubernetes](#requirement\_kubernetes) | >= 2.23 | +| [random](#requirement\_random) | >= 3.5 | +| [validation](#requirement\_validation) | 1.0.0 | + +## Providers + +| Name | Version | +|------|---------| +| [aws](#provider\_aws) | >= 5.23 | +| [datadog](#provider\_datadog) | >= 3.31 | +| [happy](#provider\_happy) | >= 0.108 | +| [helm](#provider\_helm) | >= 2.11 | +| [kubernetes](#provider\_kubernetes) | >= 2.23 | +| [random](#provider\_random) | >= 3.5 | + +## Modules + +| Name | Source | Version | +|------|--------|---------| +| [ecr](#module\_ecr) | git@github.com:chanzuckerberg/cztack//aws-ecr-repo | v0.59.0 | +| [target\_group\_only](#module\_target\_group\_only) | ./target_group_only | n/a | + +## Resources + +| Name | Type | +|------|------| +| [datadog_dashboard_json.stack_dashboard](https://registry.terraform.io/providers/datadog/datadog/latest/docs/resources/dashboard_json) | resource | +| [helm_release.stack](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) | resource | +| [random_pet.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet) | resource | +| [aws_region.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/region) | data source | +| [happy_resolved_app_configs.configs](https://registry.terraform.io/providers/chanzuckerberg/happy/latest/docs/data-sources/resolved_app_configs) | data source | +| [kubernetes_secret_v1.integration_secret](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/data-sources/secret_v1) | data source | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| [additional\_env\_vars](#input\_additional\_env\_vars) | Additional environment variables to add to the container | `map(string)` | `{}` | no | +| [additional\_env\_vars\_from\_config\_maps](#input\_additional\_env\_vars\_from\_config\_maps) | Additional environment variables to add to the container from the following config maps |
object({
items : optional(list(string), []),
prefix : optional(string, ""),
})
|
{
"items": [],
"prefix": ""
}
| no | +| [additional\_env\_vars\_from\_secrets](#input\_additional\_env\_vars\_from\_secrets) | Additional environment variables to add to the container from the following secrets |
object({
items : optional(list(string), []),
prefix : optional(string, ""),
})
|
{
"items": [],
"prefix": ""
}
| no | +| [additional\_pod\_labels](#input\_additional\_pod\_labels) | Additional labels to add to the pods. | `map(string)` | `{}` | no | +| [additional\_volumes\_from\_config\_maps](#input\_additional\_volumes\_from\_config\_maps) | Additional volumes to add to the container from the following config maps |
object({
items : optional(list(string), []),
})
|
{
"items": []
}
| no | +| [additional\_volumes\_from\_secrets](#input\_additional\_volumes\_from\_secrets) | Additional volumes to add to the container from the following secrets |
object({
items : optional(list(string), []),
base_dir : optional(string, "/var"),
})
|
{
"base_dir": "/var",
"items": []
}
| no | +| [app\_name](#input\_app\_name) | The happy application name | `string` | `""` | no | +| [create\_dashboard](#input\_create\_dashboard) | Create a dashboard for this stack | `bool` | `false` | no | +| [deployment\_stage](#input\_deployment\_stage) | Deployment stage for the app | `string` | n/a | yes | +| [enable\_service\_mesh](#input\_enable\_service\_mesh) | Enable service mesh for this stack | `bool` | `false` | no | +| [features](#input\_features) | The features you want to enable for this stack. |
map(object({
name : string,
enabled : bool,
config : optional(map(string), {}),
}))
| `{}` | no | +| [image\_tag](#input\_image\_tag) | Please provide a default image tag | `string` | n/a | yes | +| [image\_tags](#input\_image\_tags) | Override image tag for each docker image | `map(string)` | `{}` | no | +| [k8s\_namespace](#input\_k8s\_namespace) | K8S namespace for this stack | `string` | n/a | yes | +| [routing\_method](#input\_routing\_method) | Traffic routing method for this stack. Valid options are 'DOMAIN', when every service gets a unique domain name, or a 'CONTEXT' when all services share the same domain name, and routing is done by request path. | `string` | `"DOMAIN"` | no | +| [services](#input\_services) | The services you want to deploy as part of this stack. |
map(object({
name : string,
service_type : optional(string, "INTERNAL"),
allow_mesh_services : optional(list(object({
service : optional(string, null),
stack : optional(string, null),
service_account_name : optional(string, null)
})), null),
ingress_security_groups : optional(list(string), []), // Only used for VPC service_type
alb : optional(object({
name : string,
listener_port : number,
}), null), // Only used for TARGET_GROUP_ONLY
desired_count : optional(number, 2),
max_count : optional(number, 5),
max_unavailable_count : optional(string, "1"),
scaling_cpu_threshold_percentage : optional(number, 80),
port : optional(number, 80),
scheme : optional(string, "HTTP"),
cmd : optional(list(string), []),
args : optional(list(string), []),
image_pull_policy : optional(string, "IfNotPresent"), // Supported values: IfNotPresent, Always, Never
tag_mutability : optional(bool, true),
scan_on_push : optional(bool, false),
service_port : optional(number, null),
service_scheme : optional(string, "HTTP"),
memory : optional(string, "500Mi"),
memory_requests : optional(string, "200Mi"),
cpu : optional(string, "1"),
cpu_requests : optional(string, "500m"),
gpu : optional(number, null), // Whole number of GPUs to request, 0 will schedule all available GPUs. Requires GPU-enabled nodes in the cluster, `k8s-device-plugin` installed, platform_architecture = "amd64", and additional_node_selectors = { "nvidia.com/gpu.present" = "true" } present.
health_check_path : optional(string, "/"),
aws_iam : optional(object({
policy_json : optional(string, ""),
service_account_name : optional(string, null),
}), {}),
path : optional(string, "/*"), // Only used for CONTEXT and TARGET_GROUP_ONLY routing
priority : optional(number, 0), // Only used for CONTEXT and TARGET_GROUP_ONLY routing
success_codes : optional(string, "200-499"),
synthetics : optional(bool, false),
initial_delay_seconds : optional(number, 30),
alb_idle_timeout : optional(number, 60) // in seconds
period_seconds : optional(number, 3),
platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64; GPU nodes are amd64 only.
additional_node_selectors : optional(map(string), {}), // For GPU use: { "nvidia.com/gpu.present" = "true" }
bypasses : optional(map(object({ // Only used for INTERNAL service_type
paths = optional(set(string), [])
methods = optional(set(string), [])
})), {})
sidecars : optional(map(object({
image : string
tag : string
port : optional(number, 80),
scheme : optional(string, "HTTP"),
memory : optional(string, "200Mi")
cpu : optional(string, "500m")
image_pull_policy : optional(string, "IfNotPresent") // Supported values: IfNotPresent, Always, Never
health_check_path : optional(string, "/")
initial_delay_seconds : optional(number, 30),
period_seconds : optional(number, 3),
})), {})
}))
| n/a | yes | +| [skip\_config\_injection](#input\_skip\_config\_injection) | Skip injecting app configs into the services / tasks | `bool` | `false` | no | +| [stack\_name](#input\_stack\_name) | Happy Path stack name | `string` | n/a | yes | +| [stack\_prefix](#input\_stack\_prefix) | Do bucket storage paths and db schemas need to be prefixed with the stack name? (Usually '/{stack\_name}' for dev stacks, and '' for staging/prod stacks) | `string` | `""` | no | +| [tasks](#input\_tasks) | The deletion/migration tasks you want to run when a stack comes up and down. |
map(object({
image : string,
memory : optional(string, "200Mi"),
cpu : optional(string, "500m"),
cmd : optional(list(string), []),
args : optional(list(string), []),
platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64
is_cron_job : optional(bool, false),
aws_iam : optional(object({
policy_json : optional(string, ""),
service_account_name : optional(string, null),
}), {}),
cron_schedule : optional(string, "0 0 1 1 *"),
}))
| `{}` | no | + +## Outputs + +| Name | Description | +|------|-------------| +| [dashboard](#output\_dashboard) | n/a | +| [service\_ecrs](#output\_service\_ecrs) | n/a | +| [service\_endpoints](#output\_service\_endpoints) | The URL endpoints for services | +| [task\_arns](#output\_task\_arns) | ARNs for all the tasks | + \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/datadog.tf b/terraform/modules/happy-stack-helm-eks/datadog.tf new file mode 100644 index 0000000000..40005ff352 --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/datadog.tf @@ -0,0 +1,878 @@ +locals { + cluster_id = local.secret["eks_cluster"].cluster_id +} +resource "datadog_dashboard_json" "stack_dashboard" { + count = var.create_dashboard ? 1 : 0 + dashboard = <", + "palette": "white_on_red", + "value": 500 + }, { + "comparator": ">", + "palette": "white_on_yellow", + "value": 400 + }, { + "comparator": "<=", + "palette": "white_on_green", + "value": 400 + }], + "response_format": "scalar", + "queries": [{ + "query": "avg:aws.applicationelb.target_response_time.average{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}", + "data_source": "metrics", + "name": "query1", + "aggregator": "avg" + }] + }], + "autoscale": false, + "custom_unit": "ms", + "text_align": "left", + "custom_links": [], + "precision": 0 + }, + "layout": { + "x": 0, + "y": 0, + "width": 2, + "height": 2 + } + }, { + "id": 7100825526823894, + "definition": { + "title": "Healthy Target count (min)", + "title_size": "13", + "title_align": "left", + "time": { + "live_span": "1h" + }, + "type": "query_value", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "conditional_formats": [{ + "comparator": ">", + "palette": "green_on_white", + "value": 0 + }, { + "comparator": "<=", + "palette": "red_on_white", + "value": 0 + }], + "response_format": "scalar", + "queries": [{ + "query": "sum:aws.applicationelb.healthy_host_count{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}", + "data_source": "metrics", + "name": "query1", + "aggregator": "min" + }] + }], + "autoscale": true, + "custom_unit": "targets", + "text_align": "left", + "custom_links": [], + "precision": 0 + }, + "layout": { + "x": 2, + "y": 0, + "width": 2, + "height": 2 + } + }, { + "id": 3655951002455680, + "definition": { + "title": "Unhealthy target count (max)", + "title_size": "13", + "title_align": "left", + "time": { + "live_span": "1h" + }, + "type": "query_value", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "conditional_formats": [{ + "comparator": ">", + "palette": "white_on_red", + "value": 0 + }, { + "comparator": "<=", + "palette": "white_on_green", + "value": 0 + }], + "response_format": "scalar", + "queries": [{ + "query": "sum:aws.applicationelb.un_healthy_host_count{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}", + "data_source": "metrics", + "name": "query1", + "aggregator": "max" + }] + }], + "autoscale": true, + "custom_unit": "targets", + "text_align": "left", + "custom_links": [], + "precision": 0 + }, + "layout": { + "x": 4, + "y": 0, + "width": 2, + "height": 2 + } + }, { + "id": 2809420673893146, + "definition": { + "title": "Requests per second (avg)", + "title_size": "13", + "title_align": "left", + "time": { + "live_span": "1h" + }, + "type": "query_value", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "scalar", + "queries": [{ + "query": "sum:aws.applicationelb.request_count{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}.as_rate()", + "data_source": "metrics", + "name": "query1", + "aggregator": "avg" + }] + }], + "autoscale": true, + "text_align": "left", + "custom_links": [], + "precision": 1 + }, + "layout": { + "x": 6, + "y": 0, + "width": 2, + "height": 2 + } + }] + }, + "layout": { + "x": 0, + "y": 0, + "width": 12, + "height": 3 + } + }, { + "id": 2418827212694900, + "definition": { + "title": "Http Responses / Connections", + "show_title": true, + "type": "group", + "layout_type": "ordered", + "widgets": [{ + "id": 4642384245461586, + "definition": { + "title": "HTTP 2xx Responses", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.httpcode_target_2xx{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}.as_count()", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic" + }, + "display_type": "bars" + }], + "custom_links": [] + }, + "layout": { + "x": 0, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 5884051821562600, + "definition": { + "title": "HTTP 3xx Responses", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.httpcode_target_3xx{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}.as_count()", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic" + }, + "display_type": "bars" + }], + "custom_links": [] + }, + "layout": { + "x": 4, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 5108608634230402, + "definition": { + "title": "HTTP 4xx Responses", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.httpcode_target_4xx{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}.as_count()", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "warm" + }, + "display_type": "bars" + }], + "custom_links": [] + }, + "layout": { + "x": 8, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 2872253854507168, + "definition": { + "title": "HTTP 5xx Responses", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.httpcode_target_5xx{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}.as_count()", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "warm" + }, + "display_type": "bars" + }], + "custom_links": [] + }, + "layout": { + "x": 0, + "y": 2, + "width": 4, + "height": 2 + } + }, { + "id": 754659096536696, + "definition": { + "title": "Healthy Host Count", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.healthy_host_count{happy_stack_name:${var.stack_name},elbv2.k8s.aws/cluster:${local.cluster_id}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 4, + "y": 2, + "width": 4, + "height": 2 + } + }, { + "id": 148794107811194, + "definition": { + "title": "Unhealthy Host Count", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.un_healthy_host_count{happy_stack_name:${var.stack_name},elbv2.k8s.aws/cluster:${local.cluster_id}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 8, + "y": 2, + "width": 4, + "height": 2 + } + }, { + "id": 2466055870144974, + "definition": { + "title": "Active Connections", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.active_connection_count{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic" + }, + "display_type": "bars" + }], + "custom_links": [] + }, + "layout": { + "x": 0, + "y": 4, + "width": 4, + "height": 2 + } + }, { + "id": 8403694785490478, + "definition": { + "title": "New Connections", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.new_connection_count{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic" + }, + "display_type": "bars" + }], + "custom_links": [] + }, + "layout": { + "x": 4, + "y": 4, + "width": 4, + "height": 2 + } + }, { + "id": 7052214804631506, + "definition": { + "title": "Response Time", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1 * 1000" + }], + "response_format": "timeseries", + "queries": [{ + "query": "avg:aws.applicationelb.target_response_time.average{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "area" + }], + "custom_links": [] + }, + "layout": { + "x": 0, + "y": 6, + "width": 4, + "height": 2 + } + }, { + "id": 61911063739598, + "definition": { + "title": "Processed Bytes", + "title_size": "16", + "title_align": "left", + "show_legend": false, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "time": { + "live_span": "4h" + }, + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:aws.applicationelb.processed_bytes{elbv2.k8s.aws/cluster:${local.cluster_id},happy_stack_name:${var.stack_name}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic" + }, + "display_type": "area" + }], + "custom_links": [] + }, + "layout": { + "x": 4, + "y": 6, + "width": 4, + "height": 2 + } + }] + }, + "layout": { + "x": 0, + "y": 3, + "width": 12, + "height": 9 + } + }, { + "id": 2445078692824330, + "definition": { + "title": "Containers", + "show_title": true, + "type": "group", + "layout_type": "ordered", + "widgets": [{ + "id": 3679262507165410, + "definition": { + "title": "Container restarts", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "avg:kubernetes.containers.restarts{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 0, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 7396801473522966, + "definition": { + "title": "Waiting containers", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "avg:kubernetes.containers.state.waiting{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 4, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 5359542116641218, + "definition": { + "title": "Running containers in a stack", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "sum:kubernetes.containers.running{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 8, + "y": 0, + "width": 4, + "height": 2 + } + }] + }, + "layout": { + "x": 0, + "y": 12, + "width": 12, + "height": 3 + } + }, { + "id": 3655088441997134, + "definition": { + "title": "Resources", + "show_title": true, + "type": "group", + "layout_type": "ordered", + "widgets": [{ + "id": 6368929839683538, + "definition": { + "title": "Stack Memory usage", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "alias": "Usage", + "formula": "query1" + }, { + "alias": "Limit", + "formula": "query2" + }, { + "alias": "Request", + "formula": "query3" + }], + "response_format": "timeseries", + "queries": [{ + "query": "avg:kubernetes.memory.usage{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query1" + }, { + "query": "avg:kubernetes.memory.limits{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query2" + }, { + "query": "avg:kubernetes.memory.requests{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query3" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 0, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 883128051754482, + "definition": { + "title": "Stack CPU Usage", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "alias": "Usage", + "formula": "query1" + }, { + "alias": "Limit", + "formula": "query2" + }, { + "alias": "Request", + "formula": "query3" + }], + "response_format": "timeseries", + "queries": [{ + "query": "avg:kubernetes.cpu.usage.total{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query1" + }, { + "query": "sum:kubernetes.cpu.limits{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query2" + }, { + "query": "sum:kubernetes.cpu.requests{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query3" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 4, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 1043953660409360, + "definition": { + "title": "Ephemeral Storage Usage", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "formula": "query1" + }], + "response_format": "timeseries", + "queries": [{ + "query": "avg:kubernetes.ephemeral_storage.usage{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query1" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 8, + "y": 0, + "width": 4, + "height": 2 + } + }, { + "id": 4906301887226174, + "definition": { + "title": "Network I/O", + "title_size": "16", + "title_align": "left", + "show_legend": true, + "legend_layout": "auto", + "legend_columns": ["avg", "min", "max", "value", "sum"], + "type": "timeseries", + "requests": [{ + "formulas": [{ + "alias": "Read", + "formula": "query1" + }, { + "alias": "Write", + "formula": "query2" + }], + "response_format": "timeseries", + "queries": [{ + "query": "avg:kubernetes.network.rx_bytes{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query1" + }, { + "query": "avg:kubernetes.network.tx_bytes{kube_cluster_name:${local.cluster_id},kube_namespace:${var.k8s_namespace},happy_stack:${var.stack_name}} by {happy_service}", + "data_source": "metrics", + "name": "query2" + }], + "style": { + "palette": "dog_classic", + "line_type": "solid", + "line_width": "normal" + }, + "display_type": "line" + }] + }, + "layout": { + "x": 0, + "y": 2, + "width": 4, + "height": 2 + } + }] + }, + "layout": { + "x": 0, + "y": 15, + "width": 12, + "height": 5 + } + }], + "template_variables": [], + "layout_type": "ordered", + "notify_list": [], + "reflow_type": "fixed", + "id": "9jm-vci-3q9" +} + EOF +} diff --git a/terraform/modules/happy-stack-helm-eks/ecr.tf b/terraform/modules/happy-stack-helm-eks/ecr.tf new file mode 100644 index 0000000000..2009acd23f --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/ecr.tf @@ -0,0 +1,10 @@ +module "ecr" { + source = "git@github.com:chanzuckerberg/cztack//aws-ecr-repo?ref=v0.59.0" + for_each = local.service_definitions + + name = "${var.stack_name}/${local.tags.env}/${each.value.name}" + force_delete = true + tag_mutability = each.value.tag_mutability + scan_on_push = each.value.scan_on_push + tags = local.secret["tags"] +} \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/happy_config.tf b/terraform/modules/happy-stack-helm-eks/happy_config.tf new file mode 100644 index 0000000000..ce9b8e966e --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/happy_config.tf @@ -0,0 +1,19 @@ +data "happy_resolved_app_configs" "configs" { + count = var.skip_config_injection ? 0 : 1 + app_name = length(var.app_name) == 0 ? local.secret["tags"]["project"] : var.app_name + environment = var.deployment_stage + stack = var.stack_name +} + +locals { + stack_configs = var.skip_config_injection ? {} : { for v in data.happy_resolved_app_configs.configs[0].app_configs : v["key"] => v["value"] } +} + +provider "happy" { + api_base_url = local.secret["hapi_config"]["base_url"] + api_oidc_issuer = local.secret["hapi_config"]["oidc_issuer"] + api_oidc_authz_id = local.secret["hapi_config"]["oidc_authz_id"] + api_kms_key_id = local.secret["hapi_config"]["kms_key_id"] + api_assume_role_arn = local.secret["hapi_config"]["assume_role_arn"] + api_oidc_scope = local.secret["hapi_config"]["scope"] +} diff --git a/terraform/modules/happy-stack-helm-eks/locals.tf b/terraform/modules/happy-stack-helm-eks/locals.tf new file mode 100644 index 0000000000..822f0ed6fc --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/locals.tf @@ -0,0 +1,138 @@ +data "aws_region" "current" {} +resource "random_pet" "suffix" {} + +data "kubernetes_secret_v1" "integration_secret" { + metadata { + name = "integration-secret" + namespace = var.k8s_namespace + } +} + +locals { + suffix = random_pet.suffix.id + + secret = jsondecode(nonsensitive(data.kubernetes_secret_v1.integration_secret.data.integration_secret)) + external_dns = local.secret["external_zone_name"] + certificate_arn = local.secret["certificate_arn"] + + s = { for k, v in var.services : k => merge(v, { + external_stack_host_match = try(join(".", [var.stack_name, local.external_dns]), "") + external_service_host_match = try(join(".", ["${var.stack_name}-${k}", local.external_dns]), "") + + stack_host_match = try(join(".", [var.stack_name, local.external_dns]), "") + service_host_match = try(join(".", ["${var.stack_name}-${k}", local.external_dns]), "") + }) } + + sd = { for k, v in local.s : k => merge(v, { + external_host_match = var.routing_method == "CONTEXT" ? v.external_stack_host_match : v.external_service_host_match + host_match = var.routing_method == "CONTEXT" ? v.stack_host_match : v.service_host_match + group_name = var.routing_method == "CONTEXT" ? "stack-${var.stack_name}-${local.suffix}" : "service-${var.stack_name}-${k}-${local.suffix}" + service_name = "${var.stack_name}-${k}" + service_port = coalesce(v.service_port, v.port) + bypasses = (v.service_type == "INTERNAL" ? + merge({ + // by default, add an options bypass since this is used a lot by developers out of the gate + options = { + paths = toset(["/*"]) + methods = toset(["OPTIONS"]) + } }, + v.bypasses + ) : + {}) + }) } + + // calculate the highest priority and build off of that + highest_priority = max(0, [for k, v in local.sd : v.priority]...) + // find all the services that used the default 0 priority + unprioritized_service_definitions = [for k, v in local.sd : { (k) = v } if v.priority == 0] + // make a range starting from the highest and going for every unprioritized service + // ex: if the highest priority was 4 and was have 2 unprioritized services, they will be assigned priority 5 and 6 + priority_split = range(local.highest_priority + 1, local.highest_priority + length(local.unprioritized_service_definitions) + 1) + // and reassign them + reprioritized_service_definitions = { for p, def in zipmap(local.priority_split, local.unprioritized_service_definitions) : keys(def)[0] => merge(def[keys(def)[0]], { priority = p }) } + prioritized_service_definitions = { for k, v in local.sd : k => v if v.priority != 0 } + service_definitions = merge(local.prioritized_service_definitions, local.reprioritized_service_definitions) + + + external_endpoints = concat([for k, v in local.service_definitions : + v.service_type == "EXTERNAL" ? + { + "EXTERNAL_${upper(replace(k, "-", "_"))}_ENDPOINT" = try(join("", ["https://", v.external_host_match]), "") + "${upper(replace(k, "-", "_"))}_ENDPOINT" = try(join("", ["https://", v.host_match]), "") + } + : { + "EXTERNAL_${upper(replace(k, "-", "_"))}_ENDPOINT" = try(join("", ["https://", v.external_host_match]), "") + "INTERNAL_${upper(replace(k, "-", "_"))}_ENDPOINT" = try(join("", ["https://", v.host_match]), "") + "${upper(replace(k, "-", "_"))}_ENDPOINT" = try(join("", ["https://", v.host_match]), "") + } + ]) + + private_endpoints = concat([for k, v in local.service_definitions : + { + "PRIVATE_${upper(replace(k, "-", "_"))}_ENDPOINT" = "${lower(v.service_scheme)}://${v.service_name}.${var.k8s_namespace}.svc.cluster.local:${v.service_port}" + } + ]) + + flat_external_endpoints = zipmap( + flatten( + [for item in local.external_endpoints : keys(item)] + ), + flatten( + [for item in local.external_endpoints : values(item)] + ) + ) + + flat_private_endpoints = zipmap( + flatten( + [for item in local.private_endpoints : keys(item)] + ), + flatten( + [for item in local.private_endpoints : values(item)] + ) + ) + + # Enriched Services + service_endpoints = merge(local.flat_external_endpoints, local.flat_private_endpoints) + + # Enriched Tasks + task_definitions = { + for k, v in var.tasks : k => merge(v, { + task_name = "${var.stack_name}-${k}" + // substitute {service} references in task image with the appropriate ECR repo urls + image = format( + replace(v.image, "/{(${join("|", keys(local.service_ecrs))})}/", "%s"), + [ + for repo in flatten(regexall("{(${join("|", keys(local.service_ecrs))})}", v.image)) : + lookup(local.service_ecrs, repo) + ]... + ) + }) + } + + service_ecrs = { for k, v in module.ecr : k => v.repository_url } + tags = local.secret["tags"] + cloud_env = local.secret["cloud_env"] + + # WAF + waf_config = lookup(local.secret, "waf_config", {}) + regional_waf_arn = lookup(local.waf_config, "arn", null) + + context_env_vars = { + REMOTE_DEV_PREFIX = var.stack_prefix + DEPLOYMENT_STAGE = var.deployment_stage + AWS_REGION = data.aws_region.current.name + AWS_DEFAULT_REGION = data.aws_region.current.name + } + + # OIDC + oidc_config_secret_name = "${var.stack_name}-oidc-config" + issuer_domain = try(local.secret["oidc_config"]["idp_url"], "todofindissuer.com") + issuer_url = "https://${local.issuer_domain}" + oidc_config = { + issuer = local.issuer_url + authorizationEndpoint = "${local.issuer_url}/oauth2/v1/authorize" + tokenEndpoint = "${local.issuer_url}/oauth2/v1/token" + userInfoEndpoint = "${local.issuer_url}/oauth2/v1/userinfo" + secretName = local.oidc_config_secret_name + } +} diff --git a/terraform/modules/happy-stack-helm-eks/main.tf b/terraform/modules/happy-stack-helm-eks/main.tf new file mode 100644 index 0000000000..88150cb3cf --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/main.tf @@ -0,0 +1,209 @@ +locals { + + tasks = [for k, v in local.task_definitions : { + "additionalNodeSelectors" = v.additional_node_selectors + "additionalPodLabels" = var.additional_pod_labels + "awsIam" = { + "roleArn" = v.aws_iam + } + "cmd" = v.cmd + "env" = { + "additionalEnvVars" = merge(var.additional_env_vars, v.additional_env_vars, local.service_endpoints, local.stack_configs, local.context_env_vars) + "additionalEnvVarsFromConfigMaps" = var.additional_env_vars_from_config_maps + "additionalEnvVarsFromSecrets" = var.additional_env_vars_from_secrets + } + "image" = { + "platformArchitecture" = v.platform_architecture + "pullPolicy" = try(v.image_pull_policy, "IfNotPresent") + "repository" = v.image + "tag" = lookup(var.image_tags, k, var.image_tag) + } + "name" = k + "resources" = { + "limits" = { + "cpu" = v.cpu + "memory" = v.memory + } + "requests" = { + "cpu" = v.cpu + "memory" = v.memory + } + } + "schedule" = v.cron_schedule + "suspend" = v.is_cron_job ? false : true + "volumes" = { + "additionalVolumesFromConfigMaps" = [for k1, v1 in var.additional_volumes_from_config_maps : { + "mountPath" = v1.base_dir + "name" = k1 + "readOnly" = true + }] + "additionalVolumesFromSecrets" = [for k1, v1 in var.additional_volumes_from_secrets : { + "mountPath" = v1.base_dir + "name" = k1 + "readOnly" = true + }] + } + }] + + services = [for k, v in local.patched_service_definitions : { + "additionalNodeSelectors" = v.additional_node_selectors + "additionalPodLabels" = var.additional_pod_labels + "awsIam" = { + "roleArn" = v.aws_iam + } + "certificateArn" = local.certificate_arn + "args" = v.args + "cmd" = v.cmd + "env" = { + "additionalEnvVars" = merge(var.additional_env_vars, v.additional_env_vars, local.service_endpoints, local.stack_configs, local.context_env_vars) + "additionalEnvVarsFromConfigMaps" = var.additional_env_vars_from_config_maps + "additionalEnvVarsFromSecrets" = var.additional_env_vars_from_secrets + } + "healthCheck" = { + "initialDelaySeconds" = v.initial_delay_seconds + "path" = v.health_check_path + "periodSeconds" = v.period_seconds + } + "image" = { + "repository" = module.ecr[k].repository_url + "tag" = lookup(var.image_tags, k, var.image_tag) + "platformArchitecture" = v.platform_architecture + "pullPolicy" = try(v.image_pull_policy, "IfNotPresent") + "scanOnPush" = v.scan_on_push + "tagMutability" = v.tag_mutability + } + "name" = k + "regionalWafv2Arn" = local.regional_waf_arn + "resources" = { + "limits" = { + "cpu" = v.cpu + "memory" = v.memory + } + "requests" = { + "cpu" = v.cpu_requests + "memory" = v.memory_requests + } + } + + "routing" = { + "alb" = { + "loadBalancerAttributes" = [ + "idle_timeout.timeout_seconds=${v.alb_idle_timeout}", + ] + "securityGroups" = v.securityGroups + "targetGroup" = v.group_name + "targetGroupArn" = v.targetGroupArn + } + "bypasses" = [ + (length(v.bypasses[k].methods) != 0 ? { + field = "http-request-method" + httpRequestMethodConfig = { + Values = v.bypasses[k].methods + } + } : null), + (length(v.bypasses[k].paths) != 0 ? { + field = "path-pattern" + pathPatternConfig = { + Values = v.bypasses[k].paths + } + } : null) + ] + "groupName" = v.group_name + "hostMatch" = v.host_match + "method" = var.routing_method + "oidcConfig" = local.oidc_config + "path" = v.path + "port" = v.port + "priority" = v.priority + "scheme" = v.scheme + "serviceType" = v.service_type + "successCodes" = v.success_codes + } + "scaling" = { + "cpuThresholdPercentage" = v.scaling_cpu_threshold_percentage + "desiredCount" = v.desired_count + "maxCount" = v.max_count + "maxUnavailable" = v.max_unavailable_count + } + "serviceMesh" = { + "allowServices" = try(v.allow_mesh_services, []) + } + "sidecars" = [for k1, v1 in v.sidecars : { + "healthCheck" = { + "initialDelaySeconds" = v1.initial_delay_seconds + "path" = v1.health_check_path + "periodSeconds" = v1.period_seconds + } + "image" = { + "repository" = v1.image + "tag" = v1.tag + } + "imagePullPolicy" = try(v1.image_pull_policy, "IfNotPresent") + "name" = k1 + "resources" = { + "limits" = { + "cpu" = v1.cpu + "memory" = v1.memory + } + "requests" = { + "cpu" = v1.cpu + "memory" = v1.memory + } + } + "routing" = { + "port" = v1.port + "scheme" = v1.scheme + } + }] + + "volumes" = { + "additionalVolumesFromConfigMaps" = [for k1, v1 in var.additional_volumes_from_config_maps : { + "mountPath" = v1.base_dir + "name" = k1 + "readOnly" = true + }] + "additionalVolumesFromSecrets" = [for k1, v1 in var.additional_volumes_from_secrets : { + "mountPath" = v1.base_dir + "name" = k1 + "readOnly" = true + }] + } + "waitForSteadyState" = true + }] + + values = { + "stackName" = var.stack_name + "aws" = { + "cloudEnv" = { + "databaseSubnetGroup" = local.cloud_env["database_subnet_group"] + "databaseSubnets" = local.cloud_env["database_subnets"] + "privateSubnets" = local.cloud_env["private_subnets"] + "publicSubnets" = local.cloud_env["public_subnets"] + "vpcCidrBlock" = local.cloud_env["vpc_cidr_block"] + "vpcId" = local.cloud_env["vpc_id"] + } + "dnsZone" = local.secret["external_zone_name"] + "region" = data.aws_region.current.name + "tags" = local.tags + "wafAclArn" = local.regional_waf_arn + } + "datadog" = { + "enabled" = try(var.features["datadog"].enabled, false) + } + "deploymentStage" = var.deployment_stage + "serviceMesh" = { + "enabled" = try(var.features["service_mesh"].enabled, try(var.enable_service_mesh, false)) + } + "services" = local.services + "tasks" = local.tasks + } +} + +resource "helm_release" "stack" { + name = var.app_name + repository = "https://chanzuckerberg.github.io/happy-stack-helm/" + chart = "happy-stack" + namespace = var.k8s_namespace + values = [yamlencode(local.values)] + wait = true +} diff --git a/terraform/modules/happy-stack-helm-eks/outputs.tf b/terraform/modules/happy-stack-helm-eks/outputs.tf new file mode 100644 index 0000000000..9b521e843d --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/outputs.tf @@ -0,0 +1,23 @@ +output "service_endpoints" { + value = local.service_endpoints + description = "The URL endpoints for services" + sensitive = false +} + +output "task_arns" { + // TODO + value = {} + //value = { for name, task in module.tasks : name => task.task_definition_arn } + description = "ARNs for all the tasks" +} + +output "dashboard" { + value = { + id = var.create_dashboard ? datadog_dashboard_json.stack_dashboard[0].id : "" + url = var.create_dashboard ? datadog_dashboard_json.stack_dashboard[0].url : "" + } +} + +output "service_ecrs" { + value = local.service_ecrs +} diff --git a/terraform/modules/happy-stack-helm-eks/target_group_only.tf b/terraform/modules/happy-stack-helm-eks/target_group_only.tf new file mode 100644 index 0000000000..d20fdee4b7 --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/target_group_only.tf @@ -0,0 +1,25 @@ + +locals { + target_group_only_services = [for sd in local.service_definitions : sd if sd.service_type == "TARGET_GROUP_ONLY"] + other_services = [for sd in local.service_definitions : sd if sd.service_type != "TARGET_GROUP_ONLY"] + + updated_target_service_definitions = [for sd in local.service_definitions : merge(sd, { + "targetGroupArn" = module.target_group_only.aws_lb_target_group_arn + "securityGroups" = module.target_group_only.security_groups + })] + + updated_other_service_definitions = [for sd in local.other_services : merge(sd, { + "targetGroupArn" = "" + "securityGroups" = [] + })] + + patched_service_definitions = concat(local.updated_other_service_definitions, local.updated_target_service_definitions) +} + +module "target_group_only" { + for_each = local.target_group_only_services + source = "./target_group_only" + routing = each.value.routing + cloud_env = local.cloud_env + health_check_path = each.value.health_check_path +} \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/target_group_only/README.md b/terraform/modules/happy-stack-helm-eks/target_group_only/README.md new file mode 100644 index 0000000000..df5670f2ae --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/target_group_only/README.md @@ -0,0 +1,44 @@ + +## Requirements + +| Name | Version | +|------|---------| +| [terraform](#requirement\_terraform) | >= 1.3 | +| [aws](#requirement\_aws) | >= 5.23 | +| [random](#requirement\_random) | >= 3.5 | + +## Providers + +| Name | Version | +|------|---------| +| [aws](#provider\_aws) | >= 5.23 | +| [random](#provider\_random) | >= 3.5 | + +## Modules + +No modules. + +## Resources + +| Name | Type | +|------|------| +| [aws_lb_listener_rule.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_listener_rule) | resource | +| [aws_lb_target_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_target_group) | resource | +| [random_pet.this](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet) | resource | +| [aws_lb.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/lb) | data source | +| [aws_lb_listener.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/lb_listener) | data source | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| [cloud\_env](#input\_cloud\_env) | Typically data.terraform\_remote\_state.cloud-env.outputs |
object({
public_subnets : list(string),
private_subnets : list(string),
database_subnets : list(string),
database_subnet_group : string,
vpc_id : string,
vpc_cidr_block : string,
})
| n/a | yes | +| [health\_check\_path](#input\_health\_check\_path) | The path to use for the health check | `string` | `"/health"` | no | +| [routing](#input\_routing) | Routing configuration for the ingress |
object({
method : optional(string, "DOMAIN")
host_match : string
additional_hostnames : optional(set(string), [])
group_name : string
alb : optional(object({
name : string,
listener_port : number,
}), null)
priority : number
path : optional(string, "/*")
service_name : string
port : number
service_port : number
alb_idle_timeout : optional(number, 60) // in seconds
service_scheme : optional(string, "HTTP")
scheme : optional(string, "HTTP")
success_codes : optional(string, "200-499")
service_type : string
service_mesh : bool
allow_mesh_services : optional(list(object({
service : optional(string, null),
stack : optional(string, null),
service_account_name : optional(string, null),
})), null)
oidc_config : optional(object({
issuer : string
authorizationEndpoint : string
tokenEndpoint : string
userInfoEndpoint : string
secretName : string
}), {
issuer = ""
authorizationEndpoint = ""
tokenEndpoint = ""
userInfoEndpoint = ""
secretName = ""
})
bypasses : optional(map(object({
paths = optional(set(string), [])
methods = optional(set(string), [])
})))
})
| n/a | yes | + +## Outputs + +| Name | Description | +|------|-------------| +| [security\_groups](#output\_security\_groups) | n/a | + \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/target_group_only/main.tf b/terraform/modules/happy-stack-helm-eks/target_group_only/main.tf new file mode 100644 index 0000000000..4f2b65b27b --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/target_group_only/main.tf @@ -0,0 +1,45 @@ +resource "random_pet" "this" { + keepers = { + target_group_name = var.routing.service_name + } +} + +locals { + # only hyphens and a max of 32 characters + target_group_name = replace(substr(random_pet.this.id, 0, 32), "_", "-") +} + +data "aws_lb" "this" { + name = var.routing.alb.name +} + +data "aws_lb_listener" "this" { + load_balancer_arn = data.aws_lb.this.arn + port = var.routing.alb.listener_port +} + +resource "aws_lb_target_group" "this" { + name = local.target_group_name + port = var.routing.service_port + protocol = "HTTP" + vpc_id = var.cloud_env.vpc_id + health_check { + path = var.health_check_path + } +} + +resource "aws_lb_listener_rule" "this" { + listener_arn = data.aws_lb_listener.this.arn + priority = 100 + + action { + type = "forward" + target_group_arn = aws_lb_target_group.this.arn + } + + condition { + path_pattern { + values = [var.routing.path] + } + } +} \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/target_group_only/output.tf b/terraform/modules/happy-stack-helm-eks/target_group_only/output.tf new file mode 100644 index 0000000000..52394f89db --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/target_group_only/output.tf @@ -0,0 +1,3 @@ +output "security_groups" { + value = data.aws_lb.this.security_groups +} \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/target_group_only/variables.tf b/terraform/modules/happy-stack-helm-eks/target_group_only/variables.tf new file mode 100644 index 0000000000..9b8ce790be --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/target_group_only/variables.tf @@ -0,0 +1,69 @@ +variable "health_check_path" { + description = "The path to use for the health check" + type = string + default = "/health" +} + +variable "cloud_env" { + type = object({ + public_subnets : list(string), + private_subnets : list(string), + database_subnets : list(string), + database_subnet_group : string, + vpc_id : string, + vpc_cidr_block : string, + }) + description = "Typically data.terraform_remote_state.cloud-env.outputs" +} + +variable "routing" { + type = object({ + method : optional(string, "DOMAIN") + host_match : string + additional_hostnames : optional(set(string), []) + group_name : string + alb : optional(object({ + name : string, + listener_port : number, + }), null) + priority : number + path : optional(string, "/*") + service_name : string + port : number + service_port : number + alb_idle_timeout : optional(number, 60) // in seconds + service_scheme : optional(string, "HTTP") + scheme : optional(string, "HTTP") + success_codes : optional(string, "200-499") + service_type : string + service_mesh : bool + allow_mesh_services : optional(list(object({ + service : optional(string, null), + stack : optional(string, null), + service_account_name : optional(string, null), + })), null) + oidc_config : optional(object({ + issuer : string + authorizationEndpoint : string + tokenEndpoint : string + userInfoEndpoint : string + secretName : string + }), { + issuer = "" + authorizationEndpoint = "" + tokenEndpoint = "" + userInfoEndpoint = "" + secretName = "" + }) + bypasses : optional(map(object({ + paths = optional(set(string), []) + methods = optional(set(string), []) + }))) + }) + description = "Routing configuration for the ingress" + + validation { + condition = var.routing.service_mesh == true || var.routing.allow_mesh_services == null + error_message = "The allow_mesh_services option is only supported if service_mesh is enabled on the stack" + } +} \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/target_group_only/versions.tf b/terraform/modules/happy-stack-helm-eks/target_group_only/versions.tf new file mode 100644 index 0000000000..e08b1ea38f --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/target_group_only/versions.tf @@ -0,0 +1,13 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = ">= 5.23" + } + random = { + source = "hashicorp/random" + version = ">= 3.5" + } + } + required_version = ">= 1.3" +} diff --git a/terraform/modules/happy-stack-helm-eks/variables.tf b/terraform/modules/happy-stack-helm-eks/variables.tf new file mode 100644 index 0000000000..f0b0cf74be --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/variables.tf @@ -0,0 +1,285 @@ +variable "app_name" { + type = string + description = "The happy application name" + default = "" +} + +variable "image_tags" { + type = map(string) + description = "Override image tag for each docker image" + default = {} +} + +variable "image_tag" { + type = string + description = "Please provide a default image tag" +} + +variable "stack_name" { + type = string + description = "Happy Path stack name" +} + +variable "deployment_stage" { + type = string + description = "Deployment stage for the app" +} + +variable "stack_prefix" { + type = string + description = "Do bucket storage paths and db schemas need to be prefixed with the stack name? (Usually '/{stack_name}' for dev stacks, and '' for staging/prod stacks)" + default = "" +} + +variable "k8s_namespace" { + type = string + description = "K8S namespace for this stack" +} + +variable "enable_service_mesh" { + type = bool + description = "Enable service mesh for this stack" + default = false +} + +variable "services" { + type = map(object({ + name : string, + service_type : optional(string, "INTERNAL"), + allow_mesh_services : optional(list(object({ + service : optional(string, null), + stack : optional(string, null), + service_account_name : optional(string, null) + })), null), + ingress_security_groups : optional(list(string), []), // Only used for VPC service_type + alb : optional(object({ + name : string, + listener_port : number, + }), null), // Only used for TARGET_GROUP_ONLY + desired_count : optional(number, 2), + max_count : optional(number, 5), + max_unavailable_count : optional(string, "1"), + scaling_cpu_threshold_percentage : optional(number, 80), + port : optional(number, 80), + scheme : optional(string, "HTTP"), + cmd : optional(list(string), []), + args : optional(list(string), []), + image_pull_policy : optional(string, "IfNotPresent"), // Supported values: IfNotPresent, Always, Never + tag_mutability : optional(bool, true), + scan_on_push : optional(bool, false), + service_port : optional(number, null), + service_scheme : optional(string, "HTTP"), + memory : optional(string, "500Mi"), + memory_requests : optional(string, "200Mi"), + cpu : optional(string, "1"), + cpu_requests : optional(string, "500m"), + gpu : optional(number, null), // Whole number of GPUs to request, 0 will schedule all available GPUs. Requires GPU-enabled nodes in the cluster, `k8s-device-plugin` installed, platform_architecture = "amd64", and additional_node_selectors = { "nvidia.com/gpu.present" = "true" } present. + health_check_path : optional(string, "/"), + aws_iam : optional(object({ + policy_json : optional(string, ""), + service_account_name : optional(string, null), + }), {}), + path : optional(string, "/*"), // Only used for CONTEXT and TARGET_GROUP_ONLY routing + priority : optional(number, 0), // Only used for CONTEXT and TARGET_GROUP_ONLY routing + success_codes : optional(string, "200-499"), + synthetics : optional(bool, false), + initial_delay_seconds : optional(number, 30), + alb_idle_timeout : optional(number, 60) // in seconds + period_seconds : optional(number, 3), + platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64; GPU nodes are amd64 only. + additional_node_selectors : optional(map(string), {}), // For GPU use: { "nvidia.com/gpu.present" = "true" } + bypasses : optional(map(object({ // Only used for INTERNAL service_type + paths = optional(set(string), []) + methods = optional(set(string), []) + })), {}) + sidecars : optional(map(object({ + image : string + tag : string + port : optional(number, 80), + scheme : optional(string, "HTTP"), + memory : optional(string, "200Mi") + cpu : optional(string, "500m") + image_pull_policy : optional(string, "IfNotPresent") // Supported values: IfNotPresent, Always, Never + health_check_path : optional(string, "/") + initial_delay_seconds : optional(number, 30), + period_seconds : optional(number, 3), + })), {}) + })) + description = "The services you want to deploy as part of this stack." + + validation { + condition = alltrue([for k, v in var.services : ( + v.scheme == "HTTP" || + v.scheme == "HTTPS" + )]) + error_message = "The scheme argument needs to be 'HTTP' or 'HTTPS'." + } + + validation { + condition = alltrue([for k, v in var.services : ( + v.image_pull_policy == "IfNotPresent" || + v.image_pull_policy == "Always" || + v.image_pull_policy == "Never" + )]) + error_message = "The image_pull_policy argument needs to be 'IfNotPresent', 'Always', or 'Never'." + } + + validation { + condition = alltrue([for k, v in var.services : ( + v.service_scheme == "HTTP" || + v.service_scheme == "HTTPS" + )]) + error_message = "The service_scheme argument needs to be 'HTTP' or 'HTTPS'." + } + + validation { + condition = alltrue([for k, v in var.services : ( + v.service_type == "EXTERNAL" || + v.service_type == "INTERNAL" || + v.service_type == "PRIVATE" || + v.service_type == "IMAGE_TEMPLATE" || + v.service_type == "TARGET_GROUP_ONLY" || + v.service_type == "VPC" + )]) + error_message = "The service_type argument needs to be 'EXTERNAL', 'INTERNAL', 'PRIVATE', 'VPC', or 'IMAGE_TEMPLATE'." + } + validation { + condition = alltrue([for k, v in var.services : v.alb != null if v.service_type == "TARGET_GROUP_ONLY"]) + error_message = "The service_type 'TARGET_GROUP_ONLY' requires an alb" + } + validation { + # The health check prefix needs to contain the service path for CONTEXT services, but not TARGET_GROUP_ONLY services. + condition = alltrue([for k, v in var.services : startswith(v.health_check_path, trimsuffix(v.path, "*")) if v.service_type != "TARGET_GROUP_ONLY"]) + error_message = "The health_check_path should start with the same prefix as the path argument." + } + validation { + condition = alltrue(flatten([for k, v in var.services : [for path in flatten([for x, y in v.bypasses : y.paths]) : startswith(path, trimsuffix(v.path, "*"))]])) + error_message = "The bypasses.paths should all start with the same prefix as the path argument." + } + validation { + condition = alltrue([for service in var.services : alltrue([for sidecar in service.sidecars : contains(["IfNotPresent", "Always", "Never"], sidecar.image_pull_policy)])]) + error_message = "Value of a sidecar image_pull_policy needs to be 'IfNotPresent', 'Always', or 'Never'." + } + validation { + condition = alltrue([for service in var.services : alltrue([for sidecar in service.sidecars : length(sidecar.health_check_path) > 0])]) + error_message = "Value of a sidecar health_check_path must be a non-empty string." + } + validation { + condition = alltrue([for service in var.services : alltrue([for sidecar in service.sidecars : sidecar.initial_delay_seconds > 0])]) + error_message = "Value of a sidecar initial_delay_seconds must be a positive number." + } + validation { + condition = alltrue([for service in var.services : alltrue([for sidecar in service.sidecars : sidecar.period_seconds > 0])]) + error_message = "Value of a sidecar period_seconds must be a positive number." + } +} + +variable "tasks" { + type = map(object({ + image : string, + memory : optional(string, "200Mi"), + cpu : optional(string, "500m"), + cmd : optional(list(string), []), + args : optional(list(string), []), + platform_architecture : optional(string, "amd64"), // Supported values: amd64, arm64 + is_cron_job : optional(bool, false), + aws_iam : optional(object({ + policy_json : optional(string, ""), + service_account_name : optional(string, null), + }), {}), + cron_schedule : optional(string, "0 0 1 1 *"), + })) + description = "The deletion/migration tasks you want to run when a stack comes up and down." + default = {} +} + +variable "routing_method" { + type = string + description = "Traffic routing method for this stack. Valid options are 'DOMAIN', when every service gets a unique domain name, or a 'CONTEXT' when all services share the same domain name, and routing is done by request path." + default = "DOMAIN" + + validation { + condition = var.routing_method == "DOMAIN" || var.routing_method == "CONTEXT" + error_message = "Only DOMAIN and CONTEXT routing methods are supported." + } +} + +variable "additional_env_vars" { + type = map(string) + description = "Additional environment variables to add to the container" + default = {} +} + +variable "additional_env_vars_from_config_maps" { + type = object({ + items : optional(list(string), []), + prefix : optional(string, ""), + }) + default = { + items = [] + prefix = "" + } + description = "Additional environment variables to add to the container from the following config maps" +} + +variable "additional_env_vars_from_secrets" { + type = object({ + items : optional(list(string), []), + prefix : optional(string, ""), + }) + default = { + items = [] + prefix = "" + } + description = "Additional environment variables to add to the container from the following secrets" +} + +variable "additional_volumes_from_secrets" { + type = object({ + items : optional(list(string), []), + base_dir : optional(string, "/var"), + }) + default = { + items = [] + base_dir = "/var" + } + description = "Additional volumes to add to the container from the following secrets" +} + +variable "additional_volumes_from_config_maps" { + type = object({ + items : optional(list(string), []), + }) + default = { + items = [] + } + description = "Additional volumes to add to the container from the following config maps" +} + +variable "create_dashboard" { + type = bool + description = "Create a dashboard for this stack" + default = false +} + +variable "additional_pod_labels" { + type = map(string) + description = "Additional labels to add to the pods." + default = {} +} + +variable "skip_config_injection" { + type = bool + description = "Skip injecting app configs into the services / tasks" + default = false +} + +variable "features" { + type = map(object({ + name : string, + enabled : bool, + config : optional(map(string), {}), + })) + description = "The features you want to enable for this stack." + default = {} +} \ No newline at end of file diff --git a/terraform/modules/happy-stack-helm-eks/versions.tf b/terraform/modules/happy-stack-helm-eks/versions.tf new file mode 100644 index 0000000000..25ebf08db6 --- /dev/null +++ b/terraform/modules/happy-stack-helm-eks/versions.tf @@ -0,0 +1,33 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = ">= 5.23" + } + kubernetes = { + source = "hashicorp/kubernetes" + version = ">= 2.23" + } + datadog = { + source = "datadog/datadog" + version = ">= 3.31" + } + validation = { + source = "tlkamp/validation" + version = "1.0.0" + } + happy = { + source = "chanzuckerberg/happy" + version = ">= 0.108" + } + random = { + source = "hashicorp/random" + version = ">= 3.5" + } + helm = { + source = "hashicorp/helm" + version = ">= 2.11" + } + } + required_version = ">= 1.3" +} diff --git a/terraform/provider/CHANGELOG.md b/terraform/provider/CHANGELOG.md index 84275e7d1f..834a03e07f 100644 --- a/terraform/provider/CHANGELOG.md +++ b/terraform/provider/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## [0.115.1](https://github.com/chanzuckerberg/happy/compare/terraform-provider-v0.115.0...terraform-provider-v0.115.1) (2023-11-02) + + +### Miscellaneous Chores + +* **terraform-provider:** Synchronize happy platform versions + +## [0.115.0](https://github.com/chanzuckerberg/happy/compare/terraform-provider-v0.114.1...terraform-provider-v0.115.0) (2023-10-31) + + +### Miscellaneous Chores + +* **terraform-provider:** Synchronize happy platform versions + +## [0.114.1](https://github.com/chanzuckerberg/happy/compare/terraform-provider-v0.114.0...terraform-provider-v0.114.1) (2023-10-26) + + +### Miscellaneous Chores + +* **terraform-provider:** Synchronize happy platform versions + +## [0.114.0](https://github.com/chanzuckerberg/happy/compare/terraform-provider-v0.113.1...terraform-provider-v0.114.0) (2023-10-24) + + +### Miscellaneous Chores + +* **terraform-provider:** Synchronize happy platform versions + ## [0.113.1](https://github.com/chanzuckerberg/happy/compare/terraform-provider-v0.113.0...terraform-provider-v0.113.1) (2023-10-18) diff --git a/terraform/provider/go.mod b/terraform/provider/go.mod index af7c147804..89579747c1 100644 --- a/terraform/provider/go.mod +++ b/terraform/provider/go.mod @@ -3,57 +3,57 @@ module github.com/chanzuckerberg/happy/terraform/provider go 1.20 require ( - github.com/aws/aws-sdk-go-v2 v1.21.2 - github.com/aws/aws-sdk-go-v2/config v1.18.45 - github.com/aws/aws-sdk-go-v2/credentials v1.13.43 - github.com/aws/aws-sdk-go-v2/service/kms v1.24.7 - github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 + github.com/aws/aws-sdk-go-v2 v1.22.2 + github.com/aws/aws-sdk-go-v2/config v1.23.0 + github.com/aws/aws-sdk-go-v2/credentials v1.15.2 + github.com/aws/aws-sdk-go-v2/service/kms v1.26.1 + github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 github.com/chanzuckerberg/happy/shared v0.0.0 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 github.com/hashicorp/terraform-plugin-docs v0.16.0 - github.com/hashicorp/terraform-plugin-sdk/v2 v2.29.0 + github.com/hashicorp/terraform-plugin-sdk/v2 v2.30.0 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.8.4 ) require ( - cirello.io/dynamolock/v2 v2.0.2 // indirect + cirello.io/dynamolock/v2 v2.0.3 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/armon/go-radix v1.0.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect - github.com/aws/smithy-go v1.15.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 // indirect + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 // indirect + github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 // indirect + github.com/aws/smithy-go v1.16.0 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/creasty/defaults v1.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.6+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -67,14 +67,14 @@ require ( github.com/go-openapi/swag v0.22.3 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.15.5 // indirect + github.com/go-playground/validator/v10 v10.16.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -83,8 +83,8 @@ require ( github.com/hashicorp/go-plugin v1.5.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hc-install v0.6.0 // indirect - github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/hashicorp/hc-install v0.6.1 // indirect + github.com/hashicorp/hcl/v2 v2.19.1 // indirect github.com/hashicorp/logutils v1.0.0 // indirect github.com/hashicorp/terraform-exec v0.19.0 // indirect github.com/hashicorp/terraform-json v0.17.1 // indirect @@ -134,7 +134,7 @@ require ( github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/src-d/gcfg v1.4.0 // indirect github.com/stretchr/objx v0.5.0 // indirect @@ -143,19 +143,19 @@ require ( github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zclconf/go-cty v1.14.1 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.15.0 // indirect golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/mod v0.12.0 // indirect + golang.org/x/mod v0.13.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.9.3 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.4.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.57.0 // indirect + google.golang.org/grpc v1.57.1 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -166,9 +166,9 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/gorm v1.25.5 // indirect gotest.tools/v3 v3.4.0 // indirect - k8s.io/api v0.28.2 // indirect - k8s.io/apimachinery v0.28.2 // indirect - k8s.io/client-go v0.28.2 // indirect + k8s.io/api v0.28.3 // indirect + k8s.io/apimachinery v0.28.3 // indirect + k8s.io/client-go v0.28.3 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect diff --git a/terraform/provider/go.sum b/terraform/provider/go.sum index f6659c72a2..b2999c25b6 100644 --- a/terraform/provider/go.sum +++ b/terraform/provider/go.sum @@ -1,5 +1,5 @@ -cirello.io/dynamolock/v2 v2.0.2 h1:4AEs4218aQLB9NfMMc/B9nmPrZZkrDNZXOgMUC0l/As= -cirello.io/dynamolock/v2 v2.0.2/go.mod h1:kC31fXt8CEX0colxFT/4r9RRKfhZLG0PFrJJXM5A24w= +cirello.io/dynamolock/v2 v2.0.3 h1:1v6BSRa3ov/ytEX8hFtY9yMstFQEnMsj9s8+jCXFDxg= +cirello.io/dynamolock/v2 v2.0.3/go.mod h1:0GKOMMD//uxSPfZk/uxgquAI7C5FvGI5AL8B6cEVvLE= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -14,8 +14,8 @@ github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBa github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 h1:KLq8BE0KwCL+mmXnjLWEAOYO+2l2AE4YMmqG1ZpZHBs= -github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= +github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= @@ -31,108 +31,85 @@ github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= -github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes= -github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= -github.com/aws/aws-sdk-go-v2/credentials v1.13.18/go.mod h1:vnwlwjIe+3XJPBYKu1et30ZPABG3VaXJYr8ryohpIyM= -github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.19/go.mod h1:sMgThC49I+7ud4V7stUsJwaaM6W/KYxRHl2A5pZDrE4= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25 h1:/+Z/dCO+1QHOlCm7m9G61snvIaDRUTv/HXp+8HdESiY= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.25/go.mod h1:JQ0HJ+3LaAKHx3uwRUAfR/tb/gOlgAGPT6mZfIq55Ec= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.46/go.mod h1:A52W+4f5wSS/TnYTFln9ngTi6Ho1IdJKSAEcvrmfYYc= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52 h1:lVqqyVoBUy7Kp2sOo9xJtC37FafV2sDtee9qpC5bm3w= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.52/go.mod h1:+wabPhA5NvnAA/VSQAHIlfvdDn0nnA7P3S5Lc0Q5UiQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1/go.mod h1:lfUx8puBRdM5lVVMQlwt2v+ofiG/X6Ms+dy0UkG/kXw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= +github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= +github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= +github.com/aws/aws-sdk-go-v2/config v1.23.0 h1:kqzEfGGDIrRJpfJckgwuZfFTbU9NB1jZnRcaO9MpOqE= +github.com/aws/aws-sdk-go-v2/config v1.23.0/go.mod h1:p7wbxKXXjS1GGQOss7VXOazVMFF9bjUGq85/4wR/fSw= +github.com/aws/aws-sdk-go-v2/credentials v1.15.2 h1:rKH7khRMxPdD0u3dHecd0Q7NOVw3EUe7AqdkUOkiOGI= +github.com/aws/aws-sdk-go-v2/credentials v1.15.2/go.mod h1:tXM8wmaeAhfC7nZoCxb0FzM/aRaB1m1WQ7x0qlBLq80= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43 h1:jlR1Rwjb3z5d1p0sqhNcuCaqdp73H+1O/X8Lc2kBDrY= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.43/go.mod h1:X1HGecFASboCkBt1GJRM4a/FDYYogu9AciUoXVsbr4U= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71 h1:nLwQrLSBpcZq3MtpTUcpBqPwKL5V/uO/iuYMU+STv68= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.71/go.mod h1:Vjebi0MUXOcsV9YCE2Jxqrqq3FchwyIMbaIzm5NmrKw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 h1:G5KawTAkyHH6WyKQCdHiW4h3PmAXNJpOgwKg3H7sDRE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3/go.mod h1:hugKmSFnZB+HgNI1sYGT14BUPZkO6alC/e0AWu+0IAQ= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1 h1:NL2HEgcchk/QTa9/8GgrZvmfvCwqCDknvzAOMuvANnU= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.1/go.mod h1:ZD/6Xew+gqhnRBg9iRXNYZOhp4BXKfqe7JRrtOnIh8s= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.2/go.mod h1:KdM++ikeFLtf0RX0WHUdF/nugF8uUntGmJS3Ywo7lVo= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.19.7/go.mod h1:1MNss6sqoIsFGisX92do/5doiUCBrN7EjhZCS/8DUjI= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1 h1:TYq4EU2vEEluoaBG0RCPnbibSndTQSzlpbZdmT/YRcs= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.22.1/go.mod h1:1EJb9/tJwI7iqiStZBcmHijQxcgp7dlPuD2YgoZIrJQ= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.7/go.mod h1:eRmcVwDpfeYgamYv+57cqM9hMWw+/TOqwGsbm39JHgc= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11 h1:WHi9VKMYGtWt2DzqeYHXzt55aflymO2EZ6axuKla8oU= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.11/go.mod h1:pP+91QTpJMvcFTqGky6puHrkBs8oqoB3XOCiGRDaXwI= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0 h1:XnUTMYuPGOrQjlTcf9XoRYBLrN7xjzakkK0+QyP8fO0= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.125.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1 h1:Y2zGozmCogCCQbO2fplC6tZylBTBBgt/2EcdVRRK5go= -github.com/aws/aws-sdk-go-v2/service/ecr v1.20.1/go.mod h1:J9goPpIjXafA1u3XGJeoHu9WlMp5qAGwWmS1A8LfZVw= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1 h1:bOS7hAfvd8+glVAG88WnvRITe5N1vopGFHh10ORe/BI= -github.com/aws/aws-sdk-go-v2/service/ecs v1.30.1/go.mod h1:cxbA26Kf4UlTb40f5FON22ZPNMyEVmMS82KUJZC1E1w= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6 h1:cZhJzuUYDqWEx5aWUeYEK8z0a51o5JV+uAWBpp5zArA= -github.com/aws/aws-sdk-go-v2/service/eks v1.29.6/go.mod h1:tQn6wLs+/9umB4Xj1z4RW+EMLWxPxs6ajfM5UcUlhnI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= +github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg= +github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2 h1:g2t+hNCOYWICWs0cQLXk86DnXQMXgx1omrAGEpF/d68= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.24.2/go.mod h1:5ngOUsc/7/voqXQ5Mn5T5l9/rWopTMgu7hk+4Fl2AS4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.23.0/go.mod h1:1HkLh8vaL4obF95fne7ZOu7sxomS/+vkBt3/+gqqwE4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0 h1:wAG9NailFhGhg8Ngg2YeCtzGmFWc63SYqJKdvN5ZMkE= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.25.0/go.mod h1:ByrosnNlEq6xkA0d+FwB4f0HH/5KWCcgBqVxAt+Rsps= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7 h1:WCeS9WZbIqEKCbgIkrHB5jw/9mO2QMYTLPF8wee3v4Y= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.15.7/go.mod h1:uT1paW42RVCVEoAEbWKu98gEI0GMBWUsT/H+pI4ODJQ= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0 h1:JCUTmTs7W1yvUCOdONMX7Hjgn7N9pj57y4/ibU4KFp4= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.128.0/go.mod h1:raUdIDoNuDPn9dMG3cCmIm8RoWOmZUqQPzuw8xpmB8Y= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0 h1:TA2V0OLAwEooOnCk2ZBgxTPAtb20Fgbkr7IrI/YxbAg= +github.com/aws/aws-sdk-go-v2/service/ecr v1.22.0/go.mod h1:/1jvJouA9LvRdzQmTFwlvf3RKFXQz3jgL4AcPuaaoO8= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0 h1:PH9chTOUwd0PPUEwunePjUYp6QD0KsZvDcUy6VToKVQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.32.0/go.mod h1:4HwGjM2Z7cMaLV1ddXhKeI1o+hRJhp7A0WnvcgjWyRI= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0 h1:d6WbsOHHsEMryKLc9oYCmvu4lrV9z9QLSQ5S44KSn0o= +github.com/aws/aws-sdk-go-v2/service/eks v1.30.0/go.mod h1:Nt5l6Vn68Hv0JWJ6dcQDKuBAKAfHUZSC9Ln8X/1fUMY= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.25/go.mod h1:zrjXfehNxd4la9SByaw7KQk4AmGkdmeASpOJezwed0g= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.27/go.mod h1:DfuVY36ixXnsG+uTqnoLWunXAKJ4qjccoFrXUPpj+hs= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36 h1:0ZzowXTZABVqnJnwDMlTDP3eeEkuP1r6RYnhSBmgK2o= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.36/go.mod h1:zAE5h/4VanzBpqyWoCZX/nJImdsqjjsGt2r3MtbKSFA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.37/go.mod h1:7xBUZyP6LeLc+5Ym9PG7atqw4sR28sBtYcHETik+bPE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1 h1:aY45T0Xk+xHHrQPlQrp8IhrgN7k4SL5VF2UXhsmI2rs= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.1/go.mod h1:5E/dXkj2ljMIAvuYaFuYwitKJg6ULwsDbUr3g8izVB0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= -github.com/aws/aws-sdk-go-v2/service/kms v1.24.7 h1:uRGw0UKo5hc7M2T7uGsK/Yg2qwecq/dnVjQbbq9RCzY= -github.com/aws/aws-sdk-go-v2/service/kms v1.24.7/go.mod h1:z3O9CXfVrKAV3c9fMWOUUv2C6N2ggXCDHeXpOB6lAEk= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0 h1:z9faFYBvadv9HdY+oFBgxqCnew9TK+jp9ccxktB5fl4= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.21.0/go.mod h1:Z6Oq1mXqvgwmUxvMrV/jMkQhwm06A9XO015dzGnS8TM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2 h1:NMZiW2pbSW/PFCGT/J6R/8xaiFsF/SDdRN49q0NUhA8= -github.com/aws/aws-sdk-go-v2/service/ssm v1.38.2/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.6/go.mod h1:Y1VOmit/Fn6Tz1uFAeCO6Q7M2fmfXSCLeL5INVYsLuY= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6/go.mod h1:Lh/bc9XUf8CfOY6Jp5aIkQtN+j1mc+nExc+KXj9jx2s= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.7/go.mod h1:JuTnSoeePXmMVe9G8NcjjwgOKEfZ4cOjMuT2IBT/2eI= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo= +github.com/aws/aws-sdk-go-v2/service/kms v1.26.1 h1:YSWNecoEY4Wctdw29aY91T7a6pl1fe7LNceYBqfhCtc= +github.com/aws/aws-sdk-go-v2/service/kms v1.26.1/go.mod h1:kU7as8hswMlxu1rDRWIFn56U1X432hFb9jbEyNUaq5Q= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1 h1:xK86ln1cEDa0cUpLaCbFFX/BABPw4ognfzpGfbF4PkY= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.1/go.mod h1:eqTdeirkcyBiDviU/N1JMcImS9zEJDn5wOzX3BsU4wU= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0 h1:DHZFzwbFXlfw15I0ERlTVB/YH9iHNr2C1axjRpB7/Gg= +github.com/aws/aws-sdk-go-v2/service/ssm v1.40.0/go.mod h1:qpnJ98BgJ3YUEvHMgJ1OADwaOgqhgv0nxnqAjTKupeY= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 h1:km+ZNjtLtpXYf42RdaDZnNHm9s7SYAuDGTafy6nd89A= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.1/go.mod h1:aHBr3pvBSD5MbzOvQtYutyPLLRPbl/y9x86XyJJnUXQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 h1:iRFNqZH4a67IqPvK8xxtyQYnyrlsvwmpHOe9r55ggBA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1/go.mod h1:pTy5WM+6sNv2tB24JNKFtn6EvciQ5k40ZJ0pq/Iaxj0= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 h1:txgVXIXWPXyqdiVn92BV6a/rgtpX31HYdsOYj0sVQQQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.1/go.mod h1:VAiJiNaoP1L89STFlEMgmHX1bKixY+FaP+TpRFrmyZ4= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= +github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA= github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -155,8 +132,8 @@ github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9 github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= -github.com/go-git/go-git/v5 v5.8.1 h1:Zo79E4p7TRk0xoRgMq0RShiTHGKcKI4+DI6BfJc/Q+A= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-git/v5 v5.9.0 h1:cD9SFA7sHVRdJ7AYck1ZaAa/yeuBvGPxwXDL8cxrObY= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -171,8 +148,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= -github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= +github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -193,16 +170,16 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -225,10 +202,10 @@ github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/C github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hc-install v0.6.0 h1:fDHnU7JNFNSQebVKYhHZ0va1bC6SrPQ8fpebsvNr2w4= -github.com/hashicorp/hc-install v0.6.0/go.mod h1:10I912u3nntx9Umo1VAeYPUUuehk0aRQJYpMwbX5wQA= -github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= -github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/hc-install v0.6.1 h1:IGxShH7AVhPaSuSJpKtVi/EFORNjO+OYVJJrAtGG2mY= +github.com/hashicorp/hc-install v0.6.1/go.mod h1:0fW3jpg+wraYSnFDJ6Rlie3RvLf1bIqVIkzoon4KoVE= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/terraform-exec v0.19.0 h1:FpqZ6n50Tk95mItTSS9BjeOVUb4eg81SpgVtZNNtFSM= @@ -241,8 +218,8 @@ github.com/hashicorp/terraform-plugin-go v0.19.0 h1:BuZx/6Cp+lkmiG0cOBk6Zps0Cb2t github.com/hashicorp/terraform-plugin-go v0.19.0/go.mod h1:EhRSkEPNoylLQntYsk5KrDHTZJh9HQoumZXbOGOXmec= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.29.0 h1:wcOKYwPI9IorAJEBLzgclh3xVolO7ZorYd6U1vnok14= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.29.0/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.30.0 h1:X7vB6vn5tON2b49ILa4W7mFAsndeqJ7bZFOGbVO+0Cc= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.30.0/go.mod h1:ydFcxbdj6klCqYEPkPvdvFKiNGKZLUs+896ODUXCyao= github.com/hashicorp/terraform-registry-address v0.2.2 h1:lPQBg403El8PPicg/qONZJDC6YlgCVbWDtNmmZKtBno= github.com/hashicorp/terraform-registry-address v0.2.2/go.mod h1:LtwNbCihUoUZ3RYriyS2wF/lGPB6gF9ICLRtuDk7hSo= github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= @@ -380,8 +357,8 @@ github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJC github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= @@ -432,8 +409,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -441,8 +418,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -467,7 +444,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -494,15 +471,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -511,10 +488,10 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -524,8 +501,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -535,8 +512,8 @@ google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= +google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= @@ -570,12 +547,12 @@ gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= -k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= -k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= -k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= -k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= -k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= +k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= +k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= +k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= +k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= +k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ=