diff --git a/.github/workflows/Makefile b/.github/workflows/Makefile index 159bc0cf..299e5e2f 100644 --- a/.github/workflows/Makefile +++ b/.github/workflows/Makefile @@ -1,8 +1,8 @@ HELM_VERSION ?= v3.7.2 KUSTOMIZE_VERSION ?= v5.4.3 -K8S_VERSION ?= v1.28.11 +K8S_VERSION ?= v1.32.1 MINIKUBE_VERSION ?= v1.31.1 -SOPS_VERSION ?= v3.9.0 +SOPS_VERSION ?= v3.9.3 # --- CHANGE_MINIKUBE_NONE_USER ?= true diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b4390a36..5ac7ff88 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,9 +18,9 @@ jobs: with: go-version-file: go.mod cache: false - - uses: golangci/golangci-lint-action@v6 + - uses: golangci/golangci-lint-action@v7 with: - version: v1.57.2 + version: v2.0.2 tests: runs-on: ubuntu-latest @@ -54,50 +54,38 @@ jobs: # Helm maintains the latest minor version only and therefore each Helmfile version supports 2 Helm minor versions. # That's why we cover only 2 Helm minor versions in this matrix. # See https://github.com/helmfile/helmfile/pull/286#issuecomment-1250161182 for more context. - - helm-version: v3.15.4 + - helm-version: v3.16.4 kustomize-version: v5.2.1 plugin-secrets-version: 3.15.0 - plugin-diff-version: 3.8.1 + plugin-diff-version: 3.10.0 extra-helmfile-flags: '' - v1mode: '' - - helm-version: v3.15.4 + - helm-version: v3.16.4 kustomize-version: v5.4.3 # We assume that the helm-secrets plugin is supposed to # work with the two most recent helm minor versions. # Once it turned out to be not practically true, # we will mark this combination as failable, # and instruct users to upgrade helm and helm-secrets at once. - plugin-secrets-version: 4.6.0 - plugin-diff-version: 3.9.11 + plugin-secrets-version: 4.6.3 + plugin-diff-version: 3.11.0 extra-helmfile-flags: '' - v1mode: '' - - helm-version: v3.16.1 + - helm-version: v3.17.3 kustomize-version: v5.2.1 plugin-secrets-version: 3.15.0 - plugin-diff-version: 3.8.1 + plugin-diff-version: 3.10.0 extra-helmfile-flags: '' - v1mode: '' - - helm-version: v3.16.1 + - helm-version: v3.17.3 kustomize-version: v5.4.3 - plugin-secrets-version: 4.6.0 - plugin-diff-version: 3.9.11 + plugin-secrets-version: 4.6.3 + plugin-diff-version: 3.11.0 extra-helmfile-flags: '' - v1mode: '' - # Helmfile v1 - - helm-version: v3.16.1 - kustomize-version: v5.4.3 - plugin-secrets-version: 4.6.0 - plugin-diff-version: 3.9.11 - extra-helmfile-flags: '' - v1mode: 'true' # In case you need to test some optional helmfile features, # enable it via extra-helmfile-flags below. - - helm-version: v3.16.1 + - helm-version: v3.17.3 kustomize-version: v5.4.3 - plugin-secrets-version: 4.6.0 - plugin-diff-version: 3.9.11 + plugin-secrets-version: 4.6.3 + plugin-diff-version: 3.11.0 extra-helmfile-flags: '--enable-live-output' - v1mode: '' steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 @@ -127,7 +115,6 @@ jobs: HELMFILE_HELM3: 1 TERM: xterm EXTRA_HELMFILE_FLAGS: ${{ matrix.extra-helmfile-flags }} - HELMFILE_V1MODE: ${{ matrix.v1mode }} e2e_tests: needs: tests diff --git a/.github/workflows/releaser.yaml b/.github/workflows/releaser.yaml index ee2f0dc9..fc98bd7c 100644 --- a/.github/workflows/releaser.yaml +++ b/.github/workflows/releaser.yaml @@ -16,7 +16,6 @@ permissions: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - HELMFILE_V1MODE: ${{ startsWith(github.ref, 'refs/tags/v1') }} SNAPSHOT: ${{ !startsWith(github.ref, 'refs/tags/v') && '--snapshot' || '' }} jobs: diff --git a/.golangci.yaml b/.golangci.yaml index d0c0f1c2..99add513 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,360 +1,146 @@ -# This file contains all available configuration options -# with their default values. - -# options for analysis running +version: "2" run: - # default concurrency is a available CPU number - # concurrency: 4 - - # timeout for analysis, e.g. 30s, 5m, default is 1m - timeout: 30m - - # exit code when at least one issue was found, default is 1 issues-exit-code: 1 - - # include test files or not, default is true tests: true - - # list of build tags, all linters use it. Default is empty list. - # build-tags: - # - mytag - - # which dirs to skip: issues from them won't be reported; - # can use regexp here: generated.*, regexp is applied on full path; - # default value is empty list, but default dirs are skipped independently - # from this option's value (see skip-dirs-use-default). - # skip-dirs: - # - src/external_libs - # - autogenerated_by_my_lib - - # default is true. Enables skipping of directories: - # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ - skip-dirs-use-default: true - - # which files to skip: they will be analyzed, but issues from them - # won't be reported. Default value is empty list, but there is - # no need to include all autogenerated files, we confidently recognize - # autogenerated files. If it's not please let us know. - # skip-files: - # - ".*\\.my\\.go$" - # - lib/bad.go - - # by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules": - # If invoked with -mod=readonly, the go command is disallowed from the implicit - # automatic updating of go.mod described above. Instead, it fails when any changes - # to go.mod are needed. This setting is most useful to check that go.mod does - # not need updates, such as in a continuous integration and testing system. - # If invoked with -mod=vendor, the go command assumes that the vendor - # directory holds the correct copies of dependencies and ignores - # the dependency descriptions in go.mod. - # modules-download-mode: readonly|release|vendor - -# output configuration options output: - # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" - format: line-number - - # print lines of code with issue, default is true - print-issued-lines: true - - # print linter name in the end of issue text, default is true - print-linter-name: true - -# all available settings of specific linters -linters-settings: - gci: - sections: - - standard - - default - - prefix(github.com/helmfile/helmfile) - - errcheck: - # report about not checking of errors in type assetions: `a := b.(MyStruct)`; - # default is false: such cases aren't reported by default. - check-type-assertions: false - - # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; - # default is false: such cases aren't reported by default. - check-blank: false - - # [deprecated] comma-separated list of pairs of the form pkg:regex - # the regex is used to ignore names within pkg. (default "fmt:.*"). - # see https://github.com/kisielk/errcheck#the-deprecated-method for details - # ignore: fmt:.* - - # path to a file containing a list of functions to exclude from checking - # see https://github.com/kisielk/errcheck#excluding-functions for details - # exclude: /path/to/file.txt - - # Disable error checking, as errorcheck detects more errors and is more configurable. - gosec: - exclude: - - "G104" - - govet: - # report about shadowed variables - check-shadowing: false - - # settings per analyzer - settings: - printf: # analyzer name, run `go tool vet help` to see all analyzers - funcs: # run `go tool vet help printf` to see available settings for `printf` analyzer - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf - - # enable or disable analyzers by name - # enable: - # - atomicalign - # enable-all: false - # disable: - # - shadow - # disable-all: false - golint: - # minimal confidence for issues, default is 0.8 - min-confidence: 0.8 - gofmt: - # simplify code: gofmt with `-s` option, true by default - simplify: true - goimports: - # put imports beginning with prefix after 3rd-party packages; - # it's a comma-separated list of prefixes - # local-prefixes: github.com/org/project - gocyclo: - # minimal code complexity to report, 30 by default (but we recommend 10-20) - min-complexity: 30 - gocognit: - # minimal code complexity to report, 30 by default (but we recommend 10-20) - min-complexity: 100 - maligned: - # print struct with more effective memory layout or not, false by default - suggest-new: true - dupl: - # tokens count to trigger issue, 150 by default - threshold: 100 - goconst: - # minimal length of string constant, 3 by default - min-len: 3 - # minimal occurrences count to trigger, 3 by default - min-occurrences: 8 - # depguard: - # list-type: blacklist - # include-go-root: false - # packages: - # - github.com/sirupsen/logrus - # packages-with-error-messages: - # # specify an error message to output when a blacklisted package is used - # github.com/sirupsen/logrus: "logging is allowed only by logutils.Log" - misspell: - # Correct spellings using locale preferences for US or UK. - # Default is to use a neutral variety of English. - # Setting locale to US will correct the British spelling of 'colour' to 'color'. - locale: US - ignore-words: - - GitLab - lll: - # max line length, lines longer will be reported. Default is 120. - # '\t' is counted as 1 character by default, and can be changed with the tab-width option - line-length: 120 - # tab width in spaces. Default to 1. - tab-width: 1 - unused: - # treat code as a program (not a library) and report unused exported identifiers; default is false. - # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: - # if it's called for subdir of a project it can't find funcs usages. All text editor integrations - # with golangci-lint call it on a directory with the changed file. - check-exported: false - unparam: - # Inspect exported functions, default is false. Set to true if no external program/library imports your code. - # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: - # if it's called for subdir of a project it can't find external interfaces. All text editor integrations - # with golangci-lint call it on a directory with the changed file. - check-exported: false - nakedret: - # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 - max-func-lines: 50 - prealloc: - # XXX: we don't recommend using this linter before doing performance profiling. - # For most programs usage of prealloc will be a premature optimization. - - # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. - # True by default. - simple: true - range-loops: true # Report preallocation suggestions on range loops, true by default - for-loops: false # Report preallocation suggestions on for loops, false by default - gocritic: - # Which checks should be enabled; can't be combined with 'disabled-checks'; - # See https://go-critic.github.io/overview#checks-overview - # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run` - # By default list of stable checks is used. - # enabled-checks: - # - rangeValCopy - - # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty - # disabled-checks: - # - regexpMust - - # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks. - # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". - # enabled-tags: - # - performance - - settings: # settings passed to gocritic - captLocal: # must be valid enabled check name - paramsOnly: true - # rangeValCopy: - # sizeThreshold: 32 - godox: - # report any comments starting with keywords, this is useful for TODO or FIXME comments that - # might be left in the code accidentally and should be resolved before merging - keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting - - TODO - - BUG - - FIXME - - NOTE - - OPTIMIZE # marks code that should be optimized before merging - - HACK # marks hack-arounds that should be removed before merging - dogsled: - # checks assignments with too many blank identifiers; default is 2 - max-blank-identifiers: 2 - - whitespace: - multi-if: false # Enforces newlines (or comments) after every multi-line if statement - multi-func: false # Enforces newlines (or comments) after every multi-line function signature - wsl: - # If true append is only allowed to be cuddled if appending value is - # matching variables, fields or types on line above. Default is true. - strict-append: true - # Allow calls and assignments to be cuddled as long as the lines have any - # matching variables, fields or types. Default is true. - allow-assign-and-call: true - # Allow multiline assignments to be cuddled. Default is true. - allow-multiline-assign: true - # Allow declarations (var) to be cuddled. - allow-cuddle-declarations: false - # Allow trailing comments in ending of blocks - allow-trailing-comment: false - # Force newlines in end of case at this limit (0 = never). - force-case-trailing-whitespace: 0 - revive: - ignore-generated-header: true - severity: warning - funlen: - # Checks the number of lines in a function. - # If lower than 0, disable the check. - # Default: 60 - lines: 280 - # Checks the number of statements in a function. - # If lower than 0, disable the check. - # Default: 40 - statements: 140 - + formats: + text: + path: stdout + print-linter-name: true + print-issued-lines: true + colors: false linters: - # please, do not use `enable-all`: it's deprecated and will be removed soon. - # inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint - disable-all: true + default: none enable: - bodyclose - - usestdlibvars - - reassign + - copyloopvar - errcheck - funlen - gocognit - goconst - - gofmt - - goimports - - revive - - gosimple - govet - ineffassign - misspell - nakedret - - exportloopref + - reassign + - revive - staticcheck - - typecheck - unconvert - unparam - unused + - usestdlibvars - whitespace - - gci - # don't enable: - # - depguard - # - deadcode - # - gochecknoglobals - # - gochecknoinits - # - gocyclo - # - lll - # - maligned - # - prealloc - # - varcheck - # - gocritic - # - godox - # - gosec - # - interfacer - # - stylecheck - # - dogsled - # - dupl + settings: + staticcheck: + checks: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022", "-ST1005", "-QF1001", "-QF1008"] + dogsled: + max-blank-identifiers: 2 + dupl: + threshold: 100 + errcheck: + check-type-assertions: false + check-blank: false + funlen: + lines: 280 + statements: 140 + gocognit: + min-complexity: 100 + goconst: + min-len: 3 + min-occurrences: 8 + gocritic: + settings: + captLocal: + paramsOnly: true + gocyclo: + min-complexity: 30 + godox: + keywords: + - TODO + - BUG + - FIXME + - NOTE + - OPTIMIZE + - HACK + gosec: + excludes: + - G104 + govet: + disable: + - shadow + settings: + printf: + funcs: + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf + - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf + lll: + line-length: 120 + tab-width: 1 + misspell: + locale: US + ignore-rules: + - GitLab + nakedret: + max-func-lines: 50 + prealloc: + simple: true + range-loops: true + for-loops: false + revive: + confidence: 0.8 + severity: warning + unparam: + check-exported: false + whitespace: + multi-if: false + multi-func: false + wsl: + strict-append: true + allow-assign-and-call: true + allow-multiline-assign: true + force-case-trailing-whitespace: 0 + allow-trailing-comment: false + allow-cuddle-declarations: false + exclusions: + generated: lax + rules: + - linters: + - dupl + - errcheck + - funlen + - gocyclo + - gosec + path: _test\.go + - linters: + - lll + source: '^//go:generate ' + paths: + - third_party$ + - builtin$ + - examples$ issues: - # List of regexps of issue texts to exclude, empty list by default. - # But independently from this option we use default exclude patterns, - # it can be disabled by `exclude-use-default: false`. To list all - # excluded by default patterns execute `golangci-lint run --help` - # exclude: - # - abcdef - - # Excluding configuration per-path, per-linter, per-text and per-source - exclude-rules: - # Exclude some linters from running on tests files. - - path: _test\.go - linters: - - gocyclo - - errcheck - - dupl - - gosec - - funlen - - # Exclude known linters from partially hard-vendored code, - # which is impossible to exclude via "nolint" comments. - # - path: internal/hmac/ - # text: "weak cryptographic primitive" - # linters: - # - gosec - - # Exclude some staticcheck messages - # - linters: - # - staticcheck - # text: "SA9003:" - - # Exclude lll issues for long lines with go:generate - - linters: - - lll - source: "^//go:generate " - - # Independently from option `exclude` we use default exclude patterns, - # it can be disabled by this option. To list all - # excluded by default patterns execute `golangci-lint run --help`. - # Default value for this option is true. - exclude-use-default: false - - # Maximum issues count per one linter. Set to 0 to disable. Default is 50. max-issues-per-linter: 0 - - # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. max-same-issues: 0 - - # Show only new issues: if there are unstaged changes or untracked files, - # only those changes are analyzed, else only changes in HEAD~ are analyzed. - # It's a super-useful option for integration of golangci-lint into existing - # large codebase. It's not practical to fix all existing issues at the moment - # of integration: much better don't allow issues in new code. - # Default is false. new: false - - # Show only new issues created after git revision `REV` - # This should be passed as flag during individual CI jobs. - # new-from-rev: REV - - # Show only new issues created in git patch with set file path. - # new-from-patch: path/to/patch/file \ No newline at end of file +formatters: + enable: + - gci + - gofmt + - goimports + settings: + gci: + sections: + - standard + - default + - prefix(github.com/helmfile/helmfile) + gofmt: + simplify: true + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/.goreleaser.yml b/.goreleaser.yml index 6d515513..e2f1a834 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,8 +1,5 @@ version: 2 project_name: helmfile -env: - # We default to non-v1 mode (=helmfile v0.x behavior) when HELMFILE_V1MODE is not set - - HELMFILE_V1MODE={{ if index .Env "HELMFILE_V1MODE" }}{{ .Env.HELMFILE_V1MODE }}{{ else }}false{{ end }} builds: - id: helmfile main: . @@ -15,7 +12,6 @@ builds: - -X go.szostok.io/version.commit={{.FullCommit}} - -X go.szostok.io/version.commitDate={{.CommitDate}} - -X go.szostok.io/version.dirtyBuild=false - - -X github.com/helmfile/helmfile/pkg/runtime.v1Mode={{.Env.HELMFILE_V1MODE}} goos: - darwin - linux @@ -24,7 +20,14 @@ builds: - amd64 - arm64 - "386" - +archives: + - id: helmfile + ids: + - helmfile + builds_info: + group: root + owner: root + mode: 0644 changelog: use: github sort: asc diff --git a/Dockerfile b/Dockerfile index b157780a..cb320f9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.22-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder RUN apk add --no-cache make git WORKDIR /workspace/helmfile @@ -30,7 +30,7 @@ ENV HELM_CONFIG_HOME="${HELM_CONFIG_HOME}" ARG HELM_DATA_HOME="${HOME}/.local/share/helm" ENV HELM_DATA_HOME="${HELM_DATA_HOME}" -ARG HELM_VERSION="v3.16.1" +ARG HELM_VERSION="v3.17.3" ENV HELM_VERSION="${HELM_VERSION}" ARG HELM_LOCATION="https://get.helm.sh" ARG HELM_FILENAME="helm-${HELM_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz" @@ -38,8 +38,8 @@ RUN set -x && \ curl --retry 5 --retry-connrefused -LO "${HELM_LOCATION}/${HELM_FILENAME}" && \ echo Verifying ${HELM_FILENAME}... && \ case ${TARGETPLATFORM} in \ - "linux/amd64") HELM_SHA256="e57e826410269d72be3113333dbfaac0d8dfdd1b0cc4e9cb08bdf97722731ca9" ;; \ - "linux/arm64") HELM_SHA256="780b5b86f0db5546769b3e9f0204713bbdd2f6696dfdaac122fbe7f2f31541d2" ;; \ + "linux/amd64") HELM_SHA256="ee88b3c851ae6466a3de507f7be73fe94d54cbf2987cbaa3d1a3832ea331f2cd" ;; \ + "linux/arm64") HELM_SHA256="7944e3defd386c76fd92d9e6fec5c2d65a323f6fadc19bfb5e704e3eee10348e" ;; \ esac && \ echo "${HELM_SHA256} ${HELM_FILENAME}" | sha256sum -c && \ echo Extracting ${HELM_FILENAME}... && \ @@ -50,13 +50,12 @@ RUN set -x && \ # using the install documentation found at https://kubernetes.io/docs/tasks/tools/install-kubectl/ # for now but in a future version of alpine (in the testing version at the time of writing) # we should be able to install using apk add. -ENV KUBECTL_VERSION="v1.28.9" +ENV KUBECTL_VERSION="v1.32.1" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl" && \ case ${TARGETPLATFORM} in \ - # checksums are available at https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl.sha256 - "linux/amd64") KUBECTL_SHA256="b4693d0b22f509250694b10c7727c42b427d570af04f2065fe23a55d6c0051f1" ;; \ - "linux/arm64") KUBECTL_SHA256="e0341d3973213f8099e7fcbbf6d1d506967bc2b7a4faac3fb3b4340f226e9b2f" ;; \ + "linux/amd64") KUBECTL_SHA256="e16c80f1a9f94db31063477eb9e61a2e24c1a4eee09ba776b029048f5369db0c" ;; \ + "linux/arm64") KUBECTL_SHA256="98206fd83a4fd17f013f8c61c33d0ae8ec3a7c53ec59ef3d6a0a9400862dc5b2" ;; \ esac && \ echo "${KUBECTL_SHA256} kubectl" | sha256sum -c && \ chmod +x kubectl && \ @@ -68,16 +67,16 @@ ARG KUSTOMIZE_FILENAME="kustomize_${KUSTOMIZE_VERSION}_${TARGETOS}_${TARGETARCH} RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/${KUSTOMIZE_FILENAME}" && \ case ${TARGETPLATFORM} in \ - # Checksums are available at https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/checksums.txt - "linux/amd64") KUSTOMIZE_SHA256="3669470b454d865c8184d6bce78df05e977c9aea31c30df3c669317d43bcc7a7" ;; \ - "linux/arm64") KUSTOMIZE_SHA256="1b515578b0af12c15d9856720066ce2fe66756d63785b2cbccaf2885beb2381c" ;; \ + # Checksums are available at https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/checksums.txt + "linux/amd64") KUSTOMIZE_SHA256="3669470b454d865c8184d6bce78df05e977c9aea31c30df3c669317d43bcc7a7" ;; \ + "linux/arm64") KUSTOMIZE_SHA256="1b515578b0af12c15d9856720066ce2fe66756d63785b2cbccaf2885beb2381c" ;; \ esac && \ echo "${KUSTOMIZE_SHA256} ${KUSTOMIZE_FILENAME}" | sha256sum -c && \ tar xvf "${KUSTOMIZE_FILENAME}" -C /usr/local/bin && \ rm "${KUSTOMIZE_FILENAME}" && \ [ "$(kustomize version)" = "${KUSTOMIZE_VERSION}" ] -ENV SOPS_VERSION="v3.9.0" +ENV SOPS_VERSION="v3.9.3" ARG SOPS_FILENAME="sops-${SOPS_VERSION}.${TARGETOS}.${TARGETARCH}" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/getsops/sops/releases/download/${SOPS_VERSION}/${SOPS_FILENAME}" && \ @@ -85,7 +84,7 @@ RUN set -x && \ mv "${SOPS_FILENAME}" /usr/local/bin/sops && \ sops --version --disable-version-check | grep -E "^sops ${SOPS_VERSION#v}" -ENV AGE_VERSION="v1.1.1" +ENV AGE_VERSION="v1.2.0" ARG AGE_FILENAME="age-${AGE_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/FiloSottile/age/releases/download/${AGE_VERSION}/${AGE_FILENAME}" && \ @@ -94,10 +93,10 @@ RUN set -x && \ [ "$(age --version)" = "${AGE_VERSION}" ] && \ [ "$(age-keygen --version)" = "${AGE_VERSION}" ] -RUN helm plugin install https://github.com/databus23/helm-diff --version v3.9.11 && \ - helm plugin install https://github.com/jkroepke/helm-secrets --version v4.6.0 && \ - helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.16.2 && \ - helm plugin install https://github.com/aslafy-z/helm-git.git --version v0.16.0 && \ +RUN helm plugin install https://github.com/databus23/helm-diff --version v3.11.0 && \ + helm plugin install https://github.com/jkroepke/helm-secrets --version v4.6.3 && \ + helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.16.3 && \ + helm plugin install https://github.com/aslafy-z/helm-git.git --version v1.3.0 && \ rm -rf ${HELM_CACHE_HOME}/plugins # Allow users other than root to use helm plugins located in root home diff --git a/Dockerfile.debian-stable-slim b/Dockerfile.debian-stable-slim index dce57e5e..10febf37 100644 --- a/Dockerfile.debian-stable-slim +++ b/Dockerfile.debian-stable-slim @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.22-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder RUN apk add --no-cache make git WORKDIR /workspace/helmfile @@ -18,9 +18,9 @@ LABEL org.opencontainers.image.source=https://github.com/helmfile/helmfile RUN apt update -qq && \ apt install --no-install-recommends -y \ - ca-certificates \ - gnupg \ - git bash curl jq wget openssh-client && \ + ca-certificates \ + gnupg \ + git bash curl jq wget openssh-client && \ rm -rf /var/lib/apt/lists/* ARG TARGETARCH TARGETOS TARGETPLATFORM @@ -35,7 +35,7 @@ ENV HELM_CONFIG_HOME="${HELM_CONFIG_HOME}" ARG HELM_DATA_HOME="${HOME}/.local/share/helm" ENV HELM_DATA_HOME="${HELM_DATA_HOME}" -ARG HELM_VERSION="v3.16.1" +ARG HELM_VERSION="v3.17.3" ENV HELM_VERSION="${HELM_VERSION}" ARG HELM_LOCATION="https://get.helm.sh" ARG HELM_FILENAME="helm-${HELM_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz" @@ -43,8 +43,8 @@ RUN set -x && \ curl --retry 5 --retry-connrefused -LO "${HELM_LOCATION}/${HELM_FILENAME}" && \ echo Verifying ${HELM_FILENAME}... && \ case ${TARGETPLATFORM} in \ - "linux/amd64") HELM_SHA256="e57e826410269d72be3113333dbfaac0d8dfdd1b0cc4e9cb08bdf97722731ca9" ;; \ - "linux/arm64") HELM_SHA256="780b5b86f0db5546769b3e9f0204713bbdd2f6696dfdaac122fbe7f2f31541d2" ;; \ + "linux/amd64") HELM_SHA256="ee88b3c851ae6466a3de507f7be73fe94d54cbf2987cbaa3d1a3832ea331f2cd" ;; \ + "linux/arm64") HELM_SHA256="7944e3defd386c76fd92d9e6fec5c2d65a323f6fadc19bfb5e704e3eee10348e" ;; \ esac && \ echo "${HELM_SHA256} ${HELM_FILENAME}" | sha256sum -c && \ echo Extracting ${HELM_FILENAME}... && \ @@ -55,13 +55,13 @@ RUN set -x && \ # using the install documentation found at https://kubernetes.io/docs/tasks/tools/install-kubectl/ # for now but in a future version of alpine (in the testing version at the time of writing) # we should be able to install using apk add. -ENV KUBECTL_VERSION="v1.28.9" +ENV KUBECTL_VERSION="v1.32.1" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl" && \ case ${TARGETPLATFORM} in \ - # checksums are available at https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl.sha256 - "linux/amd64") KUBECTL_SHA256="b4693d0b22f509250694b10c7727c42b427d570af04f2065fe23a55d6c0051f1" ;; \ - "linux/arm64") KUBECTL_SHA256="e0341d3973213f8099e7fcbbf6d1d506967bc2b7a4faac3fb3b4340f226e9b2f" ;; \ + # checksums are available at https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl.sha256 + "linux/amd64") KUBECTL_SHA256="e16c80f1a9f94db31063477eb9e61a2e24c1a4eee09ba776b029048f5369db0c" ;; \ + "linux/arm64") KUBECTL_SHA256="98206fd83a4fd17f013f8c61c33d0ae8ec3a7c53ec59ef3d6a0a9400862dc5b2" ;; \ esac && \ echo "${KUBECTL_SHA256} kubectl" | sha256sum -c && \ chmod +x kubectl && \ @@ -73,16 +73,16 @@ ARG KUSTOMIZE_FILENAME="kustomize_${KUSTOMIZE_VERSION}_${TARGETOS}_${TARGETARCH} RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/${KUSTOMIZE_FILENAME}" && \ case ${TARGETPLATFORM} in \ - # Checksums are available at https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/checksums.txt - "linux/amd64") KUSTOMIZE_SHA256="3669470b454d865c8184d6bce78df05e977c9aea31c30df3c669317d43bcc7a7" ;; \ - "linux/arm64") KUSTOMIZE_SHA256="1b515578b0af12c15d9856720066ce2fe66756d63785b2cbccaf2885beb2381c" ;; \ + # Checksums are available at https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/checksums.txt + "linux/amd64") KUSTOMIZE_SHA256="3669470b454d865c8184d6bce78df05e977c9aea31c30df3c669317d43bcc7a7" ;; \ + "linux/arm64") KUSTOMIZE_SHA256="1b515578b0af12c15d9856720066ce2fe66756d63785b2cbccaf2885beb2381c" ;; \ esac && \ echo "${KUSTOMIZE_SHA256} ${KUSTOMIZE_FILENAME}" | sha256sum -c && \ tar xvf "${KUSTOMIZE_FILENAME}" -C /usr/local/bin && \ rm "${KUSTOMIZE_FILENAME}" && \ [ "$(kustomize version)" = "${KUSTOMIZE_VERSION}" ] -ENV SOPS_VERSION="v3.9.0" +ENV SOPS_VERSION="v3.9.3" ARG SOPS_FILENAME="sops-${SOPS_VERSION}.${TARGETOS}.${TARGETARCH}" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/getsops/sops/releases/download/${SOPS_VERSION}/${SOPS_FILENAME}" && \ @@ -90,7 +90,7 @@ RUN set -x && \ mv "${SOPS_FILENAME}" /usr/local/bin/sops && \ sops --version --disable-version-check | grep -E "^sops ${SOPS_VERSION#v}" -ENV AGE_VERSION="v1.1.1" +ENV AGE_VERSION="v1.2.0" ARG AGE_FILENAME="age-${AGE_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/FiloSottile/age/releases/download/${AGE_VERSION}/${AGE_FILENAME}" && \ @@ -99,10 +99,10 @@ RUN set -x && \ [ "$(age --version)" = "${AGE_VERSION}" ] && \ [ "$(age-keygen --version)" = "${AGE_VERSION}" ] -RUN helm plugin install https://github.com/databus23/helm-diff --version v3.9.11 && \ - helm plugin install https://github.com/jkroepke/helm-secrets --version v4.6.0 && \ - helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.16.2 && \ - helm plugin install https://github.com/aslafy-z/helm-git.git --version v0.16.0 && \ +RUN helm plugin install https://github.com/databus23/helm-diff --version v3.11.0 && \ + helm plugin install https://github.com/jkroepke/helm-secrets --version v4.6.3 && \ + helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.16.3 && \ + helm plugin install https://github.com/aslafy-z/helm-git.git --version v1.3.0 && \ rm -rf ${HELM_CACHE_HOME}/plugins # Allow users other than root to use helm plugins located in root home diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu index 55de9269..2088a681 100644 --- a/Dockerfile.ubuntu +++ b/Dockerfile.ubuntu @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.22-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder RUN apk add --no-cache make git WORKDIR /workspace/helmfile @@ -12,15 +12,15 @@ RUN make static-${TARGETOS}-${TARGETARCH} # ----------------------------------------------------------------------------- -FROM ubuntu:24.04 +FROM ubuntu:24.10 LABEL org.opencontainers.image.source=https://github.com/helmfile/helmfile RUN apt update -qq && \ apt install --no-install-recommends -y \ - ca-certificates \ - gnupg \ - git bash curl jq wget openssh-client && \ + ca-certificates \ + gnupg \ + git bash curl jq wget openssh-client && \ rm -rf /var/lib/apt/lists/* ARG TARGETARCH TARGETOS TARGETPLATFORM @@ -35,7 +35,7 @@ ENV HELM_CONFIG_HOME="${HELM_CONFIG_HOME}" ARG HELM_DATA_HOME="${HOME}/.local/share/helm" ENV HELM_DATA_HOME="${HELM_DATA_HOME}" -ARG HELM_VERSION="v3.16.1" +ARG HELM_VERSION="v3.17.3" ENV HELM_VERSION="${HELM_VERSION}" ARG HELM_LOCATION="https://get.helm.sh" ARG HELM_FILENAME="helm-${HELM_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz" @@ -43,8 +43,8 @@ RUN set -x && \ curl --retry 5 --retry-connrefused -LO "${HELM_LOCATION}/${HELM_FILENAME}" && \ echo Verifying ${HELM_FILENAME}... && \ case ${TARGETPLATFORM} in \ - "linux/amd64") HELM_SHA256="e57e826410269d72be3113333dbfaac0d8dfdd1b0cc4e9cb08bdf97722731ca9" ;; \ - "linux/arm64") HELM_SHA256="780b5b86f0db5546769b3e9f0204713bbdd2f6696dfdaac122fbe7f2f31541d2" ;; \ + "linux/amd64") HELM_SHA256="ee88b3c851ae6466a3de507f7be73fe94d54cbf2987cbaa3d1a3832ea331f2cd" ;; \ + "linux/arm64") HELM_SHA256="7944e3defd386c76fd92d9e6fec5c2d65a323f6fadc19bfb5e704e3eee10348e" ;; \ esac && \ echo "${HELM_SHA256} ${HELM_FILENAME}" | sha256sum -c && \ echo Extracting ${HELM_FILENAME}... && \ @@ -55,13 +55,13 @@ RUN set -x && \ # using the install documentation found at https://kubernetes.io/docs/tasks/tools/install-kubectl/ # for now but in a future version of alpine (in the testing version at the time of writing) # we should be able to install using apk add. -ENV KUBECTL_VERSION="v1.28.9" +ENV KUBECTL_VERSION="v1.32.1" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl" && \ case ${TARGETPLATFORM} in \ - # checksums are available at https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl.sha256 - "linux/amd64") KUBECTL_SHA256="b4693d0b22f509250694b10c7727c42b427d570af04f2065fe23a55d6c0051f1" ;; \ - "linux/arm64") KUBECTL_SHA256="e0341d3973213f8099e7fcbbf6d1d506967bc2b7a4faac3fb3b4340f226e9b2f" ;; \ + # checksums are available at https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl.sha256 + "linux/amd64") KUBECTL_SHA256="e16c80f1a9f94db31063477eb9e61a2e24c1a4eee09ba776b029048f5369db0c" ;; \ + "linux/arm64") KUBECTL_SHA256="98206fd83a4fd17f013f8c61c33d0ae8ec3a7c53ec59ef3d6a0a9400862dc5b2" ;; \ esac && \ echo "${KUBECTL_SHA256} kubectl" | sha256sum -c && \ chmod +x kubectl && \ @@ -73,16 +73,16 @@ ARG KUSTOMIZE_FILENAME="kustomize_${KUSTOMIZE_VERSION}_${TARGETOS}_${TARGETARCH} RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/${KUSTOMIZE_FILENAME}" && \ case ${TARGETPLATFORM} in \ - # Checksums are available at https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/checksums.txt - "linux/amd64") KUSTOMIZE_SHA256="3669470b454d865c8184d6bce78df05e977c9aea31c30df3c669317d43bcc7a7" ;; \ - "linux/arm64") KUSTOMIZE_SHA256="1b515578b0af12c15d9856720066ce2fe66756d63785b2cbccaf2885beb2381c" ;; \ + # Checksums are available at https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/${KUSTOMIZE_VERSION}/checksums.txt + "linux/amd64") KUSTOMIZE_SHA256="3669470b454d865c8184d6bce78df05e977c9aea31c30df3c669317d43bcc7a7" ;; \ + "linux/arm64") KUSTOMIZE_SHA256="1b515578b0af12c15d9856720066ce2fe66756d63785b2cbccaf2885beb2381c" ;; \ esac && \ echo "${KUSTOMIZE_SHA256} ${KUSTOMIZE_FILENAME}" | sha256sum -c && \ tar xvf "${KUSTOMIZE_FILENAME}" -C /usr/local/bin && \ rm "${KUSTOMIZE_FILENAME}" && \ [ "$(kustomize version)" = "${KUSTOMIZE_VERSION}" ] -ENV SOPS_VERSION="v3.9.0" +ENV SOPS_VERSION="v3.9.3" ARG SOPS_FILENAME="sops-${SOPS_VERSION}.${TARGETOS}.${TARGETARCH}" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/getsops/sops/releases/download/${SOPS_VERSION}/${SOPS_FILENAME}" && \ @@ -90,7 +90,7 @@ RUN set -x && \ mv "${SOPS_FILENAME}" /usr/local/bin/sops && \ sops --version --disable-version-check | grep -E "^sops ${SOPS_VERSION#v}" -ENV AGE_VERSION="v1.1.1" +ENV AGE_VERSION="v1.2.0" ARG AGE_FILENAME="age-${AGE_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz" RUN set -x && \ curl --retry 5 --retry-connrefused -LO "https://github.com/FiloSottile/age/releases/download/${AGE_VERSION}/${AGE_FILENAME}" && \ @@ -99,10 +99,10 @@ RUN set -x && \ [ "$(age --version)" = "${AGE_VERSION}" ] && \ [ "$(age-keygen --version)" = "${AGE_VERSION}" ] -RUN helm plugin install https://github.com/databus23/helm-diff --version v3.9.11 && \ - helm plugin install https://github.com/jkroepke/helm-secrets --version v4.6.0 && \ - helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.16.2 && \ - helm plugin install https://github.com/aslafy-z/helm-git.git --version v0.16.0 && \ +RUN helm plugin install https://github.com/databus23/helm-diff --version v3.11.0 && \ + helm plugin install https://github.com/jkroepke/helm-secrets --version v4.6.3 && \ + helm plugin install https://github.com/hypnoglow/helm-s3.git --version v0.16.3 && \ + helm plugin install https://github.com/aslafy-z/helm-git.git --version v1.3.0 && \ rm -rf ${HELM_CACHE_HOME}/plugins # Allow users other than root to use helm plugins located in root home diff --git a/Makefile b/Makefile index 0500bd33..5e009ca0 100644 --- a/Makefile +++ b/Makefile @@ -25,10 +25,6 @@ build: go build -ldflags="$(GO_BUILD_VERSION_LDFLAGS)" ${TARGETS} .PHONY: build -build-v1: - go build -ldflags="$(GO_BUILD_VERSION_LDFLAGS) -X github.com/helmfile/helmfile/pkg/runtime.v1Mode=true" ${TARGETS} -.PHONY: build-v1 - generate: go generate ${PKGS} .PHONY: generate diff --git a/README-zh_CN.md b/README-zh_CN.md index 812d222b..b31898ad 100644 --- a/README-zh_CN.md +++ b/README-zh_CN.md @@ -12,10 +12,11 @@ # Helmfile [![Tests](https://github.com/helmfile/helmfile/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/helmfile/helmfile/actions/workflows/ci.yaml?query=branch%3Amain) -[![Container Image Repository on GHCR](https://ghcr-badge.deta.dev/helmfile/helmfile/latest_tag?trim=major&label=latest "Docker Repository on ghcr")](https://github.com/helmfile/helmfile/pkgs/container/helmfile) +[![Container Image Repository on GHCR](https://ghcr-badge.egpl.dev/helmfile/helmfile/latest_tag?trim=major&label=latest "Docker Repository on ghcr")](https://github.com/helmfile/helmfile/pkgs/container/helmfile) [![Go Report Card](https://goreportcard.com/badge/github.com/helmfile/helmfile)](https://goreportcard.com/report/github.com/helmfile/helmfile) [![Slack Community #helmfile](https://slack.sweetops.com/badge.svg)](https://slack.sweetops.com) [![Documentation](https://readthedocs.org/projects/helmfile/badge/?version=latest&style=flat)](https://helmfile.readthedocs.io/en/latest/) +[![Gurubase](https://img.shields.io/badge/Gurubase-Ask%20Helmfile%20Guru-006BFF)](https://gurubase.io/g/helmfile) 声明式Helm Chart管理工具
diff --git a/README.md b/README.md index ef030a97..8ae91de8 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,11 @@ # Helmfile [![Tests](https://github.com/helmfile/helmfile/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/helmfile/helmfile/actions/workflows/ci.yaml?query=branch%3Amain) -[![Container Image Repository on GHCR](https://ghcr-badge.deta.dev/helmfile/helmfile/latest_tag?trim=major&label=latest "Docker Repository on ghcr")](https://github.com/helmfile/helmfile/pkgs/container/helmfile) +[![Container Image Repository on GHCR](https://ghcr-badge.egpl.dev/helmfile/helmfile/latest_tag?trim=major&label=latest "Docker Repository on ghcr")](https://github.com/helmfile/helmfile/pkgs/container/helmfile) [![Go Report Card](https://goreportcard.com/badge/github.com/helmfile/helmfile)](https://goreportcard.com/report/github.com/helmfile/helmfile) [![Slack Community #helmfile](https://slack.sweetops.com/badge.svg)](https://slack.sweetops.com) [![Documentation](https://readthedocs.org/projects/helmfile/badge/?version=latest&style=flat)](https://helmfile.readthedocs.io/en/latest/) +[![Gurubase](https://img.shields.io/badge/Gurubase-Ask%20Helmfile%20Guru-006BFF)](https://gurubase.io/g/helmfile) Deploy Kubernetes Helm Charts
@@ -104,6 +105,10 @@ Iterate on the `helmfile.yaml` by referencing: * [CLI reference](https://helmfile.readthedocs.io/en/latest/#cli-reference) * [Helmfile Best Practices Guide](https://helmfile.readthedocs.io/en/latest/writing-helmfile/) +## More complex examples + +See: [multi-env-helmfile](https://github.com/helmfile/multi-env-helmfile) + ## Docs Please read [complete documentation](https://helmfile.readthedocs.io/) diff --git a/cmd/apply.go b/cmd/apply.go index d2add4b3..6b5a23f4 100644 --- a/cmd/apply.go +++ b/cmd/apply.go @@ -5,7 +5,6 @@ import ( "github.com/helmfile/helmfile/pkg/app" "github.com/helmfile/helmfile/pkg/config" - "github.com/helmfile/helmfile/pkg/runtime" ) // NewApplyCmd returns apply subcmd @@ -44,12 +43,6 @@ func NewApplyCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.StringVar(&applyOptions.DiffArgs, "diff-args", "", `pass args to helm helm-diff`) f.StringVar(&applyOptions.SyncArgs, "sync-args", "", `pass args to helm upgrade`) f.StringVar(&globalCfg.GlobalOptions.Args, "args", "", "pass args to helm exec") - if !runtime.V1Mode { - // TODO: Remove this function once Helmfile v0.x - f.BoolVar(&applyOptions.RetainValuesFiles, "retain-values-files", false, "DEPRECATED: Use skip-cleanup instead") - _ = f.MarkDeprecated("retain-values-files", "Use skip-cleanup instead") - } - f.BoolVar(&applyOptions.SkipCleanup, "skip-cleanup", false, "Stop cleaning up temporary values generated by helmfile and helm-secrets. Useful for debugging. Don't use in production for security") f.BoolVar(&applyOptions.SkipCRDs, "skip-crds", false, "if set, no CRDs will be installed on sync. By default, CRDs are installed if not already present") f.BoolVar(&applyOptions.SkipNeeds, "skip-needs", true, `do not automatically include releases from the target release's "needs" when --selector/-l flag is provided. Does nothing when --selector/-l flag is not provided. Defaults to true when --include-needs or --include-transitive-needs is not provided`) @@ -61,6 +54,9 @@ func NewApplyCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.BoolVar(&applyOptions.SuppressSecrets, "suppress-secrets", false, "suppress secrets in the diff output. highly recommended to specify on CI/CD use-cases") f.BoolVar(&applyOptions.ShowSecrets, "show-secrets", false, "do not redact secret values in the diff output. should be used for debug purpose only") f.BoolVar(&applyOptions.NoHooks, "no-hooks", false, "do not diff changes made by hooks.") + f.BoolVar(&applyOptions.HideNotes, "hide-notes", false, "add --hide-notes flag to helm") + f.BoolVar(&applyOptions.TakeOwnership, "take-ownership", false, "add --take-ownership flag to helm") + f.BoolVar(&applyOptions.SyncReleaseLabels, "sync-release-labels", false, "sync release labels to the target release") f.BoolVar(&applyOptions.SuppressDiff, "suppress-diff", false, "suppress diff in the output. Usable in new installs") f.BoolVar(&applyOptions.Wait, "wait", false, `Override helmDefaults.wait setting "helm upgrade --install --wait"`) f.BoolVar(&applyOptions.WaitForJobs, "wait-for-jobs", false, `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`) @@ -68,6 +64,7 @@ func NewApplyCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.BoolVar(&applyOptions.ResetValues, "reset-values", false, `Override helmDefaults.reuseValues "helm upgrade --install --reset-values"`) f.StringVar(&applyOptions.PostRenderer, "post-renderer", "", `pass --post-renderer to "helm template" or "helm upgrade --install"`) f.StringArrayVar(&applyOptions.PostRendererArgs, "post-renderer-args", nil, `pass --post-renderer-args to "helm template" or "helm upgrade --install"`) + f.BoolVar(&applyOptions.SkipSchemaValidation, "skip-schema-validation", false, `pass --skip-schema-validation to "helm template" or "helm upgrade --install"`) f.StringVar(&applyOptions.Cascade, "cascade", "", "pass cascade to helm exec, default: background") f.StringArrayVar(&applyOptions.SuppressOutputLineRegex, "suppress-output-line-regex", nil, "a list of regex patterns to suppress output lines from the diff output") diff --git a/cmd/charts.go b/cmd/charts.go deleted file mode 100644 index cae9d168..00000000 --- a/cmd/charts.go +++ /dev/null @@ -1,41 +0,0 @@ -// TODO: Remove this function once Helmfile v0.x -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/helmfile/helmfile/pkg/app" - "github.com/helmfile/helmfile/pkg/config" -) - -// NewChartsCmd returns charts subcmd -func NewChartsCmd(globalCfg *config.GlobalImpl) *cobra.Command { - chartsOptions := config.NewChartsOptions() - - cmd := &cobra.Command{ - Use: "charts", - Short: "DEPRECATED: sync releases from state file (helm upgrade --install)", - RunE: func(cmd *cobra.Command, args []string) error { - chartsImpl := config.NewChartsImpl(globalCfg, chartsOptions) - err := config.NewCLIConfigImpl(chartsImpl.GlobalImpl) - if err != nil { - return err - } - - if err := chartsImpl.ValidateConfig(); err != nil { - return err - } - - a := app.New(chartsImpl) - return toCLIError(chartsImpl.GlobalImpl, a.DeprecatedSyncCharts(chartsImpl)) - }, - } - - f := cmd.Flags() - f.StringVar(&globalCfg.GlobalOptions.Args, "args", "", "pass args to helm exec") - f.StringArrayVar(&chartsOptions.Set, "set", nil, "additional values to be merged into the helm command --set flag") - f.StringArrayVar(&chartsOptions.Values, "values", nil, "additional value files to be merged into the helm command --values flag") - f.IntVar(&chartsOptions.Concurrency, "concurrency", 0, "maximum number of concurrent helm processes to run, 0 is unlimited") - - return cmd -} diff --git a/cmd/delete.go b/cmd/delete.go deleted file mode 100644 index 1c89c147..00000000 --- a/cmd/delete.go +++ /dev/null @@ -1,44 +0,0 @@ -// TODO: Remove this function once Helmfile v0.x -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/helmfile/helmfile/pkg/app" - "github.com/helmfile/helmfile/pkg/config" -) - -// NewDeleteCmd returns delete subcmd -func NewDeleteCmd(globalCfg *config.GlobalImpl) *cobra.Command { - deleteOptions := config.NewDeleteOptions() - - cmd := &cobra.Command{ - Use: "delete", - Short: "DEPRECATED: delete releases from state file (helm delete)", - RunE: func(cmd *cobra.Command, args []string) error { - deleteImpl := config.NewDeleteImpl(globalCfg, deleteOptions) - err := config.NewCLIConfigImpl(deleteImpl.GlobalImpl) - if err != nil { - return err - } - - if err := deleteImpl.ValidateConfig(); err != nil { - return err - } - - a := app.New(deleteImpl) - return toCLIError(deleteImpl.GlobalImpl, a.Delete(deleteImpl)) - }, - } - - f := cmd.Flags() - f.StringVar(&globalCfg.GlobalOptions.Args, "args", "", "pass args to helm exec") - f.StringVar(&deleteOptions.Cascade, "cascade", "", "pass cascade to helm exec, default: background") - f.IntVar(&deleteOptions.Concurrency, "concurrency", 0, "maximum number of concurrent helm processes to run, 0 is unlimited") - f.BoolVar(&deleteOptions.Purge, "purge", false, "purge releases i.e. free release names and histories") - f.BoolVar(&deleteOptions.SkipCharts, "skip-charts", false, "don't prepare charts when deleting releases") - f.BoolVar(&deleteOptions.DeleteWait, "deleteWait", false, `override helmDefaults.wait setting "helm uninstall --wait"`) - f.IntVar(&deleteOptions.DeleteTimeout, "deleteTimeout", 300, `time in seconds to wait for helm uninstall, default: 300`) - - return cmd -} diff --git a/cmd/root.go b/cmd/root.go index dd201728..ed629d12 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -109,14 +109,6 @@ func NewRootCmd(globalConfig *config.GlobalOptions) (*cobra.Command, error) { ), ) - // TODO: Remove this function once Helmfile v0.x - if !runtime.V1Mode { - cmd.AddCommand( - NewChartsCmd(globalImpl), - NewDeleteCmd(globalImpl), - ) - } - return cmd, nil } @@ -129,6 +121,7 @@ func setGlobalOptionsForRootCmd(fs *pflag.FlagSet, globalOptions *config.GlobalO fs.StringArrayVar(&globalOptions.StateValuesSetString, "state-values-set-string", nil, "set state STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2). Used to override .Values within the helmfile template (not values template).") fs.StringArrayVar(&globalOptions.StateValuesFile, "state-values-file", nil, "specify state values in a YAML file. Used to override .Values within the helmfile template (not values template).") fs.BoolVar(&globalOptions.SkipDeps, "skip-deps", false, `skip running "helm repo update" and "helm dependency build"`) + fs.BoolVar(&globalOptions.SkipRefresh, "skip-refresh", false, `skip running "helm repo update"`) fs.BoolVar(&globalOptions.StripArgsValuesOnExitError, "strip-args-values-on-exit-error", true, `Strip the potential secret values of the helm command args contained in a helmfile error message`) fs.BoolVar(&globalOptions.DisableForceUpdate, "disable-force-update", false, `do not force helm repos to update when executing "helm repo add"`) fs.BoolVarP(&globalOptions.Quiet, "quiet", "q", false, "Silence output. Equivalent to log-level warn") diff --git a/cmd/sync.go b/cmd/sync.go index a779da3a..1d8ed45f 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -41,12 +41,16 @@ func NewSyncCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.BoolVar(&syncOptions.SkipCRDs, "skip-crds", false, "if set, no CRDs will be installed on sync. By default, CRDs are installed if not already present") f.BoolVar(&syncOptions.IncludeNeeds, "include-needs", false, `automatically include releases from the target release's "needs" when --selector/-l flag is provided. Does nothing when --selector/-l flag is not provided`) f.BoolVar(&syncOptions.IncludeTransitiveNeeds, "include-transitive-needs", false, `like --include-needs, but also includes transitive needs (needs of needs). Does nothing when --selector/-l flag is not provided. Overrides exclusions of other selectors and conditions.`) + f.BoolVar(&syncOptions.HideNotes, "hide-notes", false, "add --hide-notes flag to helm") + f.BoolVar(&syncOptions.TakeOwnership, "take-ownership", false, `add --take-ownership flag to helm`) + f.BoolVar(&syncOptions.SyncReleaseLabels, "sync-release-labels", false, "sync release labels to the target release") f.BoolVar(&syncOptions.Wait, "wait", false, `Override helmDefaults.wait setting "helm upgrade --install --wait"`) f.BoolVar(&syncOptions.WaitForJobs, "wait-for-jobs", false, `Override helmDefaults.waitForJobs setting "helm upgrade --install --wait-for-jobs"`) f.BoolVar(&syncOptions.ReuseValues, "reuse-values", false, `Override helmDefaults.reuseValues "helm upgrade --install --reuse-values"`) f.BoolVar(&syncOptions.ResetValues, "reset-values", false, `Override helmDefaults.reuseValues "helm upgrade --install --reset-values"`) f.StringVar(&syncOptions.PostRenderer, "post-renderer", "", `pass --post-renderer to "helm template" or "helm upgrade --install"`) f.StringArrayVar(&syncOptions.PostRendererArgs, "post-renderer-args", nil, `pass --post-renderer-args to "helm template" or "helm upgrade --install"`) + f.BoolVar(&syncOptions.SkipSchemaValidation, "skip-schema-validation", false, `pass --skip-schema-validation to "helm template" or "helm upgrade --install"`) f.StringVar(&syncOptions.Cascade, "cascade", "", "pass cascade to helm exec, default: background") return cmd diff --git a/cmd/template.go b/cmd/template.go index dfd27c38..6cb81fea 100644 --- a/cmd/template.go +++ b/cmd/template.go @@ -44,8 +44,10 @@ func NewTemplateCmd(globalCfg *config.GlobalImpl) *cobra.Command { f.BoolVar(&templateOptions.IncludeNeeds, "include-needs", false, `automatically include releases from the target release's "needs" when --selector/-l flag is provided. Does nothing when --selector/-l flag is not provided`) f.BoolVar(&templateOptions.IncludeTransitiveNeeds, "include-transitive-needs", false, `like --include-needs, but also includes transitive needs (needs of needs). Does nothing when --selector/-l flag is not provided. Overrides exclusions of other selectors and conditions.`) f.BoolVar(&templateOptions.SkipCleanup, "skip-cleanup", false, "Stop cleaning up temporary values generated by helmfile and helm-secrets. Useful for debugging. Don't use in production for security") + f.BoolVar(&templateOptions.NoHooks, "no-hooks", false, "do not template files made by hooks.") f.StringVar(&templateOptions.PostRenderer, "post-renderer", "", `pass --post-renderer to "helm template" or "helm upgrade --install"`) f.StringArrayVar(&templateOptions.PostRendererArgs, "post-renderer-args", nil, `pass --post-renderer-args to "helm template" or "helm upgrade --install"`) + f.BoolVar(&templateOptions.SkipSchemaValidation, "skip-schema-validation", false, `pass skip-schema-validation to "helm template" or "helm upgrade --install"`) f.StringVar(&templateOptions.KubeVersion, "kube-version", "", `pass --kube-version to "helm template". Overrides kubeVersion in helmfile.yaml`) f.StringArrayVar(&templateOptions.ShowOnly, "show-only", nil, `pass --show-only to "helm template"`) diff --git a/docs/index.md b/docs/index.md index 97745e42..211dbf8e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,7 +12,7 @@ # Helmfile [![Tests](https://github.com/helmfile/helmfile/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/helmfile/helmfile/actions/workflows/ci.yaml?query=branch%3Amain) -[![Container Image Repository on GHCR](https://ghcr-badge.deta.dev/helmfile/helmfile/latest_tag?trim=major&label=latest "Docker Repository on ghcr")](https://github.com/helmfile/helmfile/pkgs/container/helmfile) +[![Container Image Repository on GHCR](https://ghcr-badge.egpl.dev/helmfile/helmfile/latest_tag?trim=major&label=latest "Docker Repository on ghcr")](https://github.com/helmfile/helmfile/pkgs/container/helmfile) [![Go Report Card](https://goreportcard.com/badge/github.com/helmfile/helmfile)](https://goreportcard.com/report/github.com/helmfile/helmfile) [![Slack Community #helmfile](https://slack.sweetops.com/badge.svg)](https://slack.sweetops.com) [![Documentation](https://readthedocs.org/projects/helmfile/badge/?version=latest&style=flat)](https://helmfile.readthedocs.io/en/latest/) @@ -193,8 +193,12 @@ helmDefaults: # verify the chart before upgrading (only works with packaged charts not directories) (default false) verify: true keyring: path/to/keyring.gpg + # --skip-schema-validation flag to helm 'install', 'upgrade' and 'lint', starts with helm 3.16.0 (default false) + skipSchemaValidation: false # wait for k8s resources via --wait. (default false) wait: true + # if set and --wait enabled, will retry any failed check on resource state subject to the specified number of retries (default 0) + waitRetries: 3 # if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout (default false, Implemented in Helm3.5) waitForJobs: true # time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300) @@ -233,9 +237,12 @@ helmDefaults: deleteWait: false # Timeout is the time in seconds to wait for helmfile destroy/delete (default 300) deleteTimeout: 300 - # suppressOutputLineRegex is a list of regex patterns to suppress output lines from helm diff (default []), available in helmfile v0.162.0 + # suppressOutputLineRegex is a list of regex patterns to suppress output lines from helm diff (default []), available in helmfile v0.162.0 suppressOutputLineRegex: - "version" + # syncReleaseLabels is a list of labels to be added to the release when syncing. + syncReleaseLabels: false + # these labels will be applied to all releases in a Helmfile. Useful in templating if you have a helmfile per environment or customer and don't want to copy the same label to each release commonLabels: @@ -282,6 +289,16 @@ releases: domain: {{ requiredEnv "PLATFORM_ID" }}.my-domain.com scheme: {{ env "SCHEME" | default "https" }} # Use `values` whenever possible! + # `setString` translates to helm's `--set-string key=val` + setString: + # set a single array value in an array, translates to --set-string bar[0]={1,2} + - name: bar[0] + values: + - 1 + - 2 + # set a templated value + - name: namespace + value: {{ .Namespace }} # `set` translates to helm's `--set key=val`, that is known to suffer from type issues like https://github.com/roboll/helmfile/issues/608 set: # single value loaded from a local file, translates to --set-file foo.config=path/to/file @@ -298,14 +315,18 @@ releases: # will attempt to decrypt it using helm-secrets plugin secrets: - vault_secret.yaml - # Override helmDefaults options for verify, wait, waitForJobs, timeout, recreatePods and force. + # Override helmDefaults options for verify, wait, waitForJobs, timeout, recreatePods, force and reuseValues. verify: true keyring: path/to/keyring.gpg + # --skip-schema-validation flag to helm 'install', 'upgrade' and 'lint', starts with helm 3.16.0 (default false) + skipSchemaValidation: false wait: true + waitRetries: 3 waitForJobs: true timeout: 60 recreatePods: true force: false + reuseValues: false # set `false` to uninstall this release on sync. (default true) installed: true # restores previous state in case of failed release (default false) @@ -349,9 +370,11 @@ releases: plainHttp: false # suppressDiff skip the helm diff output. Useful for charts which produces large not helpful diff, default: false suppressDiff: false - # suppressOutputLineRegex is a list of regex patterns to suppress output lines from helm diff (default []), available in helmfile v0.162.0 + # suppressOutputLineRegex is a list of regex patterns to suppress output lines from helm diff (default []), available in helmfile v0.162.0 suppressOutputLineRegex: - "version" + # syncReleaseLabels is a list of labels to be added to the release when syncing. + syncReleaseLabels: false # Local chart example @@ -542,15 +565,15 @@ Helmfile uses some OS environment variables to override default behaviour: * `HELMFILE_DISABLE_INSECURE_FEATURES` - disable insecure features, expecting `true` lower case * `HELMFILE_DISABLE_RUNNER_UNIQUE_ID` - disable unique logging ID, expecting any non-empty value * `HELMFILE_SKIP_INSECURE_TEMPLATE_FUNCTIONS` - disable insecure template functions, expecting `true` lower case -* `HELMFILE_USE_HELM_STATUS_TO_CHECK_RELEASE_EXISTENCE` - expecting non-empty value to use `helm status` to check release existence, instead of `helm list` which is the default behaviour +* `HELMFILE_USE_HELM_STATUS_TO_CHECK_RELEASE_EXISTENCE` - expecting non-empty value to use `helm status` to check release existence, instead of `helm list` which is the default behaviour * `HELMFILE_EXPERIMENTAL` - enable experimental features, expecting `true` lower case * `HELMFILE_ENVIRONMENT` - specify [Helmfile environment](https://helmfile.readthedocs.io/en/latest/#environment), it has lower priority than CLI argument `--environment` * `HELMFILE_TEMPDIR` - specify directory to store temporary files * `HELMFILE_UPGRADE_NOTICE_DISABLED` - expecting any non-empty value to skip the check for the latest version of Helmfile in [helmfile version](https://helmfile.readthedocs.io/en/latest/#version) -* `HELMFILE_V1MODE` - Helmfile v0.x behaves like v1.x with `true`, Helmfile v1.x behaves like v0.x with `false` as value * `HELMFILE_GOCCY_GOYAML` - use *goccy/go-yaml* instead of *gopkg.in/yaml.v2*. It's `false` by default in Helmfile v0.x and `true` by default for Helmfile v1.x. * `HELMFILE_CACHE_HOME` - specify directory to store cached files for remote operations -* `HELMFILE_FILE_PATH` - specify the path to the helmfile.yaml file +* `HELMFILE_FILE_PATH` - specify the path to the helmfile.yaml file +* `HELMFILE_INTERACTIVE` - enable interactive mode, expecting `true` lower case. The same as `--interactive` CLI flag ## CLI Reference @@ -674,7 +697,7 @@ The `helmfile destroy` sub-command uninstalls and purges all the releases define `helmfile --interactive destroy` instructs Helmfile to request your confirmation before actually deleting releases. `destroy` basically runs `helm uninstall --purge` on all the targeted releases. If you don't want purging, use `helmfile delete` instead. -If `--skip-charts` flag is not set, destory would prepare all releases, by fetching charts and templating them. +If `--skip-charts` flag is not set, destroy would prepare all releases, by fetching charts and templating them. ### delete (DEPRECATED) @@ -683,7 +706,7 @@ The `helmfile delete` sub-command deletes all the releases defined in the manife `helmfile --interactive delete` instructs Helmfile to request your confirmation before actually deleting releases. Note that `delete` doesn't purge releases. So `helmfile delete && helmfile sync` results in sync failed due to that releases names are not deleted but preserved for future references. If you really want to remove releases for reuse, add `--purge` flag to run it like `helmfile delete --purge`. -If `--skip-charts` flag is not set, destory would prepare all releases, by fetching charts and templating them. +If `--skip-charts` flag is not set, destroy would prepare all releases, by fetching charts and templating them. ### secrets @@ -747,7 +770,7 @@ For additional context, take a look at [paths examples](paths.md). A selector can be used to only target a subset of releases when running Helmfile. This is useful for large helmfiles with releases that are logically grouped together. -Labels are simple key value pairs that are an optional field of the release spec. When selecting by label, the search can be inverted. `tier!=backend` would match all releases that do NOT have the `tier: backend` label. `tier=fronted` would only match releases with the `tier: frontend` label. +Labels are simple key value pairs that are an optional field of the release spec. When selecting by label, the search can be inverted. `tier!=backend` would match all releases that do NOT have the `tier: backend` label. `tier=frontend` would only match releases with the `tier: frontend` label. Multiple labels can be specified using `,` as a separator. A release must match all selectors in order to be selected for the final helm command. @@ -920,7 +943,7 @@ releases: ``` ### Environment Values -Helmfile supports 3 values languages : +Helmfile supports 3 values languages : - Straight yaml - Go templates to generate straight yaml - HCL @@ -1008,7 +1031,7 @@ HCL values supports interpolations and sharing values across files * Helmfile hcl `values` are referenced using the `hv` accessor. * Helmfile hcl `locals` are referenced using the `local` accessor. * Duplicated variables across .hcl `values` blocks are forbidden (An error will pop up specifying where are the duplicates) -* All cty [standard library functions](`https://pkg.go.dev/github.com/zclconf/go-cty@v1.14.3/cty/function/stdlib`) are available and custom functions could be created in the future +* All cty [standard library functions](`https://pkg.go.dev/github.com/zclconf/go-cty@v1.14.3/cty/function/stdlib`) are available and custom functions could be created in the future Consider the following example : @@ -1346,7 +1369,7 @@ helmfiles: - name=prometheus - tier=frontend - path: apps/b-helmfile.yaml # no selector, so all releases are used -selectors: [] + selectors: [] - path: apps/c-helmfile.yaml # parent selector to be used or cli selector for the initial helmfile selectorsInherited: true ``` @@ -1657,6 +1680,9 @@ Use it when you're running `helmfile` manually on your local machine or a kind o For your local use-case, aliasing it like `alias hi='helmfile --interactive'` would be convenient. +Another way to use it is to set the environment variable `HELMFILE_INTERACTIVE=true` to enable the interactive mode by default. +Anything other than `true` will disable the interactive mode. The precedence has the `--interactive` flag. + ## Running Helmfile without an Internet connection Once you download all required charts into your machine, you can run `helmfile sync --skip-deps` to deploy your apps. diff --git a/docs/proposals/towards-1.0.md b/docs/proposals/towards-1.0.md index 31009f88..2c6e15de 100644 --- a/docs/proposals/towards-1.0.md +++ b/docs/proposals/towards-1.0.md @@ -28,6 +28,7 @@ We also provide the alternative way in the latest v0.x release before v1.0. That 4. [Remove `HELMFILE_SKIP_INSECURE_TEMPLATE_FUNCTIONS` in favor of `HELMFILE_DISABLE_INSECURE_FEATURES`](#remove-helmfile_skip_insecure_template_functions-in-favor-of-helmfile_disable_insecure_features) 5. [The long deprecated `charts.yaml` has been finally removed](#the-long-deprecated-chartsyaml-has-been-finally-removed) 6. [List experimental features](#list-experimental-features) +7. [Remove charts and delete sub-commands](#remove-charts-and-delete-subcommands) ### Forbid the use of `environments` and `releases` within a single helmfile.yaml.gotmpl part @@ -110,6 +111,9 @@ Why now? In Helmfile v0.x, all features considered experimental as we follow semver. However, we "ended up" preserving backward-compatibility within v0 and between v0 and v1 "by chance". This doesn't mean anything introduced in v0 is stable. For example, we might have some features implemented in a very later stage of v0 that are not stable yet. We should mark them as experimental, or we can't fix them in a backward-incompatible way in v1.x. That's why we need to list experimental features now. +### remove-charts-and-delete-subcommands +Now we remove `helmfile charts` and `helmfile delete` subcommands. you can use `helmfile destroy` and `helmfile sync` instead. + ## After 1.0 We won't add any backward-incompatible changes while in 1.x, as long as it's inevitable to fix unseen important bug(s). diff --git a/docs/remote-secrets.md b/docs/remote-secrets.md index abef656a..0b75b8ef 100644 --- a/docs/remote-secrets.md +++ b/docs/remote-secrets.md @@ -17,8 +17,8 @@ To fetch single key from remote secret storage you can use `fetchSecretValue` te repositories: - name: stable - url: https://kubernetes-charts.storage.googleapis.com - + url: https://charts.helm.sh/stable +--- environments: default: values: diff --git a/docs/requirements.txt b/docs/requirements.txt index ebcdeb07..6f1e984f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,10 +1,10 @@ -Babel==2.9.1 +Babel==2.17.0 click==8.1.2 ghp-import==2.0.2 gitdb==4.0.9 GitPython==3.1.41 importlib-metadata==4.11.3 -Jinja2==3.1.4 +Jinja2==3.1.6 Markdown==3.6 MarkupSafe==2.1.1 mergedeep==1.3.4 diff --git a/go.mod b/go.mod index 1e6ea8e0..93bae27f 100644 --- a/go.mod +++ b/go.mod @@ -1,45 +1,43 @@ module github.com/helmfile/helmfile -go 1.22.6 +go 1.24.2 require ( dario.cat/mergo v1.0.1 - github.com/Masterminds/semver/v3 v3.3.0 + github.com/Masterminds/semver/v3 v3.3.1 github.com/Masterminds/sprig/v3 v3.3.0 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/go-test/deep v1.1.1 - github.com/goccy/go-yaml v1.12.0 + github.com/goccy/go-yaml v1.17.1 github.com/golang/mock v1.6.0 - github.com/google/go-cmp v0.6.0 + github.com/google/go-cmp v0.7.0 github.com/gosuri/uitable v0.0.4 - github.com/hashicorp/go-getter v1.7.6 - github.com/hashicorp/hcl/v2 v2.22.0 - github.com/helmfile/chartify v0.20.2 - github.com/helmfile/vals v0.37.5 - github.com/spf13/cobra v1.8.1 - github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.9.0 + github.com/hashicorp/go-getter v1.7.8 + github.com/hashicorp/hcl/v2 v2.23.0 + github.com/helmfile/chartify v0.22.0 + github.com/helmfile/vals v0.40.1 + github.com/spf13/cobra v1.9.1 + github.com/spf13/pflag v1.0.6 + github.com/stretchr/testify v1.10.0 github.com/tatsushid/go-prettytable v0.0.0-20141013043238-ed2d14c29939 github.com/tj/assert v0.0.3 github.com/variantdev/dag v1.1.0 - github.com/zclconf/go-cty v1.15.0 - github.com/zclconf/go-cty-yaml v1.0.3 + github.com/zclconf/go-cty v1.16.2 + github.com/zclconf/go-cty-yaml v1.1.0 go.szostok.io/version v1.2.0 go.uber.org/zap v1.27.0 - golang.org/x/sync v0.8.0 - golang.org/x/term v0.24.0 + golang.org/x/sync v0.13.0 + golang.org/x/term v0.31.0 gopkg.in/yaml.v2 v2.4.0 - helm.sh/helm/v3 v3.16.1 - k8s.io/apimachinery v0.31.1 + helm.sh/helm/v3 v3.17.3 + k8s.io/apimachinery v0.33.0 ) -replace gopkg.in/yaml.v3 => github.com/colega/go-yaml-yaml v0.0.0-20220720070545-aaba007ebc22 - require ( - cloud.google.com/go v0.115.1 // indirect - cloud.google.com/go/iam v1.2.0 // indirect - cloud.google.com/go/storage v1.43.0 // indirect - filippo.io/age v1.2.0 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/iam v1.2.2 // indirect + cloud.google.com/go/storage v1.50.0 // indirect + filippo.io/age v1.2.1 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect @@ -47,37 +45,37 @@ require ( github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/a8m/envsubst v1.4.2 // indirect - github.com/aws/aws-sdk-go v1.55.5 + github.com/a8m/envsubst v1.4.3 // indirect + github.com/aws/aws-sdk-go v1.55.7 github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/fatih/color v1.17.0 // indirect - github.com/fujiwara/tfstate-lookup v1.4.1 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/fatih/color v1.18.0 + github.com/fujiwara/tfstate-lookup v1.5.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/goware/prefixer v0.0.0-20160118172347-395022866408 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect - github.com/hashicorp/go-slug v0.15.0 // indirect - github.com/hashicorp/go-sockaddr v1.0.6 // indirect + github.com/hashicorp/go-slug v0.16.3 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/go-tfe v1.56.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/jsonapi v1.3.1 // indirect - github.com/hashicorp/vault/api v1.14.0 // indirect + github.com/hashicorp/vault/api v1.16.0 // indirect github.com/huandu/xstrings v1.5.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/itchyny/gojq v0.12.16 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.16.0 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/lib/pq v1.10.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect @@ -87,7 +85,7 @@ require ( github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/otiai10/copy v1.14.0 // indirect + github.com/otiai10/copy v1.14.1 // indirect github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect @@ -97,101 +95,116 @@ require ( github.com/ulikunitz/xz v0.5.10 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/atomic v1.9.0 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.17.0 // indirect - golang.org/x/time v0.6.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/api v0.196.0 // indirect - google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/grpc v1.66.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/oauth2 v0.28.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/text v0.23.0 // indirect + golang.org/x/time v0.9.0 // indirect + google.golang.org/api v0.215.0 // indirect + google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/grpc v1.68.0 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) require ( - cloud.google.com/go/auth v0.9.3 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/compute/metadata v0.5.0 // indirect - cloud.google.com/go/kms v1.19.0 // indirect - cloud.google.com/go/longrunning v0.6.0 // indirect - cloud.google.com/go/secretmanager v1.14.0 // indirect + al.essio.dev/pkg/shellescape v1.5.1 // indirect + cel.dev/expr v0.18.0 // indirect + cloud.google.com/go/auth v0.13.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect + cloud.google.com/go/kms v1.20.5 // indirect + cloud.google.com/go/longrunning v0.6.2 // indirect + cloud.google.com/go/monitoring v1.21.2 // indirect + cloud.google.com/go/secretmanager v1.14.3 // indirect github.com/1Password/connect-sdk-go v1.5.3 // indirect - github.com/1password/onepassword-sdk-go v0.1.1 // indirect + github.com/1password/onepassword-sdk-go v0.2.1 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/AlecAivazis/survey/v2 v2.3.6 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.3.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect github.com/DopplerHQ/cli v0.5.11-0.20230908185655-7aef4713e1a4 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/ProtonMail/go-crypto v1.1.0-alpha.3-proton // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect + github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/Masterminds/squirrel v1.5.4 // indirect + github.com/ProtonMail/go-crypto v1.1.3 // indirect github.com/agext/levenshtein v1.2.3 // indirect - github.com/alessio/shellescape v1.4.1 // indirect - github.com/antchfx/jsonquery v1.3.5 // indirect - github.com/antchfx/xpath v1.3.1 // indirect + github.com/antchfx/jsonquery v1.3.6 // indirect + github.com/antchfx/xpath v1.3.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/atotto/clipboard v0.1.4 // indirect - github.com/aws/aws-sdk-go-v2 v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.27.21 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.21 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.8 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.14 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.14 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.12 // indirect - github.com/aws/aws-sdk-go-v2/service/kms v1.34.1 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.56.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.21.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.25.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.29.1 // indirect - github.com/aws/smithy-go v1.20.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.42 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.70.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/cenkalti/backoff/v3 v3.2.2 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cloudflare/circl v1.3.9 // indirect - github.com/containerd/containerd v1.7.12 // indirect + github.com/chai2010/gettext-go v1.0.2 // indirect + github.com/cloudflare/circl v1.4.0 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/containerd/containerd v1.7.27 // indirect + github.com/containerd/errdefs v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/cyberark/conjur-api-go v0.12.4 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/cli v27.0.1+incompatible // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/cyberark/conjur-api-go v0.12.14 // indirect + github.com/danieljoos/wincred v1.2.2 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/cli v27.3.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v27.1.1+incompatible // indirect + github.com/docker/docker v27.3.1+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/envoyproxy/go-control-plane v0.13.1 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/evanphx/json-patch v5.9.0+incompatible // indirect - github.com/extism/go-sdk v1.3.1 // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/extism/go-sdk v1.7.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/getsops/gopgagent v0.0.0-20240527072608-0c14999532fe // indirect - github.com/getsops/sops/v3 v3.9.0 // indirect + github.com/getsops/sops/v3 v3.9.2 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-jose/go-jose/v4 v4.0.2 // indirect + github.com/go-gorp/gorp/v3 v3.1.0 // indirect + github.com/go-jose/go-jose/v4 v4.0.5 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.23.0 // indirect @@ -202,96 +215,112 @@ require ( github.com/go-openapi/runtime v0.28.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/strfmt v0.23.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/swag v0.23.1 // indirect github.com/go-openapi/validate v0.24.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/google/btree v1.0.1 // indirect - github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-jsonnet v0.20.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.8 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.3 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect github.com/gorilla/mux v1.8.0 // indirect - github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcp-sdk-go v0.111.0 // indirect + github.com/hashicorp/hcp-sdk-go v0.139.0 // indirect github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f // indirect - github.com/imdario/mergo v0.3.16 // indirect + github.com/ianlancetaylor/demangle v0.0.0-20240805132620-81f5be970eca // indirect github.com/itchyny/timefmt-go v0.1.6 // indirect + github.com/jmoiron/sqlx v1.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kylelemons/godebug v1.1.0 // indirect + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/moby/locker v1.0.1 // indirect + github.com/moby/spdystream v0.5.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/muesli/termenv v0.15.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/otiai10/mint v1.6.3 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.19.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/rubenv/sql-migrate v1.7.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/tetratelabs/wazero v1.7.3 // indirect - github.com/tidwall/gjson v1.17.3 // indirect + github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 // indirect + github.com/tetratelabs/wazero v1.8.2 // indirect + github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect - github.com/urfave/cli v1.22.15 // indirect + github.com/urfave/cli v1.22.16 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xlab/treeprint v1.2.0 // indirect - github.com/zalando/go-keyring v0.2.3-0.20230503081219-17db2e5354bd // indirect + github.com/zalando/go-keyring v0.2.6 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.29.0 // indirect - go.opentelemetry.io/otel/trace v1.29.0 // indirect - go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect + go.opentelemetry.io/otel v1.30.0 // indirect + go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.30.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.26.0 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/tools v0.22.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/mod v0.21.0 // indirect + golang.org/x/tools v0.26.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect + google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/gookit/color.v1 v1.1.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.31.0 // indirect - k8s.io/cli-runtime v0.31.0 // indirect - k8s.io/client-go v0.31.0 // indirect + k8s.io/api v0.32.3 // indirect + k8s.io/apiextensions-apiserver v0.32.2 // indirect + k8s.io/cli-runtime v0.32.2 // indirect + k8s.io/client-go v0.32.3 // indirect + k8s.io/component-base v0.32.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect + k8s.io/kubectl v0.32.2 // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect oras.land/oras-go v1.2.5 // indirect - sigs.k8s.io/kustomize/api v0.17.3 // indirect - sigs.k8s.io/kustomize/kyaml v0.17.2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/kustomize/api v0.18.0 // indirect + sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect ) diff --git a/go.sum b/go.sum index 280b3700..8bbdcf0f 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,15 @@ +al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= +al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= c2sp.org/CCTV/age v0.0.0-20240306222714-3ec4d716e805 h1:u2qwJeEvnypw+OCPUHmoZE3IqwfuN5kgDfo5MLzpNM0= c2sp.org/CCTV/age v0.0.0-20240306222714-3ec4d716e805/go.mod h1:FomMrUJ2Lxt5jCLmZkG3FHa72zUprnhd3v/Z18Snm4w= +cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo= +cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= 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= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -17,6 +22,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -28,32 +34,96 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= -cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/auth v0.9.3 h1:VOEUIAADkkLtyfr3BLa3R8Ed/j6w1jTBmARx+wb5w5U= -cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs= +cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= +cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= +cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -61,12 +131,44 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -74,143 +176,475 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.2.0 h1:kZKMKVNk/IsSSc/udOb83K0hL/Yh/Gcqpz+oAkoIFN8= -cloud.google.com/go/iam v1.2.0/go.mod h1:zITGuWgsLZxd8OwAlX+eMFgZDXzBm7icj1PVTYG766Q= -cloud.google.com/go/kms v1.19.0 h1:x0OVJDl6UH1BSX4THKlMfdcFWoE4ruh90ZHuilZekrU= -cloud.google.com/go/kms v1.19.0/go.mod h1:e4imokuPJUc17Trz2s6lEXFDt8bgDmvpVynH39bdrHM= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.20.5 h1:aQQ8esAIVZ1atdJRxihhdxGQ64/zEbJoJnCz/ydSmKg= +cloud.google.com/go/kms v1.20.5/go.mod h1:C5A8M1sv2YWYy1AE6iSrnddSG9lRGdJq5XEdBy28Lmw= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/longrunning v0.6.0 h1:mM1ZmaNsQsnb+5n1DNPeL0KwQd9jQRqSqSDEkBZr+aI= -cloud.google.com/go/longrunning v0.6.0/go.mod h1:uHzSZqW89h7/pasCWNYdUpwGz3PcVWhrWupreVPYLts= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.14.0 h1:P2RRu2NEsQyOjplhUPvWKqzDXUKzwejHLuSUBHI8c4w= -cloud.google.com/go/secretmanager v1.14.0/go.mod h1:q0hSFHzoW7eRgyYFH8trqEFavgrMeiJI4FETNN78vhM= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.14.3 h1:XVGHbcXEsbrgi4XHzgK5np81l1eO7O72WOXHhXUemrM= +cloud.google.com/go/secretmanager v1.14.3/go.mod h1:Pwzcfn69Ni9Lrk1/XBzo1H9+MCJwJ6CDCoeoQUsMN+c= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= -cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= +cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= +cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/age v1.2.0 h1:vRDp7pUMaAJzXNIWJVAZnEf/Dyi4Vu4wI8S1LBzufhE= -filippo.io/age v1.2.0/go.mod h1:JL9ew2lTN+Pyft4RiNGguFfOpewKwSHm5ayKD/A4004= +filippo.io/age v1.2.1 h1:X0TZjehAZylOIj4DubWYU1vWQxv9bJpo+Uu2/LGhi1o= +filippo.io/age v1.2.1/go.mod h1:JL9ew2lTN+Pyft4RiNGguFfOpewKwSHm5ayKD/A4004= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/1Password/connect-sdk-go v1.5.3 h1:KyjJ+kCKj6BwB2Y8tPM1Ixg5uIS6HsB0uWA8U38p/Uk= github.com/1Password/connect-sdk-go v1.5.3/go.mod h1:5rSymY4oIYtS4G3t0oMkGAXBeoYiukV3vkqlnEjIDJs= -github.com/1password/onepassword-sdk-go v0.1.1 h1:smvVI7OTTqFf6M7jOU7s+VbYbYHrStnT/GYZ9+hDy4o= -github.com/1password/onepassword-sdk-go v0.1.1/go.mod h1:7wEQynLBXBC4svNx3X82QmCy0Adhm4e+UkM9t9mSSWA= +github.com/1password/onepassword-sdk-go v0.2.1 h1:wwJmjR3UrwYxgAmNpKZ/mHOgFYCz6aQx7NxQ2YCFOL8= +github.com/1password/onepassword-sdk-go v0.2.1/go.mod h1:R+3/jgPZRbfuXrMCqrl3NM46MMbpc4Zue5S5KRv6yC8= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw= github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= @@ -219,12 +653,12 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1. github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.3.0 h1:LcJtQjCXJUm1s7JpUHZvu+bpgURhCatxVNbGADXniX0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.3.0/go.mod h1:+OgGVo0Httq7N5oayfvaLQ/Jq+2gJdqfp++Hyyl7Tws= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0 h1:h4Zxgmi9oyZL2l8jeg1iRTqPloHktywWcu0nlJmo1tA= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0/go.mod h1:LgLGXawqSreJz135Elog0ywTJDsm0Hz2k+N+6ZK35u8= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.1 h1:9fXQS/0TtQmKXp8SureKouF+idbQvp7cPUxykiohnBs= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.1/go.mod h1:f+OaoSg0VQYPMqB0Jp2D54j1VHzITYcJaCNwV+k00ts= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.0 h1:7rKG7UmnrxX4N53TFhkYqjc+kVUZuw0fL8I3Fh+Ld9E= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.0/go.mod h1:Wjo+24QJVhhl/L7jy6w9yzFF2yDOf3cKECAa8ecf9vE= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.3.1 h1:mrkDCdkMsD4l9wjFGhofFHFrV43Y3c53RSLKOCJ5+Ow= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.3.1/go.mod h1:hPv41DbqMmnxcGralanA/kVlfdH5jv3T4LxGku2E1BY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1 h1:bFWuoEKg+gImo7pvkiQEFAc8ocibADgXeiLAxWhWmkI= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1/go.mod h1:Vih/3yc6yac2JzU4hzpaDupBJP0Flaia9rXXrU8xyww= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 h1:nVocQV40OQne5613EeLayJiRAJuKlBGy+m22qWG+WRg= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= @@ -245,98 +679,124 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DopplerHQ/cli v0.5.11-0.20230908185655-7aef4713e1a4 h1:s7/zwMi5w+KnlumDVbX1+P6mNAk5o7Wvx0VmvrQ7Bm0= github.com/DopplerHQ/cli v0.5.11-0.20230908185655-7aef4713e1a4/go.mod h1:ipnA9Lpn5YM+FDSQZ7VWNjcuVurchInoGKm+v7O0sGs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= +github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= +github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ProtonMail/go-crypto v1.1.0-alpha.3-proton h1:0RXAi0EJFs81j+MMsqvHNuAUGWzeVfCO9LnHAfoQ8NA= -github.com/ProtonMail/go-crypto v1.1.0-alpha.3-proton/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg= -github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= +github.com/a8m/envsubst v1.4.3 h1:kDF7paGK8QACWYaQo6KtyYBozY2jhQrTuNNuUxQkhJY= +github.com/a8m/envsubst v1.4.3/go.mod h1:4jjHWQlZoaXPoLQUb7H2qT4iLkZDdmEQiOUogdUmqVU= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/antchfx/jsonquery v1.3.5 h1:243OSaQh02EfmASa3w3weKC9UaiD8RRzJhgfvq3q408= -github.com/antchfx/jsonquery v1.3.5/go.mod h1:qH23yX2Jsj1/k378Yu/EOgPCNgJ35P9tiGOeQdt/GWc= -github.com/antchfx/xpath v1.3.1 h1:PNbFuUqHwWl0xRjvUPjJ95Agbmdj2uzzIwmQKgu4oCk= -github.com/antchfx/xpath v1.3.1/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antchfx/jsonquery v1.3.6 h1:TaSfeAh7n6T11I74bsZ1FswreIfrbJ0X+OyLflx6mx4= +github.com/antchfx/jsonquery v1.3.6/go.mod h1:fGzSGJn9Y826Qd3pC8Wx45avuUwpkePsACQJYy+58BU= +github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/antchfx/xpath v1.3.3 h1:tmuPQa1Uye0Ym1Zn65vxPgfltWb/Lxu2jeqIGteJSRs= +github.com/antchfx/xpath v1.3.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= +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/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/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= -github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.30.0 h1:6qAwtzlfcTtcL8NHtbDQAqgM5s6NDipQTkPxyH/6kAA= -github.com/aws/aws-sdk-go-v2 v1.30.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= -github.com/aws/aws-sdk-go-v2/config v1.27.21 h1:yPX3pjGCe2hJsetlmGNB4Mngu7UPmvWPzzWCv1+boeM= -github.com/aws/aws-sdk-go-v2/config v1.27.21/go.mod h1:4XtlEU6DzNai8RMbjSF5MgGZtYvrhBP/aKZcRtZAVdM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.21 h1:pjAqgzfgFhTv5grc7xPHtXCAaMapzmwA7aU+c/SZQGw= -github.com/aws/aws-sdk-go-v2/credentials v1.17.21/go.mod h1:nhK6PtBlfHTUDVmBLr1dg+WHCOCK+1Fu/WQyVHPsgNQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.8 h1:FR+oWPFb/8qMVYMWN98bUZAGqPvLHiyqg1wqQGfUAXY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.8/go.mod h1:EgSKcHiuuakEIxJcKGzVNWh5srVAQ3jKaSrBGRYvM48= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.1 h1:D9VqWMuw7lJAX6d5eINfRQ/PkvtcJAK3Qmd6f6xEeUw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.1/go.mod h1:ckvBx7codI4wzc5inOfDp5ZbK7TjMFa7eXwmLvXQrRk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.12 h1:SJ04WXGTwnHlWIODtC5kJzKbeuHt+OUNOgKg7nfnUGw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.12/go.mod h1:FkpvXhA92gb3GE9LD6Og0pHHycTxW7xGpnEh5E7Opwo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.12 h1:hb5KgeYfObi5MHkSSZMEudnIvX30iB+E21evI4r6BnQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.12/go.mod h1:CroKe/eWJdyfy9Vx4rljP5wTUjNJfb+fPz1uMYUhEGM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.12 h1:DXFWyt7ymx/l1ygdyTTS0X923e+Q2wXIxConJzrgwc0= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.12/go.mod h1:mVOr/LbvaNySK1/BTy4cBOCjhCNY2raWBwK4v+WR5J4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.14 h1:oWccitSnByVU74rQRHac4gLfDqjB6Z1YQGOY/dXKedI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.14/go.mod h1:8SaZBlQdCLrc/2U3CEO48rYj9uR8qRsPRkmzwNM52pM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.14 h1:zSDPny/pVnkqABXYRicYuPf9z2bTqfH13HT3v6UheIk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.14/go.mod h1:3TTcI5JSzda1nw/pkVC9dhgLre0SNBFj2lYS4GctXKI= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.12 h1:tzha+v1SCEBpXWEuw6B/+jm4h5z8hZbTpXz0zRZqTnw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.12/go.mod h1:n+nt2qjHGoseWeLHt1vEr6ZRCCxIN2KcNpJxBcYQSwI= -github.com/aws/aws-sdk-go-v2/service/kms v1.34.1 h1:VsKBn6WADI3Nn3WjBMzeRww9WHXeVLi7zyuSrqjRCBQ= -github.com/aws/aws-sdk-go-v2/service/kms v1.34.1/go.mod h1:5F6kXrPBxv0l1t8EO44GuG4W82jGJwaRE0B+suEGnNY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.56.1 h1:wsg9Z/vNnCmxWikfGIoOlnExtEU459cR+2d+iDJ8elo= -github.com/aws/aws-sdk-go-v2/service/s3 v1.56.1/go.mod h1:8rDw3mVwmvIWWX/+LWY3PPIMZuwnQdJMCt0iVFVT3qw= -github.com/aws/aws-sdk-go-v2/service/sso v1.21.1 h1:sd0BsnAvLH8gsp2e3cbaIr+9D7T1xugueQ7V/zUAsS4= -github.com/aws/aws-sdk-go-v2/service/sso v1.21.1/go.mod h1:lcQG/MmxydijbeTOp04hIuJwXGWPZGI3bwdFDGRTv14= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.25.1 h1:1uEFNNskK/I1KoZ9Q8wJxMz5V9jyBlsiaNrM7vA3YUQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.25.1/go.mod h1:z0P8K+cBIsFXUr5rzo/psUeJ20XjPN0+Nn8067Nd+E4= -github.com/aws/aws-sdk-go-v2/service/sts v1.29.1 h1:myX5CxqXE0QMZNja6FA1/FSE3Vu1rVmeUmpJMMzeZg0= -github.com/aws/aws-sdk-go-v2/service/sts v1.29.1/go.mod h1:N2mQiucsO0VwK9CYuS4/c2n6Smeh1v47Rz3dWCPFLdE= -github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= -github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= +github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.42 h1:vEnk9vtjJ62OO2wOhEmgKMZgNcn1w0aF7XCiNXO5rK0= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.42/go.mod h1:GUOPbPJWRZsdt1OJ355upCrry4d3ZFgdX6rhT7gtkto= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 h1:dZmNIRtPUvtvUIIDVNpvtnJQ8N8Iqm7SQAxf18htZYw= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7/go.mod h1:vj8PlfJH9mnGeIzd6uMLPi5VgiqzGG7AZoe1kf1uTXM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.70.0 h1:HrHFR8RoS4l4EvodRMFcJMYQ8o3UhmALn2nbInXaxZA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.70.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -349,6 +809,8 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= @@ -357,66 +819,82 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembj github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= -github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= +github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= 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= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE= -github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY= +github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= 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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 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/colega/go-yaml-yaml v0.0.0-20220720070545-aaba007ebc22 h1:uVG5v+c6ndz9seCorYjQmlVlPbh3OMcMWJzAJZWdM/g= -github.com/colega/go-yaml-yaml v0.0.0-20220720070545-aaba007ebc22/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= -github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= -github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= -github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII= +github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0= +github.com/containerd/continuity v0.4.4 h1:/fNVfTJ7wIl/YPMHjf+5H32uFhl63JucB34PlCpMKII= +github.com/containerd/continuity v0.4.4/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= +github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= +github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyberark/conjur-api-go v0.12.4 h1:N1Ku6xveOHZa7NRuf//uNKxwcvwp7MTy59aB2VM0o9A= -github.com/cyberark/conjur-api-go v0.12.4/go.mod h1:FnzNn6mPwTOyBueSDnu1J4K47J0sYHXTMehaqIV/GxY= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/cyberark/conjur-api-go v0.12.14 h1:E/dTORBq7/wu/llODfeuWmZa3lQy1D4dHzCNcG5JlpU= +github.com/cyberark/conjur-api-go v0.12.14/go.mod h1:0ZVdpe/GzMMQyZkGV3o9bM/jswH3XrBEU9phSL0lP/g= +github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= +github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v27.0.1+incompatible h1:d/OrlblkOTkhJ1IaAGD1bLgUBtFQC/oP0VjkFMIN+B0= -github.com/docker/cli v27.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/cli v27.3.1+incompatible h1:qEGdFBF3Xu6SCvCYhc7CzaQTlBmqDuzxPDpigSyeKQQ= +github.com/docker/cli v27.3.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= -github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= @@ -429,8 +907,12 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a h1:UwSIFv5g5lIvbGgtf3tVwC7Ky9rmMFBp0RMs+6f6YqE= +github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a/go.mod h1:C8DzXehI4zAbrdlbtOByKX6pfivJTBiV9Jjqv56Yd9Q= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -442,37 +924,59 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/extism/go-sdk v1.3.1 h1:eVpuv36b67Km/tAb7Cq6msHEW8kkdFgpZO/7fCwjuoE= -github.com/extism/go-sdk v1.3.1/go.mod h1:tPMWfCSOThie3LSTSZKbrQjRm2oAXxUUjSE4HJWjYQM= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/extism/go-sdk v1.7.0 h1:yHbSa2JbcF60kjGsYiGEOcClfbknqCJchyh9TRibFWo= +github.com/extism/go-sdk v1.7.0/go.mod h1:Dhuc1qcD0aqjdqJ3ZDyGdkZPEj/EHKVjbE4P+1XRMqc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fujiwara/tfstate-lookup v1.4.1 h1:uQxR3DA5P7p9JENCAdtTTAguDMX2A3LFy3z0gtu76sU= -github.com/fujiwara/tfstate-lookup v1.4.1/go.mod h1:C/n3SgmKG5Q3R/CuoOJLkSwtUDp6pUIVwShLPSFcZCw= +github.com/fujiwara/tfstate-lookup v1.5.0 h1:aH6taxOnqdLsf6OYLTpu1S2jdGyIByw+kIRdUpyx7IQ= +github.com/fujiwara/tfstate-lookup v1.5.0/go.mod h1:8Lx6yUGa402ko/I9nv5FMpfKfgc4ZUM2uNx06WJu+1E= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/getsops/gopgagent v0.0.0-20240527072608-0c14999532fe h1:QKe/kmAYbndxwu91TcjHERsnMh5SgOB1x/qicvOdUJ8= github.com/getsops/gopgagent v0.0.0-20240527072608-0c14999532fe/go.mod h1:awFzISqLJoZLm+i9QQ4SgMNHDqljH6jWV0B36V5MrUM= -github.com/getsops/sops/v3 v3.9.0 h1:J1UGOAPz4wSRE1dRtkwcQNyvG/jcjcRYJy1wbgKbqeE= -github.com/getsops/sops/v3 v3.9.0/go.mod h1:lYvaahx9fme8XdBLFHLAZzsMuApg8pIJn8ApyInTdqk= +github.com/getsops/sops/v3 v3.9.2 h1:Cuuahc/UGu7W3+NXd+mrl+2oXGxxj/jIPsw6Ah2CbxA= +github.com/getsops/sops/v3 v3.9.2/go.mod h1:J8CMEdmPWT8gxFaNmPBSrc5NFd4uNndf8aFQwhD/ZR8= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk= -github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= +github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= +github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= +github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= +github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -496,27 +1000,26 @@ github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9Z github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc= -github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM= -github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.17.1 h1:LI34wktB2xEE3ONG/2Ar54+/HJVBriAGJ55PHls4YuY= +github.com/goccy/go-yaml v1.17.1/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -524,11 +1027,15 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -561,17 +1068,20 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= +github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -587,8 +1097,9 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-jsonnet v0.20.0 h1:WG4TTSARuV7bSm4PMB4ohjxe33IHT5WVTrJSU33uT4g= github.com/google/go-jsonnet v0.20.0/go.mod h1:VbgWF9JX7ztlv770x/TolZNGGFfiHEVx9G6ca2eUmeA= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -601,6 +1112,7 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -612,13 +1124,14 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= @@ -631,8 +1144,10 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ 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= -github.com/googleapis/enterprise-certificate-proxy v0.3.3 h1:QRje2j5GZimBzlbhGA2V2QlGNgL8G6e+wGo/+/2bWI0= -github.com/googleapis/enterprise-certificate-proxy v0.3.3/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= 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/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -642,27 +1157,34 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/goware/prefixer v0.0.0-20160118172347-395022866408 h1:Y9iQJfEqnN3/Nce9cOegemcy/9Ai5k3huT6E80F3zaw= github.com/goware/prefixer v0.0.0-20160118172347-395022866408/go.mod h1:PE1ycukgRPJ7bJ9a1fdfQ9j8i/cEcRAoLZzbxYpNB/s= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= 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= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.6 h1:5jHuM+aH373XNtXl9TNTUH5Qd69Trve11tHIrB+6yj4= -github.com/hashicorp/go-getter v1.7.6/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.8 h1:mshVHx1Fto0/MydBekWan5zUipGq7jO0novchgMmSiY= +github.com/hashicorp/go-getter v1.7.8/go.mod h1:2c6CboOEb9jG6YvmC9xdD+tyAFsrUaJPedwXDGr0TM4= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -677,10 +1199,10 @@ github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 h1:iBt4Ew4XEGLfh6/bPk4rSY github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8/go.mod h1:aiJI+PIApBRQG7FZTEBx5GiiX+HbOHilUdNxUZi4eV0= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-slug v0.15.0 h1:AhMnE6JIyW0KoDJlmRDwv4xd52a5ZK3VdioQ7SMmZhI= -github.com/hashicorp/go-slug v0.15.0/go.mod h1:THWVTAXwJEinbsp4/bBRcmbaO5EYNLTqxbG4tZ3gCYQ= -github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= -github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-slug v0.16.3 h1:pe0PMwz2UWN1168QksdW/d7u057itB2gY568iF0E2Ns= +github.com/hashicorp/go-slug v0.16.3/go.mod h1:THWVTAXwJEinbsp4/bBRcmbaO5EYNLTqxbG4tZ3gCYQ= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/go-tfe v1.56.0 h1:AjBTo7TmWoz42l4KhH65Q3NvjRD5yD3XZrG1tzFySeI= github.com/hashicorp/go-tfe v1.56.0/go.mod h1:XnTtBj3tVQ4uFkcFsv8Grn+O1CVcIcceL1uc2AgUcaU= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= @@ -693,28 +1215,29 @@ github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iP github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 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.22.0 h1:hkZ3nCtqeJsDhPRFz5EA9iwcG1hNWGePOTw6oyul12M= -github.com/hashicorp/hcl/v2 v2.22.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= -github.com/hashicorp/hcp-sdk-go v0.111.0 h1:tPQs4N3HdwF8NF3gwZQ8b00CJDeuEzmrQh/OsJlhSSs= -github.com/hashicorp/hcp-sdk-go v0.111.0/go.mod h1:vQ4fzdL1AmhIAbCw+4zmFe5Hbpajj3NvRWkJoVuxmAk= +github.com/hashicorp/hcl/v2 v2.23.0 h1:Fphj1/gCylPxHutVSEOf2fBOh1VE4AuLV7+kbJf3qos= +github.com/hashicorp/hcl/v2 v2.23.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= +github.com/hashicorp/hcp-sdk-go v0.139.0 h1:jvEIwYg84/ZFphNJrk5Hoa5bYj5wORHgRQcbOfeqDHY= +github.com/hashicorp/hcp-sdk-go v0.139.0/go.mod h1:ZxsZZjErm3E2sj2OjDeVsGJAkWtcRLUS+FrNLGPsUyw= github.com/hashicorp/jsonapi v1.3.1 h1:GtPvnmcWgYwCuDGvYT5VZBHcUyFdq9lSyCzDjn1DdPo= github.com/hashicorp/jsonapi v1.3.1/go.mod h1:kWfdn49yCjQvbpnvY1dxxAuAFzISwrrMDQOcu6NsFoM= -github.com/hashicorp/vault/api v1.14.0 h1:Ah3CFLixD5jmjusOgm8grfN9M0d+Y8fVR2SW0K6pJLU= -github.com/hashicorp/vault/api v1.14.0/go.mod h1:pV9YLxBGSz+cItFDd8Ii4G17waWOQ32zVjMWHe/cOqk= -github.com/helmfile/chartify v0.20.2 h1:aWitnxXahmkaL69L1k2BMW0fFYresIKv9wa4YMhLRA0= -github.com/helmfile/chartify v0.20.2/go.mod h1:qiuwenVmBC1fB3WvlxSUegjo14FT6g387xKVfQWiBbo= -github.com/helmfile/vals v0.37.5 h1:FVcIyhbqxzYN/of0fQfHG6YeuJlVshDdSh176zucdr0= -github.com/helmfile/vals v0.37.5/go.mod h1:YOkonFpvpo2mRzAI5jHJ5ogej0L6bTMiS/NhhLv2duo= +github.com/hashicorp/vault/api v1.16.0 h1:nbEYGJiAPGzT9U4oWgaaB0g+Rj8E59QuHKyA5LhwQN4= +github.com/hashicorp/vault/api v1.16.0/go.mod h1:KhuUhzOD8lDSk29AtzNjgAu2kxRA9jL9NAbkFlqvkBA= +github.com/helmfile/chartify v0.22.0 h1:spw2kNBEToes3zc1N5GvqMiVVuCRSDeUap8ZUdEPcmE= +github.com/helmfile/chartify v0.22.0/go.mod h1:cA9A0rSqDkR5sdga1gSyv0y9ebEf4loPfUsSHO+eDdo= +github.com/helmfile/vals v0.40.1 h1:qveElGFgT5nyVk9DjGJTqiy4Tp0SaPD1x1GujnQWdqE= +github.com/helmfile/vals v0.40.1/go.mod h1:VE3/SQwG1XeMFlh+i8nn0o9qqaCIp7wRNsDO6bVYKrY= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f h1:7LYC+Yfkj3CTRcShK0KOL/w6iTiKyqqBA9a41Wnggw8= github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f/go.mod h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/ianlancetaylor/demangle v0.0.0-20240805132620-81f5be970eca h1:T54Ema1DU8ngI+aef9ZhAhNGQhcRTrWxVeG07F+c/Rw= +github.com/ianlancetaylor/demangle v0.0.0-20240805132620-81f5be970eca/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/itchyny/gojq v0.12.16 h1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g= @@ -725,6 +1248,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -734,16 +1259,26 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= -github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -752,22 +1287,27 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 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= @@ -775,14 +1315,17 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= 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.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -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= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -801,8 +1344,12 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -819,38 +1366,52 @@ github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4AN github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= -github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= -github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= -github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstuUhmRs= -github.com/opencontainers/runc v1.1.13/go.mod h1:R016aXacfp/gwQBYw2FDGa9m+n6atbLWrYY8hNMT/sA= +github.com/opencontainers/runc v1.1.14 h1:rgSuzbmgz5DUJjeSnw337TxDbRuqjs6iqQck/2weR6w= +github.com/opencontainers/runc v1.1.14/go.mod h1:E4C2z+7BxR7GHXp0hAY53mek+x49X1LjPNeMTfRGvOA= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= -github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= -github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= -github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= -github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= -github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/ory/dockertest/v3 v3.11.0 h1:OiHcxKAvSDUwsEVh2BjxQQc/5EHz9n0va9awCtNGuyA= +github.com/ory/dockertest/v3 v3.11.0/go.mod h1:VIPxS1gwT9NpPOrfD3rACs8Y9Z7yhzO4SB194iUDnUI= +github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= +github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= +github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= +github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= +github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= @@ -859,6 +1420,8 @@ github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJL github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -870,16 +1433,25 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rubenv/sql-migrate v1.7.1 h1:f/o0WgfO/GqNuVg+6801K/KW3WdDSupzSjDYODmiUq4= +github.com/rubenv/sql-migrate v1.7.1/go.mod h1:Ob2Psprc0/3ggbM6wCzyYVFFuc6FyZrb2AS+ezLDFb4= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= @@ -893,12 +1465,15 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= -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/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -915,15 +1490,19 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tatsushid/go-prettytable v0.0.0-20141013043238-ed2d14c29939 h1:BhIUXV2ySTLrKgh/Hnts+QTQlIbWtomXt3LMdzME0A0= github.com/tatsushid/go-prettytable v0.0.0-20141013043238-ed2d14c29939/go.mod h1:omGxs4/6hNjxPKUTjmaNkPzehSnNJOJN6pMEbrlYIT4= -github.com/tetratelabs/wazero v1.7.3 h1:PBH5KVahrt3S2AHgEjKu4u+LlDbbk+nsGE3KLucy6Rw= -github.com/tetratelabs/wazero v1.7.3/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= -github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= -github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 h1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q= +github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834/go.mod h1:m9ymHTgNSEjuxvw8E7WWe4Pl4hZQHXONY8wE6dMLaRk= +github.com/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4= +github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= @@ -936,8 +1515,8 @@ github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVK github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM= -github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0= +github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ= +github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po= github.com/variantdev/dag v1.1.0 h1:xodYlSng33KWGvIGMpKUyLcIZRXKiNUx612mZJqYrDg= github.com/variantdev/dag v1.1.0/go.mod h1:pH1TQsNSLj2uxMo9NNl9zdGy01Wtn+/2MT96BrKmVyE= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -955,6 +1534,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= @@ -962,14 +1542,16 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMzt github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zalando/go-keyring v0.2.3-0.20230503081219-17db2e5354bd h1:D+eeEnOlWcMXbwZ5X3oy68nHafBtGcj1jMKFHtVdybY= -github.com/zalando/go-keyring v0.2.3-0.20230503081219-17db2e5354bd/go.mod h1:sI3evg9Wvpw3+n4SqplGSJUMwtDeROfD4nsFz4z9PG0= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s= +github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI= +github.com/zclconf/go-cty v1.16.2 h1:LAJSwc3v81IRBZyUVQDUdZ7hs3SYs9jv0eZJDWHD/70= +github.com/zclconf/go-cty v1.16.2/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= -github.com/zclconf/go-cty-yaml v1.0.3 h1:og/eOQ7lvA/WWhHGFETVWNduJM7Rjsv2RRpx1sdFMLc= -github.com/zclconf/go-cty-yaml v1.0.3/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -981,21 +1563,29 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= -go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= -go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= -go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= -go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= +go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= +go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= +go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.szostok.io/version v1.2.0 h1:8eMMdfsonjbibwZRLJ8TnrErY8bThFTQsZYV16mcXms= go.szostok.io/version v1.2.0/go.mod h1:EiU0gPxaXb6MZ+apSN0WgDO6F4JXyC99k9PIXf2k2E8= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= @@ -1010,25 +1600,48 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1052,9 +1665,17 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1087,11 +1708,14 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1103,11 +1727,22 @@ golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1131,10 +1766,14 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/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.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= 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= @@ -1148,9 +1787,15 @@ 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-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-20220819030929-7fc1605a5dde/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.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1168,6 +1813,7 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1187,11 +1833,14 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1199,9 +1848,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1221,19 +1872,38 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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.4.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.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1243,17 +1913,31 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/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.6.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.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= 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.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1266,6 +1950,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1295,19 +1980,27 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= 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= @@ -1316,8 +2009,14 @@ golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1365,9 +2064,18 @@ google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaE google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.196.0 h1:k/RafYqebaIJBO3+SMnfEGtFVlvp5vSgqTUF54UN/zg= -google.golang.org/api v0.196.0/go.mod h1:g9IL21uGkYgvQ5BZg6BAtoGJQIm8r6EgaAbpNey5wBE= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.215.0 h1:jdYF4qnyczlEz2ReWIsosNLDuzXyvFHJtI5gcr0J7t0= +google.golang.org/api v0.215.0/go.mod h1:fta3CVtuJYOEdugLNWm6WodzOS8KdFckABwN4I40hzY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1410,7 +2118,9 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1443,6 +2153,7 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -1475,13 +2186,41 @@ google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53B google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= -google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= -google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= +google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= +google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 h1:TqExAhdPaB60Ux47Cn0oLV07rGnxZzIsaRhQaqS666A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1508,6 +2247,7 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= @@ -1517,9 +2257,16 @@ 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.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= -google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a h1:UIpYSuWdWHSzjwcAFRLjKcPXFZVVLXGEM23W+NWqipw= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a/go.mod h1:9i1T9n4ZinTUZGgzENMi8MDDgbGC5mqTS75JAv6xN3A= 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= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1535,8 +2282,11 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1558,10 +2308,14 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -helm.sh/helm/v3 v3.16.1 h1:cER6tI/8PgUAsaJaQCVBUg3VI9KN4oVaZJgY60RIc0c= -helm.sh/helm/v3 v3.16.1/go.mod h1:r+xBHHP20qJeEqtvBXMf7W35QDJnzY/eiEBzt+TfHps= +helm.sh/helm/v3 v3.17.3 h1:3n5rW3D0ArjFl0p4/oWO8IbY/HKaNNwJtOQFdH2AZHg= +helm.sh/helm/v3 v3.17.3/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1569,32 +2323,77 @@ 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.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= -k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= -k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U= -k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/cli-runtime v0.31.0 h1:V2Q1gj1u3/WfhD475HBQrIYsoryg/LrhhK4RwpN+DhA= -k8s.io/cli-runtime v0.31.0/go.mod h1:vg3H94wsubuvWfSmStDbekvbla5vFGC+zLWqcf+bGDw= -k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= -k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= +k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= +k8s.io/apiextensions-apiserver v0.32.2 h1:2YMk285jWMk2188V2AERy5yDwBYrjgWYggscghPCvV4= +k8s.io/apiextensions-apiserver v0.32.2/go.mod h1:GPwf8sph7YlJT3H6aKUWtd0E+oyShk/YHWQHf/OOgCA= +k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ= +k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/cli-runtime v0.32.2 h1:aKQR4foh9qeyckKRkNXUccP9moxzffyndZAvr+IXMks= +k8s.io/cli-runtime v0.32.2/go.mod h1:a/JpeMztz3xDa7GCyyShcwe55p8pbcCVQxvqZnIwXN8= +k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= +k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/component-base v0.32.2 h1:1aUL5Vdmu7qNo4ZsE+569PV5zFatM9hl+lb3dEea2zU= +k8s.io/component-base v0.32.2/go.mod h1:PXJ61Vx9Lg+P5mS8TLd7bCIr+eMJRQTyXe8KvkrvJq0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kubectl v0.32.2 h1:TAkag6+XfSBgkqK9I7ZvwtF0WVtUAvK8ZqTt+5zi1Us= +k8s.io/kubectl v0.32.2/go.mod h1:+h/NQFSPxiDZYX/WZaWw9fwYezGLISP0ud8nQKg+3g8= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.17.3 h1:6GCuHSsxq7fN5yhF2XrC+AAr8gxQwhexgHflOAD/JJU= -sigs.k8s.io/kustomize/api v0.17.3/go.mod h1:TuDH4mdx7jTfK61SQ/j1QZM/QWR+5rmEiNjvYlhzFhc= -sigs.k8s.io/kustomize/kyaml v0.17.2 h1:+AzvoJUY0kq4QAhH/ydPHHMRLijtUKiyVyh7fOSshr0= -sigs.k8s.io/kustomize/kyaml v0.17.2/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo= +sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U= +sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E= +sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= +sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/pkg/app/app.go b/pkg/app/app.go index e7356abb..8047fc82 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -20,7 +20,6 @@ import ( "github.com/helmfile/helmfile/pkg/helmexec" "github.com/helmfile/helmfile/pkg/plugins" "github.com/helmfile/helmfile/pkg/remote" - "github.com/helmfile/helmfile/pkg/runtime" "github.com/helmfile/helmfile/pkg/state" ) @@ -139,26 +138,6 @@ func (a *App) Repos(c ReposConfigProvider) error { }, c.IncludeTransitiveNeeds(), SetFilter(true)) } -// TODO: Remove this function once Helmfile v0.x -func (a *App) DeprecatedSyncCharts(c DeprecatedChartsConfigProvider) error { - return a.ForEachState(func(run *Run) (_ bool, errs []error) { - err := run.withPreparedCharts("charts", state.ChartPrepareOptions{ - SkipRepos: true, - SkipDeps: true, - Concurrency: 2, - }, func() []error { - errs = run.DeprecatedSyncCharts(c) - return errs - }) - - if err != nil { - errs = append(errs, err) - } - - return - }, c.IncludeTransitiveNeeds(), SetFilter(true)) -} - func (a *App) Diff(c DiffConfigProvider) error { var allDiffDetectedErrs []error @@ -176,7 +155,8 @@ func (a *App) Diff(c DiffConfigProvider) error { includeCRDs := !c.SkipCRDs() prepErr := run.withPreparedCharts("diff", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), IncludeCRDs: &includeCRDs, Validate: c.Validate(), @@ -241,8 +221,13 @@ func (a *App) Template(c TemplateConfigProvider) error { // Live output should never be enabled for the "template" subcommand to avoid breaking `helmfile template | kubectl apply -f -` run.helm.SetEnableLiveOutput(false) + // Reset helm extra args to not pollute BuildDeps() and AddRepo() on subsequent helmfiles + // https://github.com/helmfile/helmfile/issues/1749 + run.helm.SetExtraArgs() + prepErr := run.withPreparedCharts("template", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), IncludeCRDs: &includeCRDs, SkipCleanup: c.SkipCleanup(), @@ -250,6 +235,7 @@ func (a *App) Template(c TemplateConfigProvider) error { Concurrency: c.Concurrency(), IncludeTransitiveNeeds: c.IncludeNeeds(), Set: c.Set(), + Values: c.Values(), KubeVersion: c.KubeVersion(), }, func() []error { ok, errs = a.template(run, c) @@ -267,7 +253,8 @@ func (a *App) Template(c TemplateConfigProvider) error { func (a *App) WriteValues(c WriteValuesConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { prepErr := run.withPreparedCharts("write-values", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), SkipCleanup: c.SkipCleanup(), Concurrency: c.Concurrency(), @@ -319,7 +306,8 @@ func (a *App) Lint(c LintConfigProvider) error { // `helm lint` on helm v2 and v3 does not support remote charts, that we need to set `forceDownload=true` here prepErr := run.withPreparedCharts("lint", state.ChartPrepareOptions{ ForceDownload: true, - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), SkipCleanup: c.SkipCleanup(), Concurrency: c.Concurrency(), @@ -355,7 +343,8 @@ func (a *App) Fetch(c FetchConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { prepErr := run.withPreparedCharts("pull", state.ChartPrepareOptions{ ForceDownload: true, - SkipRepos: c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), SkipDeps: c.SkipDeps(), OutputDir: c.OutputDir(), OutputDirTemplate: c.OutputDirTemplate(), @@ -377,9 +366,11 @@ func (a *App) Sync(c SyncConfigProvider) error { includeCRDs := !c.SkipCRDs() prepErr := run.withPreparedCharts("sync", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), Wait: c.Wait(), + WaitRetries: c.WaitRetries(), WaitForJobs: c.WaitForJobs(), IncludeCRDs: &includeCRDs, IncludeTransitiveNeeds: c.IncludeNeeds(), @@ -405,18 +396,20 @@ func (a *App) Apply(c ApplyConfigProvider) error { var opts []LoadOption - opts = append(opts, SetRetainValuesFiles(c.RetainValuesFiles() || c.SkipCleanup())) + opts = append(opts, SetRetainValuesFiles(c.SkipCleanup())) err := a.ForEachState(func(run *Run) (ok bool, errs []error) { includeCRDs := !c.SkipCRDs() prepErr := run.withPreparedCharts("apply", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), Wait: c.Wait(), + WaitRetries: c.WaitRetries(), WaitForJobs: c.WaitForJobs(), IncludeCRDs: &includeCRDs, - SkipCleanup: c.RetainValuesFiles() || c.SkipCleanup(), + SkipCleanup: c.SkipCleanup(), Validate: c.Validate(), Concurrency: c.Concurrency(), IncludeTransitiveNeeds: c.IncludeNeeds(), @@ -470,36 +463,12 @@ func (a *App) Status(c StatusesConfigProvider) error { }, false, SetFilter(true)) } -// TODO: Remove this function once Helmfile v0.x -func (a *App) Delete(c DeleteConfigProvider) error { - return a.ForEachState(func(run *Run) (ok bool, errs []error) { - if !c.SkipCharts() { - err := run.withPreparedCharts("delete", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), - SkipDeps: c.SkipDeps(), - Concurrency: c.Concurrency(), - DeleteWait: c.DeleteWait(), - DeleteTimeout: c.DeleteTimeout(), - }, func() []error { - ok, errs = a.delete(run, c.Purge(), c) - return errs - }) - - if err != nil { - errs = append(errs, err) - } - } else { - ok, errs = a.delete(run, c.Purge(), c) - } - return - }, false, SetReverse(true)) -} - func (a *App) Destroy(c DestroyConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { if !c.SkipCharts() { err := run.withPreparedCharts("destroy", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), Concurrency: c.Concurrency(), DeleteWait: c.DeleteWait(), @@ -527,7 +496,8 @@ func (a *App) Test(c TestConfigProvider) error { } err := run.withPreparedCharts("test", state.ChartPrepareOptions{ - SkipRepos: c.SkipDeps(), + SkipRepos: c.SkipRefresh() || c.SkipDeps(), + SkipRefresh: c.SkipRefresh(), SkipDeps: c.SkipDeps(), Concurrency: c.Concurrency(), }, func() []error { @@ -1021,14 +991,14 @@ func printBatches(batches [][]state.Release) string { w.Init(buf, 0, 1, 1, ' ', 0) - fmt.Fprintln(w, "GROUP\tRELEASES") + _, _ = fmt.Fprintln(w, "GROUP\tRELEASES") for i, batch := range batches { ids := []string{} for _, r := range batch { ids = append(ids, state.ReleaseToID(&r.ReleaseSpec)) } - fmt.Fprintf(w, "%d\t%s\n", i+1, strings.Join(ids, ", ")) + _, _ = fmt.Fprintf(w, "%d\t%s\n", i+1, strings.Join(ids, ", ")) } _ = w.Flush() @@ -1043,13 +1013,13 @@ func printDAG(batches [][]state.Release) string { w.Init(buf, 0, 1, 1, ' ', 0) - fmt.Fprintln(w, "GROUP\tRELEASE\tDEPENDENCIES") + _, _ = fmt.Fprintln(w, "GROUP\tRELEASE\tDEPENDENCIES") for i, batch := range batches { for _, r := range batch { id := state.ReleaseToID(&r.ReleaseSpec) - needs := r.ReleaseSpec.Needs - fmt.Fprintf(w, "%d\t%s\t%s\n", i+1, id, strings.Join(needs, ", ")) + needs := r.Needs + _, _ = fmt.Fprintf(w, "%d\t%s\t%s\n", i+1, id, strings.Join(needs, ", ")) } } @@ -1149,13 +1119,17 @@ func (a *App) visitStatesWithSelectorsAndRemoteSupport(fileOrDir string, converg } } - // pre-overrides HelmState + // pre-handles HelmState fHelmStatsWithOverrides := func(st *state.HelmState) (bool, []error) { var err error + // override release settings st.Releases, err = st.GetReleasesWithOverrides() if err != nil { return false, []error{err} } + + // override release labels + st.Releases = st.GetReleasesWithLabels() return f(st) } @@ -1258,16 +1232,6 @@ func (a *App) findDesiredStateFiles(specifiedPath string, opts LoadOpts) ([]stri case a.fs.FileExistsAt(DefaultGotmplHelmfile): defaultFile = DefaultGotmplHelmfile - - // TODO: Remove this block when we remove v0 code - case !runtime.V1Mode && a.fs.FileExistsAt(DeprecatedHelmfile): - a.Logger.Warnf( - "warn: %s is being loaded: %s is deprecated in favor of %s. See https://github.com/roboll/helmfile/issues/25 for more information", - DeprecatedHelmfile, - DeprecatedHelmfile, - DefaultHelmfile, - ) - defaultFile = DeprecatedHelmfile } switch { @@ -1322,7 +1286,6 @@ func (a *App) getSelectedReleases(r *Run, includeTransitiveNeeds bool) ([]state. selectedIds := map[string]state.ReleaseSpec{} selectedCounts := map[string]int{} for _, r := range selected { - r := r id := state.ReleaseToID(&r) selectedIds[id] = r selectedCounts[id]++ @@ -1336,7 +1299,6 @@ func (a *App) getSelectedReleases(r *Run, includeTransitiveNeeds bool) ([]state. groupsByID := map[string][]*state.ReleaseSpec{} for _, r := range allReleases { - r := r groupsByID[state.ReleaseToID(&r)] = append(groupsByID[state.ReleaseToID(&r)], &r) } @@ -1432,13 +1394,14 @@ func (a *App) apply(r *Run, c ApplyConfigProvider) (bool, bool, []error) { Context: c.Context(), Output: c.DiffOutput(), Set: c.Set(), - SkipCleanup: c.RetainValuesFiles() || c.SkipCleanup(), + SkipCleanup: c.SkipCleanup(), SkipDiffOnInstall: c.SkipDiffOnInstall(), ReuseValues: c.ReuseValues(), ResetValues: c.ResetValues(), DiffArgs: c.DiffArgs(), PostRenderer: c.PostRenderer(), PostRendererArgs: c.PostRendererArgs(), + SkipSchemaValidation: c.SkipSchemaValidation(), SuppressOutputLineRegex: c.SuppressOutputLineRegex(), } @@ -1542,17 +1505,21 @@ Do you really want to apply? subst.Releases = rs syncOpts := &state.SyncOpts{ - Set: c.Set(), - SkipCleanup: c.RetainValuesFiles() || c.SkipCleanup(), - SkipCRDs: c.SkipCRDs(), - Wait: c.Wait(), - WaitForJobs: c.WaitForJobs(), - ReuseValues: c.ReuseValues(), - ResetValues: c.ResetValues(), - PostRenderer: c.PostRenderer(), - PostRendererArgs: c.PostRendererArgs(), - SyncArgs: c.SyncArgs(), - HideNotes: c.HideNotes(), + Set: c.Set(), + SkipCleanup: c.SkipCleanup(), + SkipCRDs: c.SkipCRDs(), + Wait: c.Wait(), + WaitRetries: c.WaitRetries(), + WaitForJobs: c.WaitForJobs(), + ReuseValues: c.ReuseValues(), + ResetValues: c.ResetValues(), + PostRenderer: c.PostRenderer(), + PostRendererArgs: c.PostRendererArgs(), + SkipSchemaValidation: c.SkipSchemaValidation(), + SyncArgs: c.SyncArgs(), + HideNotes: c.HideNotes(), + TakeOwnership: c.TakeOwnership(), + SyncReleaseLabels: c.SyncReleaseLabels(), } return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), syncOpts) })) @@ -1678,6 +1645,7 @@ func (a *App) diff(r *Run, c DiffConfigProvider) (*string, bool, bool, []error) ResetValues: c.ResetValues(), PostRenderer: c.PostRenderer(), PostRendererArgs: c.PostRendererArgs(), + SkipSchemaValidation: c.SkipSchemaValidation(), SuppressOutputLineRegex: c.SuppressOutputLineRegex(), } @@ -1937,16 +1905,20 @@ Do you really want to sync? subst.Releases = rs opts := &state.SyncOpts{ - Set: c.Set(), - SkipCRDs: c.SkipCRDs(), - Wait: c.Wait(), - WaitForJobs: c.WaitForJobs(), - ReuseValues: c.ReuseValues(), - ResetValues: c.ResetValues(), - PostRenderer: c.PostRenderer(), - PostRendererArgs: c.PostRendererArgs(), - SyncArgs: c.SyncArgs(), - HideNotes: c.HideNotes(), + Set: c.Set(), + SkipCRDs: c.SkipCRDs(), + Wait: c.Wait(), + WaitRetries: c.WaitRetries(), + WaitForJobs: c.WaitForJobs(), + ReuseValues: c.ReuseValues(), + ResetValues: c.ResetValues(), + PostRenderer: c.PostRenderer(), + PostRendererArgs: c.PostRendererArgs(), + SyncArgs: c.SyncArgs(), + HideNotes: c.HideNotes(), + TakeOwnership: c.TakeOwnership(), + SkipSchemaValidation: c.SkipSchemaValidation(), + SyncReleaseLabels: c.SyncReleaseLabels(), } return subst.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency(), opts) })) @@ -1974,15 +1946,17 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) { } opts := &state.TemplateOpts{ - Set: c.Set(), - IncludeCRDs: c.IncludeCRDs(), - OutputDirTemplate: c.OutputDirTemplate(), - SkipCleanup: c.SkipCleanup(), - SkipTests: c.SkipTests(), - PostRenderer: c.PostRenderer(), - PostRendererArgs: c.PostRendererArgs(), - KubeVersion: c.KubeVersion(), - ShowOnly: c.ShowOnly(), + Set: c.Set(), + IncludeCRDs: c.IncludeCRDs(), + NoHooks: c.NoHooks(), + OutputDirTemplate: c.OutputDirTemplate(), + SkipCleanup: c.SkipCleanup(), + SkipTests: c.SkipTests(), + PostRenderer: c.PostRenderer(), + PostRendererArgs: c.PostRendererArgs(), + KubeVersion: c.KubeVersion(), + ShowOnly: c.ShowOnly(), + SkipSchemaValidation: c.SkipSchemaValidation(), } return st.TemplateReleases(helm, c.OutputDir(), c.Values(), args, c.Concurrency(), c.Validate(), opts) }) diff --git a/pkg/app/app_apply_hooks_test.go b/pkg/app/app_apply_hooks_test.go index 71aff79c..c385b157 100644 --- a/pkg/app/app_apply_hooks_test.go +++ b/pkg/app/app_apply_hooks_test.go @@ -161,7 +161,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -192,7 +192,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -223,7 +223,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -252,7 +252,7 @@ releases: }, selectors: []string{"app=test"}, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: nil, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: nil, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -299,8 +299,8 @@ releases: {Name: "bar"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -346,7 +346,7 @@ releases: {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -396,7 +396,7 @@ bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -444,7 +444,7 @@ foo 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 default {Name: "foo"}, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, error: "", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result diff --git a/pkg/app/app_apply_nokubectx_test.go b/pkg/app/app_apply_nokubectx_test.go index 437a467c..c844fcde 100644 --- a/pkg/app/app_apply_nokubectx_test.go +++ b/pkg/app/app_apply_nokubectx_test.go @@ -146,7 +146,7 @@ func TestApply_3(t *testing.T) { skipNeeds: true, }, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -177,8 +177,8 @@ releases: {Name: "my-release", Flags: []string{"--namespace", "default"}}, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -199,7 +199,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def skipNeeds: true, }, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -234,8 +234,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: nil, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -250,7 +250,7 @@ releases: }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -278,9 +278,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespace kube-system --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespace kube-system --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -306,7 +306,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -334,9 +334,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespace kube-system --detailed-exitcode --reset-values"}: nil, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--namespace kube-system --reset-values --detailed-exitcode"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^external-secrets$", Flags: listFlags("default", "")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -359,7 +359,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -399,8 +399,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -415,7 +415,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -453,8 +453,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -464,7 +464,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def t.Run("bad --selector", func(t *testing.T) { check(t, testcase{ files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -494,72 +494,6 @@ releases: error: "err: no releases found that matches specified selector(app=test_non_existent) and environment(default), in any helmfile", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -merged environment: &{default map[] map[]} -0 release(s) matching app=test_non_existent found in helmfile.yaml - -changing working directory back to "/path/to" -`, }) }) } diff --git a/pkg/app/app_apply_test.go b/pkg/app/app_apply_test.go index 057cd683..8f60aa49 100644 --- a/pkg/app/app_apply_test.go +++ b/pkg/app/app_apply_test.go @@ -146,7 +146,7 @@ func TestApply_2(t *testing.T) { skipNeeds: true, }, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -177,8 +177,8 @@ releases: {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -199,7 +199,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def skipNeeds: true, }, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -234,8 +234,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: nil, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -250,7 +250,7 @@ releases: }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -278,9 +278,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace kube-system --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace kube-system --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^kubernetes-external-secrets$", Flags: listFlags("kube-system", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -306,7 +306,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -334,9 +334,9 @@ releases: selectors: []string{"app=test"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace kube-system --detailed-exitcode --reset-values"}: nil, - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "kubernetes-external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace kube-system --reset-values --detailed-exitcode"}: nil, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^external-secrets$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -359,7 +359,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -399,8 +399,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -415,7 +415,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -453,8 +453,8 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def `, }, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, @@ -470,7 +470,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -494,9 +494,9 @@ releases: selectors: []string{"name=serviceA"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "serviceA", Chart: "my/chart", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "serviceB", Chart: "my/chart", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "serviceC", Chart: "my/chart", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "serviceA", Chart: "my/chart", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "serviceB", Chart: "my/chart", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "serviceC", Chart: "my/chart", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^serviceA$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -517,7 +517,7 @@ serviceC 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 def t.Run("bad --selector", func(t *testing.T) { check(t, testcase{ files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -547,72 +547,6 @@ releases: error: "err: no releases found that matches specified selector(app=test_non_existent) and environment(default), in any helmfile", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -merged environment: &{default map[] map[]} -0 release(s) matching app=test_non_existent found in helmfile.yaml - -changing working directory back to "/path/to" -`, }) }) @@ -641,7 +575,7 @@ releases: selectors: []string{"index=1"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -707,7 +641,7 @@ releases: selectors: []string{"name=foo"}, upgraded: []exectest.Release{}, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("default", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE diff --git a/pkg/app/app_diff_test.go b/pkg/app/app_diff_test.go index ccf499f5..d9f7b691 100644 --- a/pkg/app/app_diff_test.go +++ b/pkg/app/app_diff_test.go @@ -280,8 +280,8 @@ releases: }, selectors: []string{"app=test"}, diffed: []exectest.Release{ - {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--no-hooks", "--reset-values"}}, - {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--no-hooks", "--reset-values"}}, + {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values", "--no-hooks"}}, + {Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values", "--no-hooks"}}, }, }) }) diff --git a/pkg/app/app_list_test.go b/pkg/app/app_list_test.go index 38f4afe5..d7775a83 100644 --- a/pkg/app/app_list_test.go +++ b/pkg/app/app_list_test.go @@ -159,17 +159,17 @@ releases: t.Run("default environment includes all releases", func(t *testing.T) { check(t, testcase{ environment: "default", - expected: `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION -logging kube-system true true incubator/raw -kubernetes-external-secrets kube-system true true incubator/raw -external-secrets default true true app:test incubator/raw -my-release default true true app:test incubator/raw -disabled kube-system true false incubator/raw -test2 true true incubator/raw -test3 true true incubator/raw -cache my-app true true app:test bitnami/redis 17.0.7 -database my-app true true bitnami/postgres 11.6.22 -global kube-system true true incubator/raw + expected: `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION +logging kube-system true true chart:raw,name:logging,namespace:kube-system incubator/raw +kubernetes-external-secrets kube-system true true chart:raw,name:kubernetes-external-secrets,namespace:kube-system incubator/raw +external-secrets default true true app:test,chart:raw,name:external-secrets,namespace:default incubator/raw +my-release default true true app:test,chart:raw,name:my-release,namespace:default incubator/raw +disabled kube-system true false chart:raw,name:disabled,namespace:kube-system incubator/raw +test2 true true chart:raw,name:test2,namespace: incubator/raw +test3 true true chart:raw,name:test3,namespace: incubator/raw +cache my-app true true app:test,chart:redis,name:cache,namespace:my-app bitnami/redis 17.0.7 +database my-app true true chart:postgres,name:database,namespace:my-app bitnami/postgres 11.6.22 +global kube-system true true chart:raw,name:global,namespace:kube-system incubator/raw `, }, cfg) }) @@ -195,9 +195,9 @@ my-release default true true app:test,chart:raw,name:my-release, t.Run("filters releases for environment used in one file only", func(t *testing.T) { check(t, testcase{ environment: "test", - expected: `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION -cache my-app true true app:test bitnami/redis 17.0.7 -database my-app true true bitnami/postgres 11.6.22 + expected: `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION +cache my-app true true app:test,chart:redis,name:cache,namespace:my-app bitnami/redis 17.0.7 +database my-app true true chart:postgres,name:database,namespace:my-app bitnami/postgres 11.6.22 `, }, cfg) }) @@ -206,16 +206,16 @@ database my-app true true bitnami/postgres 11.6.22 check(t, testcase{ environment: "shared", // 'global' release has no environments, so is still excluded - expected: `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION -logging kube-system true true incubator/raw -kubernetes-external-secrets kube-system true true incubator/raw -external-secrets default true true app:test incubator/raw -my-release default true true app:test incubator/raw -disabled kube-system true false incubator/raw -test2 true true incubator/raw -test3 true true incubator/raw -cache my-app true true app:test bitnami/redis 17.0.7 -database my-app true true bitnami/postgres 11.6.22 + expected: `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION +logging kube-system true true chart:raw,name:logging,namespace:kube-system incubator/raw +kubernetes-external-secrets kube-system true true chart:raw,name:kubernetes-external-secrets,namespace:kube-system incubator/raw +external-secrets default true true app:test,chart:raw,name:external-secrets,namespace:default incubator/raw +my-release default true true app:test,chart:raw,name:my-release,namespace:default incubator/raw +disabled kube-system true false chart:raw,name:disabled,namespace:kube-system incubator/raw +test2 true true chart:raw,name:test2,namespace: incubator/raw +test3 true true chart:raw,name:test3,namespace: incubator/raw +cache my-app true true app:test,chart:redis,name:cache,namespace:my-app bitnami/redis 17.0.7 +database my-app true true chart:postgres,name:database,namespace:my-app bitnami/postgres 11.6.22 `, }, cfg) }) @@ -240,6 +240,7 @@ environments: values: - myrelease2: enabled: false +--- releases: - name: myrelease1 chart: mychart1 @@ -284,7 +285,7 @@ releases: }) assert.NoError(t, err) - expected := `[{"name":"myrelease1","namespace":"testNamespace","enabled":true,"installed":false,"labels":"id:myrelease1","chart":"mychart1","version":""},{"name":"myrelease2","namespace":"testNamespace","enabled":false,"installed":true,"labels":"","chart":"mychart1","version":""},{"name":"myrelease3","namespace":"testNamespace","enabled":true,"installed":true,"labels":"","chart":"mychart1","version":""},{"name":"myrelease4","namespace":"testNamespace","enabled":true,"installed":true,"labels":"id:myrelease1","chart":"mychart1","version":""}] + expected := `[{"name":"myrelease1","namespace":"testNamespace","enabled":true,"installed":false,"labels":"chart:mychart1,id:myrelease1,name:myrelease1,namespace:testNamespace","chart":"mychart1","version":""},{"name":"myrelease2","namespace":"testNamespace","enabled":false,"installed":true,"labels":"chart:mychart1,name:myrelease2,namespace:testNamespace","chart":"mychart1","version":""},{"name":"myrelease3","namespace":"testNamespace","enabled":true,"installed":true,"labels":"chart:mychart1,name:myrelease3,namespace:testNamespace","chart":"mychart1","version":""},{"name":"myrelease4","namespace":"testNamespace","enabled":true,"installed":true,"labels":"chart:mychart1,id:myrelease1,name:myrelease4,namespace:testNamespace","chart":"mychart1","version":""}] ` assert.Equal(t, expected, out) } diff --git a/pkg/app/app_sync_test.go b/pkg/app/app_sync_test.go index b138f2fb..5115db1c 100644 --- a/pkg/app/app_sync_test.go +++ b/pkg/app/app_sync_test.go @@ -142,7 +142,7 @@ func TestSync(t *testing.T) { skipNeeds: true, }, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -191,7 +191,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def skipNeeds: true, }, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -249,7 +249,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -300,7 +300,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -348,7 +348,7 @@ serviceA 4 Fri Nov 1 08:40:07 2019 DEPLOYED chart-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -401,7 +401,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def }, error: ``, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -447,7 +447,7 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def t.Run("bad --selector", func(t *testing.T) { check(t, testcase{ files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: diff --git a/pkg/app/app_template_test.go b/pkg/app/app_template_test.go index cf09a932..e42122e1 100644 --- a/pkg/app/app_template_test.go +++ b/pkg/app/app_template_test.go @@ -24,6 +24,7 @@ func TestTemplate(t *testing.T) { skipNeeds bool includeNeeds bool includeTransitiveNeeds bool + noHooks bool showOnly []string } @@ -133,6 +134,7 @@ releases: includeNeeds: tc.fields.includeNeeds, includeTransitiveNeeds: tc.fields.includeTransitiveNeeds, showOnly: tc.fields.showOnly, + noHooks: tc.fields.noHooks, }) var gotErr string @@ -236,7 +238,7 @@ releases: }, selectors: []string{"name=test2"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string{}}, + {Name: "test2"}, }, }) }) @@ -249,8 +251,8 @@ releases: }, selectors: []string{"name=test3"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string{}}, - {Name: "test3", Flags: []string{}}, + {Name: "test2"}, + {Name: "test3"}, }, }) }) @@ -264,8 +266,8 @@ releases: }, selectors: []string{"name=test3"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string{}}, - {Name: "test3", Flags: []string{}}, + {Name: "test2"}, + {Name: "test3"}, }, }) }) @@ -279,7 +281,7 @@ releases: }, selectors: []string{"name=test2"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string{}}, + {Name: "test2"}, }, }) }) @@ -293,8 +295,22 @@ releases: }, selectors: []string{"name=test3"}, templated: []exectest.Release{ - {Name: "test2", Flags: []string{}}, - {Name: "test3", Flags: []string{}}, + {Name: "test2"}, + {Name: "test3"}, + }, + }) + }) + + t.Run("no-hooks", func(t *testing.T) { + check(t, testcase{ + fields: fields{ + skipNeeds: true, + noHooks: true, + }, + selectors: []string{"app=test"}, + templated: []exectest.Release{ + {Name: "external-secrets", Flags: []string{"--namespace", "default", "--no-hooks"}}, + {Name: "my-release", Flags: []string{"--namespace", "default", "--no-hooks"}}, }, }) }) @@ -398,19 +414,19 @@ releases: t.Run("fail due to unknown field with goccy/go-yaml", func(t *testing.T) { check(t, testcase{ goccyGoYaml: true, - error: `in ./helmfile.yaml: failed to read helmfile.yaml: reading document at index 1: [4:3] unknown field "foobar" - 2 | releases: - 3 | - name: app1 - > 4 | foobar: FOOBAR - ^ - 5 | chart: incubator/raw`, + error: `in ./helmfile.yaml: failed to read helmfile.yaml: reading document at index 1. Started seeing this since Helmfile v1? Add the .gotmpl file extension: [4:3] unknown field "foobar" + 2 | releases: + 3 | - name: app1 +> 4 | foobar: FOOBAR + ^ + 5 | chart: incubator/raw`, }) }) t.Run("fail due to unknown field with gopkg.in/yaml.v2", func(t *testing.T) { check(t, testcase{ goccyGoYaml: false, - error: `in ./helmfile.yaml: failed to read helmfile.yaml: reading document at index 1: yaml: unmarshal errors: + error: `in ./helmfile.yaml: failed to read helmfile.yaml: reading document at index 1. Started seeing this since Helmfile v1? Add the .gotmpl file extension: yaml: unmarshal errors: line 4: field foobar not found in type state.ReleaseSpec`, }) }) diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index 50770c2c..435ed7cf 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -135,6 +135,7 @@ environments: default: values: - env.*.yaml +--- releases: - name: zipkin chart: stable/zipkin @@ -170,7 +171,7 @@ BAZ: 4 t.Errorf("unexpected error: %v", err) } - expectedOrder := []string{"helmfile.yaml", "/path/to/env.1.yaml", "/path/to/env.2.yaml", "/path/to/env.1.yaml", "/path/to/env.2.yaml"} + expectedOrder := []string{"helmfile.yaml", "/path/to/env.1.yaml", "/path/to/env.2.yaml"} actualOrder := fs.SuccessfulReads() if !reflect.DeepEqual(actualOrder, expectedOrder) { t.Errorf("unexpected order of processed state files: expected=%v, actual=%v", expectedOrder, actualOrder) @@ -184,6 +185,7 @@ environments: default: values: - env.*.yaml +--- releases: - name: zipkin chart: stable/zipkin @@ -230,6 +232,7 @@ bases: - base.yaml environments: test: +--- releases: - name: zipkin chart: stable/zipkin @@ -281,6 +284,7 @@ environments: missingFileHandler: %s values: - %s +--- releases: - name: zipkin chart: stable/zipkin @@ -393,7 +397,7 @@ helmfiles: "/path/to/helmfile.d/a1.yaml": ` environments: prod: - +--- releases: - name: zipkin chart: stable/zipkin @@ -799,41 +803,44 @@ func runFilterSubHelmFilesTests(testcases []struct { func TestVisitDesiredStatesWithReleasesFiltered_EmbeddedNestedStateAdditionalEnvValues(t *testing.T) { files := map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` helmfiles: -- path: helmfile.d/a*.yaml +- path: helmfile.d/a*.yaml.gotmpl values: - env.values.yaml -- helmfile.d/b*.yaml -- path: helmfile.d/c*.yaml +- helmfile.d/b*.yaml.gotmpl +- path: helmfile.d/c*.yaml.gotmpl values: - env.values.yaml `, - "/path/to/helmfile.d/a1.yaml": ` + "/path/to/helmfile.d/a1.yaml.gotmpl": ` environments: default: values: - ns: INLINE_NS +--- releases: - name: foo chart: stable/zipkin namespace: {{ .Environment.Values.ns }} `, - "/path/to/helmfile.d/b.yaml": ` + "/path/to/helmfile.d/b.yaml.gotmpl": ` environments: default: values: - ns: INLINE_NS +--- releases: - name: bar chart: stable/grafana namespace: {{ .Environment.Values.ns }} `, - "/path/to/helmfile.d/c.yaml": ` + "/path/to/helmfile.d/c.yaml.gotmpl": ` environments: default: values: - ns: INLINE_NS +--- releases: - name: baz chart: stable/envoy @@ -851,7 +858,7 @@ ns: INLINE_NS Namespace: "", Selectors: []string{}, Env: "default", - FileOrDir: "/path/to/helmfile.yaml", + FileOrDir: "/path/to/helmfile.yaml.gotmpl", }, files) expectNoCallsToHelm(app) @@ -977,7 +984,7 @@ releases: func TestVisitDesiredStatesWithReleasesFiltered_EnvironmentValueOverrides(t *testing.T) { files := map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` environments: default: values: @@ -1021,7 +1028,7 @@ bar: "bar1" Env: "default", ValuesFiles: []string{"overrides.yaml"}, Set: map[string]any{"bar": "bar2", "baz": "baz1"}, - FileOrDir: "helmfile.yaml", + FileOrDir: "helmfile.yaml.gotmpl", }, files) expectNoCallsToHelm(app) @@ -1075,7 +1082,7 @@ func TestVisitDesiredStatesWithReleasesFiltered_StateValueOverrides(t *testing.T testcase := testcases[i] t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { files := map[string]string{ - "/path/to/helmfile.yaml": fmt.Sprintf(` + "/path/to/helmfile.yaml.gotmpl": fmt.Sprintf(` # The top-level "values" are "base" values has inherited to state values with the lowest priority. # The lowest priority results in environment-specific values to override values defined in the base. values: @@ -1142,7 +1149,7 @@ x: Env: testcase.env, ValuesFiles: []string{"overrides.yaml"}, Set: map[string]any{"x": map[string]any{"hoge": "hoge_set", "fuga": "fuga_set"}}, - FileOrDir: "helmfile.yaml", + FileOrDir: "helmfile.yaml.gotmpl", }, files) expectNoCallsToHelm(app) @@ -1442,7 +1449,7 @@ func TestLoadDesiredStateFromYaml_DuplicateReleaseName(t *testing.T) { } func TestLoadDesiredStateFromYaml_Bases(t *testing.T) { - yamlFile := "/path/to/yaml/file" + yamlFile := "/path/to/yaml/file.gotmpl" yamlContent := `bases: - ../base.yaml - ../base.gotmpl @@ -1513,7 +1520,7 @@ helmDefaults: } func TestLoadDesiredStateFromYaml_MultiPartTemplate(t *testing.T) { - yamlFile := "/path/to/yaml/file" + yamlFile := "/path/to/yaml/file.gotmpl" yamlContent := `bases: - ../base.yaml --- @@ -1719,7 +1726,7 @@ foo: FOO } func TestLoadDesiredStateFromYaml_MultiPartTemplate_WithNonDefaultEnv(t *testing.T) { - yamlFile := "/path/to/yaml/file" + yamlFile := "/path/to/yaml/file.gotmpl" yamlContent := `bases: - ../base.yaml --- @@ -1810,7 +1817,7 @@ helmDefaults: } func TestLoadDesiredStateFromYaml_MultiPartTemplate_WithReverse(t *testing.T) { - yamlFile := "/path/to/yaml/file" + yamlFile := "/path/to/yaml/file.gotmpl" yamlContent := ` {{ readFile "templates.yaml" }} @@ -1868,7 +1875,7 @@ releases: // See https://github.com/roboll/helmfile/issues/615 func TestLoadDesiredStateFromYaml_MultiPartTemplate_NoMergeArrayInEnvVal(t *testing.T) { - statePath := "/path/to/helmfile.yaml" + statePath := "/path/to/helmfile.yaml.gotmpl" stateContent := ` environments: default: @@ -1933,7 +1940,7 @@ func TestLoadDesiredStateFromYaml_MultiPartTemplate_MergeMapsVariousKeys(t *test } for i := range testcases { tc := testcases[i] - statePath := "/path/to/helmfile.yaml" + statePath := "/path/to/helmfile.yaml.gotmpl" stateContent := ` environments: default: @@ -2050,7 +2057,7 @@ releases: } for i := range testcases { tc := testcases[i] - statePath := "/path/to/helmfile.yaml" + statePath := "/path/to/helmfile.yaml.gotmpl" stateContent := fmt.Sprintf(tc.state, tc.expr) testFs := testhelper.NewTestFs(map[string]string{ statePath: stateContent, @@ -2085,14 +2092,17 @@ services: } type configImpl struct { - selectors []string - set []string - output string - includeCRDs bool - skipCleanup bool - skipCRDs bool - skipDeps bool - skipTests bool + selectors []string + set []string + output string + noHooks bool + includeCRDs bool + skipCleanup bool + skipCRDs bool + skipDeps bool + skipTests bool + skipSchemaValidation bool + skipRefresh bool skipNeeds bool includeNeeds bool @@ -2133,6 +2143,10 @@ func (c configImpl) SkipDeps() bool { return c.skipDeps } +func (c configImpl) SkipRefresh() bool { + return c.skipRefresh +} + func (c configImpl) SkipNeeds() bool { return c.skipNeeds } @@ -2161,6 +2175,10 @@ func (c configImpl) IncludeCRDs() bool { return c.includeCRDs } +func (c configImpl) NoHooks() bool { + return c.noHooks +} + func (c configImpl) Concurrency() int { return 1 } @@ -2189,6 +2207,10 @@ func (c configImpl) KubeVersion() string { return c.kubeVersion } +func (c configImpl) SkipSchemaValidation() bool { + return c.skipSchemaValidation +} + func (c configImpl) ShowOnly() []string { return nil } @@ -2198,14 +2220,12 @@ type applyConfig struct { cascade string values []string - // TODO: Remove this function once Helmfile v0.x - retainValuesFiles bool - set []string validate bool skipCleanup bool skipCRDs bool skipDeps bool + skipRefresh bool skipNeeds bool includeNeeds bool includeTransitiveNeeds bool @@ -2228,14 +2248,18 @@ type applyConfig struct { diffArgs string logger *zap.SugaredLogger wait bool + waitRetries int waitForJobs bool reuseValues bool postRenderer string postRendererArgs []string + skipSchemaValidation bool kubeVersion string suppressOutputLineRegex []string showOnly []string hideNotes bool + takeOwnership bool + syncReleaseLabels bool // template-only options includeCRDs, skipTests bool @@ -2254,6 +2278,10 @@ func (a applyConfig) Wait() bool { return a.wait } +func (a applyConfig) WaitRetries() int { + return a.waitRetries +} + func (a applyConfig) WaitForJobs() bool { return a.waitForJobs } @@ -2282,6 +2310,10 @@ func (a applyConfig) SkipDeps() bool { return a.skipDeps } +func (a applyConfig) SkipRefresh() bool { + return a.skipRefresh +} + func (a applyConfig) SkipNeeds() bool { return a.skipNeeds } @@ -2354,11 +2386,6 @@ func (a applyConfig) Logger() *zap.SugaredLogger { return a.logger } -// TODO: Remove this function once Helmfile v0.x -func (a applyConfig) RetainValuesFiles() bool { - return a.retainValuesFiles -} - func (a applyConfig) SkipDiffOnInstall() bool { return a.skipDiffOnInstall } @@ -2372,7 +2399,6 @@ func (a applyConfig) DiffArgs() string { } // helmfile-template-only flags - func (a applyConfig) IncludeCRDs() bool { return a.includeCRDs } @@ -2412,6 +2438,10 @@ func (a applyConfig) KubeVersion() string { return a.kubeVersion } +func (a applyConfig) SkipSchemaValidation() bool { + return a.skipSchemaValidation +} + func (a applyConfig) ShowOnly() []string { return a.showOnly } @@ -2420,6 +2450,14 @@ func (a applyConfig) HideNotes() bool { return a.hideNotes } +func (a applyConfig) TakeOwnership() bool { + return a.takeOwnership +} + +func (a applyConfig) SyncReleaseLabels() bool { + return a.syncReleaseLabels +} + type depsConfig struct { skipRepos bool includeTransitiveNeeds bool @@ -2754,8 +2792,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: nil, - {Name: "foo_notFound", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: nil, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: nil, + {Name: "foo_notFound", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: nil, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -2827,16 +2865,16 @@ releases: }, diffs: map[exectest.DiffKey]error{ // noop on frontend-v2 - {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: nil, + {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: nil, // install frontend-v3 - {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, // upgrades - {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "database", Chart: "charts/mysql", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "database", Chart: "charts/mysql", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 @@ -2902,7 +2940,7 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: nil, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: nil, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: ``, @@ -2933,9 +2971,9 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{ @@ -2969,9 +3007,9 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--disable-validation --kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation --kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--disable-validation --kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation --kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: ``, @@ -3014,8 +3052,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation --kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "stable/mychart3", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--disable-validation --kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: ``, @@ -3052,8 +3090,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{}}, @@ -3075,8 +3113,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{}}, @@ -3099,8 +3137,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{}}, @@ -3123,8 +3161,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{}}, @@ -3148,8 +3186,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, @@ -3173,14 +3211,43 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "foo", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns2"}}, }, }, + { + name: "upgrade when ns1/foo needs ns1/bar and ns2/bar is disabled", + loc: location(), + files: map[string]string{ + "/path/to/helmfile.yaml": ` +releases: +- name: bar + chart: stable/mychart2 + namespace: ns1 +- name: bar + chart: stable/mychart2 + namespace: ns2 + installed: false +- name: foo + chart: stable/mychart1 + namespace: ns1 + needs: + - ns1/bar +`, + }, + diffs: map[exectest.DiffKey]error{ + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + }, + upgraded: []exectest.Release{ + {Name: "bar", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, + {Name: "foo", Flags: []string{"--kube-context", "default", "--namespace", "ns1"}}, + }, + }, // // deletes: deleting all releases in the correct order // @@ -3201,8 +3268,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -3234,8 +3301,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -3269,8 +3336,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -3303,8 +3370,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -3337,8 +3404,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -3371,8 +3438,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "stable/mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "stable/mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -3400,7 +3467,7 @@ bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 defau skipNeeds: true, }, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -3427,8 +3494,8 @@ releases: }, selectors: []string{"app=test"}, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{ {Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}}, @@ -3453,9 +3520,9 @@ my-release 4 Fri Nov 1 08:40:07 2019 DEPLOYED raw-3.1.0 3.1.0 def skipNeeds: false, includeNeeds: true, }, - error: `in ./helmfile.yaml: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, + error: `in ./helmfile.yaml.gotmpl: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -3482,8 +3549,8 @@ releases: }, selectors: []string{"app=test"}, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -3494,7 +3561,7 @@ releases: name: "upgrades with bad selector", loc: location(), files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -3546,8 +3613,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -3571,8 +3638,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -3600,8 +3667,8 @@ releases: `, }, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -3745,41 +3812,6 @@ releases: `, "/path/to/charts/example/Chart.yaml": `foo: FOO`, }, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: repositories: - 2: - name: bitnami - 3: url: https://charts.bitnami.com/bitnami/ - 4: releases: - 5: - name: example - 6: chart: /path/to/charts/example - 7: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: repositories: - 2: - name: bitnami - 3: url: https://charts.bitnami.com/bitnami/ - 4: releases: - 5: - name: example - 6: chart: /path/to/charts/example - 7: - -merged environment: &{default map[] map[]} -There are no repositories defined in your helmfile.yaml. -This means helmfile cannot update your dependencies or create a lock file. -See https://github.com/roboll/helmfile/issues/878 for more information. -changing working directory back to "/path/to" -`, charts: []string{"/path/to/charts/example"}, }, } @@ -3827,8 +3859,9 @@ changing working directory back to "/path/to" if tc.log != "" { actual := bs.String() - assert.Equal(t, tc.log, actual) + } else { + assertLogEqualsToSnapshot(t, bs.String()) } }) } @@ -3933,6 +3966,7 @@ environments: values: - myrelease2: enabled: false +--- releases: - name: myrelease1 chart: mychart1 @@ -3977,15 +4011,82 @@ releases: }) assert.NoError(t, err) - expected := `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION -myrelease1 testNamespace true false common:label,id:myrelease1 mychart1 -myrelease2 testNamespace false true common:label mychart1 -myrelease3 testNamespace true true mychart1 -myrelease4 testNamespace true true id:myrelease1 mychart1 + expected := `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION +myrelease1 testNamespace true false chart:mychart1,common:label,id:myrelease1,name:myrelease1,namespace:testNamespace mychart1 +myrelease2 testNamespace false true chart:mychart1,common:label,name:myrelease2,namespace:testNamespace mychart1 +myrelease3 testNamespace true true chart:mychart1,name:myrelease3,namespace:testNamespace mychart1 +myrelease4 testNamespace true true chart:mychart1,id:myrelease1,name:myrelease4,namespace:testNamespace mychart1 ` assert.Equal(t, expected, out) } +func testSetStringValuesTemplate(t *testing.T, goccyGoYaml bool) { + t.Helper() + + v := runtime.GoccyGoYaml + runtime.GoccyGoYaml = goccyGoYaml + t.Cleanup(func() { + runtime.GoccyGoYaml = v + }) + + files := map[string]string{ + "/path/to/helmfile.yaml.gotmpl": ` +releases: +- name: zipkin + chart: stable/zipkin + values: + - val2: "val2" + valuesTemplate: + - val1: '{{"{{ .Release.Name }}"}}' + setString: + - name: "name" + value: "val" +`, + } + expectedValues := []any{ + map[string]any{"val1": "zipkin"}, + map[string]any{"val2": "val2"}} + expectedSetValues := []state.SetValue{ + {Name: "name", Value: "val"}} + + app := appWithFs(&App{ + OverrideHelmBinary: DefaultHelmBinary, + OverrideKubeContext: "default", + Logger: newAppTestLogger(), + Env: "default", + FileOrDir: "helmfile.yaml.gotmpl", + }, files) + + expectNoCallsToHelm(app) + + var specs []state.ReleaseSpec + collectReleases := func(run *Run) (bool, []error) { + specs = append(specs, run.state.Releases...) + return false, nil + } + + err := app.ForEachState( + collectReleases, + false, + SetFilter(true), + ) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if len(specs) != 1 { + t.Fatalf("expected 1 release; got %d releases", len(specs)) + } + actualValues := specs[0].Values + actualSetStringValues := specs[0].SetStringValues + + if !reflect.DeepEqual(expectedValues, actualValues) { + t.Errorf("expected values: %v; got values: %v", expectedValues, actualValues) + } + if !reflect.DeepEqual(expectedSetValues, actualSetStringValues) { + t.Errorf("expected set-string: %v; got set: %v", expectedValues, actualValues) + } +} func testSetValuesTemplate(t *testing.T, goccyGoYaml bool) { t.Helper() @@ -3997,7 +4098,7 @@ func testSetValuesTemplate(t *testing.T, goccyGoYaml bool) { }) files := map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` releases: - name: zipkin chart: stable/zipkin @@ -4025,7 +4126,7 @@ releases: OverrideKubeContext: "default", Logger: newAppTestLogger(), Env: "default", - FileOrDir: "helmfile.yaml", + FileOrDir: "helmfile.yaml.gotmpl", }, files) expectNoCallsToHelm(app) @@ -4069,6 +4170,16 @@ func TestSetValuesTemplate(t *testing.T) { }) } +func TestSetStringValuesTemplate(t *testing.T) { + t.Run("with goccy/go-yaml", func(t *testing.T) { + testSetStringValuesTemplate(t, true) + }) + + t.Run("with gopkg.in/yaml.v2", func(t *testing.T) { + testSetStringValuesTemplate(t, false) + }) +} + func location() string { _, fn, line, _ := goruntime.Caller(1) return fmt.Sprintf("%s:%d", filepath.Base(fn), line) diff --git a/pkg/app/ask.go b/pkg/app/ask.go index ad3425d9..52161a1c 100644 --- a/pkg/app/ask.go +++ b/pkg/app/ask.go @@ -24,9 +24,10 @@ func AskForConfirmation(s string) bool { response = strings.ToLower(strings.TrimSpace(response)) - if response == "y" || response == "yes" { + switch response { + case "y", "yes": return true - } else if response == "n" || response == "no" { + case "n", "no": return false } } diff --git a/pkg/app/config.go b/pkg/app/config.go index 9d9b377b..34dff76d 100644 --- a/pkg/app/config.go +++ b/pkg/app/config.go @@ -10,6 +10,7 @@ type ConfigProvider interface { StripArgsValuesOnExitError() bool DisableForceUpdate() bool SkipDeps() bool + SkipRefresh() bool FileOrDir() string KubeContext() string @@ -24,15 +25,6 @@ type ConfigProvider interface { loggingConfig } -// TODO: Remove this function once Helmfile v0.x -type DeprecatedChartsConfigProvider interface { - Values() []string - - concurrencyConfig - loggingConfig - IncludeTransitiveNeeds() bool -} - type DepsConfigProvider interface { Args() string SkipRepos() bool @@ -50,15 +42,19 @@ type ApplyConfigProvider interface { Args() string PostRenderer() string PostRendererArgs() []string + SkipSchemaValidation() bool Cascade() string HideNotes() bool + TakeOwnership() bool SuppressOutputLineRegex() []string Values() []string Set() []string SkipCRDs() bool SkipDeps() bool + SkipRefresh() bool Wait() bool + WaitRetries() int WaitForJobs() bool IncludeTests() bool @@ -77,9 +73,6 @@ type ApplyConfigProvider interface { Context() int DiffOutput() string - // TODO: Remove this function once Helmfile v0.x - RetainValuesFiles() bool - Validate() bool SkipCleanup() bool SkipDiffOnInstall() bool @@ -87,6 +80,8 @@ type ApplyConfigProvider interface { DiffArgs() string SyncArgs() string + SyncReleaseLabels() bool + DAGConfig concurrencyConfig @@ -98,15 +93,19 @@ type ApplyConfigProvider interface { type SyncConfigProvider interface { Args() string PostRenderer() string + SkipSchemaValidation() bool PostRendererArgs() []string HideNotes() bool + TakeOwnership() bool Cascade() string Values() []string Set() []string SkipCRDs() bool SkipDeps() bool + SkipRefresh() bool Wait() bool + WaitRetries() int WaitForJobs() bool SyncArgs() string @@ -115,6 +114,9 @@ type SyncConfigProvider interface { SkipNeeds() bool IncludeNeeds() bool IncludeTransitiveNeeds() bool + + SyncReleaseLabels() bool + DAGConfig concurrencyConfig @@ -127,6 +129,7 @@ type DiffConfigProvider interface { Args() string PostRenderer() string PostRendererArgs() []string + SkipSchemaValidation() bool SuppressOutputLineRegex() []string Values() []string @@ -134,6 +137,7 @@ type DiffConfigProvider interface { Validate() bool SkipCRDs() bool SkipDeps() bool + SkipRefresh() bool IncludeTests() bool @@ -158,27 +162,12 @@ type DiffConfigProvider interface { valuesControlMode } -// TODO: Remove this function once Helmfile v0.x -type DeleteConfigProvider interface { - Args() string - Cascade() string - - Purge() bool - SkipDeps() bool - SkipCharts() bool - DeleteWait() bool - DeleteTimeout() int - - interactive - loggingConfig - concurrencyConfig -} - type DestroyConfigProvider interface { Args() string Cascade() string SkipDeps() bool + SkipRefresh() bool SkipCharts() bool DeleteWait() bool DeleteTimeout() int @@ -192,6 +181,7 @@ type TestConfigProvider interface { Args() string SkipDeps() bool + SkipRefresh() bool Timeout() int Cleanup() bool Logs() bool @@ -205,6 +195,7 @@ type LintConfigProvider interface { Values() []string Set() []string SkipDeps() bool + SkipRefresh() bool SkipCleanup() bool DAGConfig @@ -214,6 +205,7 @@ type LintConfigProvider interface { type FetchConfigProvider interface { SkipDeps() bool + SkipRefresh() bool OutputDir() string OutputDirTemplate() string @@ -224,16 +216,19 @@ type TemplateConfigProvider interface { Args() string PostRenderer() string PostRendererArgs() []string + SkipSchemaValidation() bool Values() []string Set() []string OutputDirTemplate() string Validate() bool SkipDeps() bool + SkipRefresh() bool SkipCleanup() bool SkipTests() bool OutputDir() string IncludeCRDs() bool + NoHooks() bool KubeVersion() string ShowOnly() []string @@ -253,6 +248,7 @@ type WriteValuesConfigProvider interface { Set() []string OutputFileTemplate() string SkipDeps() bool + SkipRefresh() bool SkipCleanup() bool IncludeTransitiveNeeds() bool diff --git a/pkg/app/constants.go b/pkg/app/constants.go index 63fd3af7..38d06ce0 100644 --- a/pkg/app/constants.go +++ b/pkg/app/constants.go @@ -8,10 +8,7 @@ import ( ) const ( - DefaultHelmfile = "helmfile.yaml" - // TODO: Remove this function once Helmfile v0.x - DeprecatedHelmfile = "charts.yaml" - + DefaultHelmfile = "helmfile.yaml" DefaultHelmfileDirectory = "helmfile.d" ExperimentalSelectorExplicit = "explicit-selector-inheritance" // value to remove default selector inheritance to sub-helmfiles and use the explicit one ) diff --git a/pkg/app/desired_state_file_loader.go b/pkg/app/desired_state_file_loader.go index a72d3e6d..90986023 100644 --- a/pkg/app/desired_state_file_loader.go +++ b/pkg/app/desired_state_file_loader.go @@ -15,7 +15,6 @@ import ( "github.com/helmfile/helmfile/pkg/helmexec" "github.com/helmfile/helmfile/pkg/policy" "github.com/helmfile/helmfile/pkg/remote" - "github.com/helmfile/helmfile/pkg/runtime" "github.com/helmfile/helmfile/pkg/state" ) @@ -162,21 +161,14 @@ func (a *desiredStateLoader) underlying() *state.StateCreator { func (a *desiredStateLoader) rawLoad(yaml []byte, baseDir, file string, evaluateBases bool, env, overrodeEnv *environment.Environment) (*state.HelmState, error) { var st *state.HelmState var err error - if runtime.V1Mode { - st, err = a.underlying().ParseAndLoad(yaml, baseDir, file, a.env, false, evaluateBases, env, overrodeEnv) - if err != nil { - return nil, err - } - } else { - merged, err := env.Merge(overrodeEnv) - if err != nil { - return nil, err - } + merged, err := env.Merge(overrodeEnv) + if err != nil { + return nil, err + } - st, err = a.underlying().ParseAndLoad(yaml, baseDir, file, a.env, false, evaluateBases, merged, nil) - if err != nil { - return nil, err - } + st, err = a.underlying().ParseAndLoad(yaml, baseDir, file, a.env, false, evaluateBases, merged, nil) + if err != nil { + return nil, err } helmfiles, err := st.ExpandedHelmfiles() if err != nil { @@ -207,7 +199,7 @@ func (ld *desiredStateLoader) load(env, overrodeEnv *environment.Environment, ba var rawContent []byte - if filepath.Ext(filename) == ".gotmpl" || !runtime.V1Mode { + if filepath.Ext(filename) == ".gotmpl" { var yamlBuf *bytes.Buffer var err error @@ -249,6 +241,14 @@ func (ld *desiredStateLoader) load(env, overrodeEnv *environment.Environment, ba finalState.RenderedValues = currentState.RenderedValues } + if len(finalState.HelmDefaults.PostRendererArgs) > 0 { + for i := range finalState.Releases { + if len(finalState.Releases[i].PostRendererArgs) == 0 { + finalState.Releases[i].PostRendererArgs = finalState.HelmDefaults.PostRendererArgs + } + } + finalState.HelmDefaults.PostRendererArgs = nil + } env = &finalState.Env ld.logger.Debugf("merged environment: %v", env) diff --git a/pkg/app/destroy_test.go b/pkg/app/destroy_test.go index 4f815469..4d578851 100644 --- a/pkg/app/destroy_test.go +++ b/pkg/app/destroy_test.go @@ -38,6 +38,7 @@ type destroyConfig struct { concurrency int interactive bool skipDeps bool + skipRefresh bool logger *zap.SugaredLogger includeTransitiveNeeds bool skipCharts bool @@ -73,6 +74,10 @@ func (d destroyConfig) SkipDeps() bool { return d.skipDeps } +func (d destroyConfig) SkipRefresh() bool { + return d.skipRefresh +} + func (d destroyConfig) IncludeTransitiveNeeds() bool { return d.includeTransitiveNeeds } diff --git a/pkg/app/diff_nokubectx_test.go b/pkg/app/diff_nokubectx_test.go index cd0239ad..e2dee162 100644 --- a/pkg/app/diff_nokubectx_test.go +++ b/pkg/app/diff_nokubectx_test.go @@ -104,16 +104,16 @@ releases: error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ // noop on frontend-v2 - {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--detailed-exitcode --reset-values"}: nil, + {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--reset-values --detailed-exitcode"}: nil, // install frontend-v3 - {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, // upgrades - {Name: "logging", Chart: "charts/fluent-bit", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "front-proxy", Chart: "stable/envoy", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "servicemesh", Chart: "charts/istio", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "database", Chart: "charts/mysql", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "backend-v2", Chart: "charts/backend", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "logging", Chart: "charts/fluent-bit", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "front-proxy", Chart: "stable/envoy", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "servicemesh", Chart: "charts/istio", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "database", Chart: "charts/mysql", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "backend-v2", Chart: "charts/backend", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 @@ -150,7 +150,7 @@ releases: detailedExitcode: true, error: "", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: nil, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: nil, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: ``, @@ -183,9 +183,9 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "baz", Chart: "mychart3", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -212,8 +212,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -234,8 +234,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -257,8 +257,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -280,8 +280,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -304,8 +304,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -328,8 +328,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -352,8 +352,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -381,8 +381,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -413,8 +413,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -447,8 +447,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -479,8 +479,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "foo" depends on "bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -514,8 +514,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -549,8 +549,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -581,8 +581,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "bar" depends on "foo" which does not match the selectors. Please add a selector like "--selector name=foo", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -613,8 +613,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: helmV3ListFlagsWithoutKubeContext}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -636,7 +636,7 @@ bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 defau loc: location(), flags: flags{skipNeeds: true}, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -664,8 +664,8 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -677,7 +677,7 @@ releases: loc: location(), flags: flags{skipNeeds: false}, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -705,87 +705,20 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - error: `in ./helmfile.yaml: release "default/external-secrets" depends on "kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml - -err: release "default/external-secrets" depends on "kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies -changing working directory back to "/path/to" -`, + error: `in ./helmfile.yaml.gotmpl: release "default/external-secrets" depends on "kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, }, { // see https://github.com/roboll/helmfile/issues/919#issuecomment-549831747 name: "upgrades with bad selector", loc: location(), files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -817,72 +750,6 @@ releases: error: "err: no releases found that matches specified selector(app=test_non_existent) and environment(default), in any helmfile", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -merged environment: &{default map[] map[]} -0 release(s) matching app=test_non_existent found in helmfile.yaml - -changing working directory back to "/path/to" -`, }, // // error cases @@ -904,54 +771,14 @@ releases: }, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "mychart3", Flags: "--namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, deleted: []exectest.Release{}, concurrency: 1, error: `in ./helmfile.yaml: release(s) "foo" depend(s) on an undefined release "bar". Perhaps you made a typo in "needs" or forgot defining a release named "bar" with appropriate "namespace" and "kubeContext"?`, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -merged environment: &{default map[] map[]} -WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs -2 release(s) found in helmfile.yaml - -err: release(s) "foo" depend(s) on an undefined release "bar". Perhaps you made a typo in "needs" or forgot defining a release named "bar" with appropriate "namespace" and "kubeContext"? -changing working directory back to "/path/to" -`, }, } diff --git a/pkg/app/diff_test.go b/pkg/app/diff_test.go index f33c04a6..2e60b3df 100644 --- a/pkg/app/diff_test.go +++ b/pkg/app/diff_test.go @@ -24,6 +24,7 @@ type diffConfig struct { validate bool skipCRDs bool skipDeps bool + skipRefresh bool includeTests bool skipNeeds bool includeNeeds bool @@ -42,6 +43,7 @@ type diffConfig struct { stripTrailingCR bool interactive bool skipDiffOnInstall bool + skipSchemaValidation bool reuseValues bool logger *zap.SugaredLogger } @@ -74,6 +76,10 @@ func (a diffConfig) SkipDeps() bool { return a.skipDeps } +func (a diffConfig) SkipRefresh() bool { + return a.skipRefresh +} + func (a diffConfig) IncludeTests() bool { return a.includeTests } @@ -170,6 +176,10 @@ func (a diffConfig) PostRendererArgs() []string { return nil } +func (a diffConfig) SkipSchemaValidation() bool { + return a.skipSchemaValidation +} + func (a diffConfig) SuppressOutputLineRegex() []string { return a.suppressOutputLineRegex } @@ -266,16 +276,16 @@ releases: error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ // noop on frontend-v2 - {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: nil, + {Name: "frontend-v2", Chart: "charts/frontend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: nil, // install frontend-v3 - {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "frontend-v3", Chart: "charts/frontend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, // upgrades - {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "database", Chart: "charts/mysql", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "logging", Chart: "charts/fluent-bit", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "front-proxy", Chart: "stable/envoy", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "servicemesh", Chart: "charts/istio", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "database", Chart: "charts/mysql", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "backend-v2", Chart: "charts/backend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "anotherbackend", Chart: "charts/anotherbackend", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ // delete frontend-v1 and backend-v1 @@ -312,7 +322,7 @@ releases: detailedExitcode: true, error: "", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: nil, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: nil, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: ``, @@ -345,9 +355,9 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "baz", Chart: "mychart3", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, @@ -374,8 +384,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -399,8 +409,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context hello/world --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context hello/world --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context hello/world --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context hello/world --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -426,8 +436,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "releaseB", Chart: "mychart2", Flags: "--kube-context arn:aws:eks:us-east-1:1234567890:cluster/myekscluster --namespace namespaceA --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "releaseA", Chart: "mychart1", Flags: "--kube-context arn:aws:eks:us-east-1:1234567890:cluster/myekscluster --namespace namespaceA --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "releaseB", Chart: "mychart2", Flags: "--kube-context arn:aws:eks:us-east-1:1234567890:cluster/myekscluster --namespace namespaceA --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "releaseA", Chart: "mychart1", Flags: "--kube-context arn:aws:eks:us-east-1:1234567890:cluster/myekscluster --namespace namespaceA --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -448,8 +458,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -471,8 +481,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -494,8 +504,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace testNamespace --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace testNamespace --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -518,8 +528,36 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + }, + upgraded: []exectest.Release{}, + }, + { + name: "upgrade when ns1/foo needs ns1/bar and ns2/bar is disabled", + loc: location(), + files: map[string]string{ + "/path/to/helmfile.yaml": ` +releases: +- name: bar + chart: mychart2 + namespace: ns1 +- name: bar + chart: mychart2 + namespace: ns2 + installed: false +- name: foo + chart: mychart1 + namespace: ns1 + needs: + - ns1/bar +`, + }, + detailedExitcode: true, + error: "Identified at least one change", + diffs: map[exectest.DiffKey]error{ + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -543,8 +581,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, }, @@ -567,8 +605,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns2 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --namespace ns2 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -596,8 +634,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -628,8 +666,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -662,8 +700,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -694,8 +732,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "default//foo" depends on "default//bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -729,8 +767,8 @@ releases: }, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -764,8 +802,8 @@ releases: }, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -796,8 +834,8 @@ releases: detailedExitcode: true, error: `in ./helmfile.yaml: release "default//bar" depends on "default//foo" which does not match the selectors. Please add a selector like "--selector name=foo", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -831,8 +869,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -866,8 +904,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -898,8 +936,8 @@ releases: detailedExitcode: true, error: "Identified at least one change", diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{ {Filter: "^foo$", Flags: listFlags("", "default")}: `NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE @@ -921,7 +959,7 @@ bar 4 Fri Nov 1 08:40:07 2019 DEPLOYED mychart2-3.1.0 3.1.0 defau loc: location(), flags: flags{skipNeeds: true}, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -949,8 +987,8 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result @@ -962,7 +1000,7 @@ releases: loc: location(), flags: flags{skipNeeds: false}, files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -990,87 +1028,20 @@ releases: selectors: []string{"app=test"}, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "external-secrets", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "my-release", Chart: "incubator/raw", Flags: "--kube-context default --namespace default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, upgraded: []exectest.Release{}, // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - error: `in ./helmfile.yaml: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml - -err: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies -changing working directory back to "/path/to" -`, + error: `in ./helmfile.yaml.gotmpl: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, }, { // see https://github.com/roboll/helmfile/issues/919#issuecomment-549831747 name: "upgrades with bad selector", loc: location(), files: map[string]string{ - "/path/to/helmfile.yaml": ` + "/path/to/helmfile.yaml.gotmpl": ` {{ $mark := "a" }} releases: @@ -1102,72 +1073,6 @@ releases: error: "err: no releases found that matches specified selector(app=test_non_existent) and environment(default), in any helmfile", // as we check for log output, set concurrency to 1 to avoid non-deterministic test result concurrency: 1, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -merged environment: &{default map[] map[]} -0 release(s) matching app=test_non_existent found in helmfile.yaml - -changing working directory back to "/path/to" -`, }, // // error cases @@ -1190,51 +1095,14 @@ releases: detailedExitcode: true, selectors: []string{"name=foo"}, diffs: map[exectest.DiffKey]error{ - {Name: "bar", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "bar", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, deleted: []exectest.Release{}, concurrency: 1, error: `in ./helmfile.yaml: release "default//foo" depends on "default//bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart3 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart3 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - -merged environment: &{default map[] map[]} -1 release(s) matching name=foo found in helmfile.yaml - -err: release "default//foo" depends on "default//bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies -changing working directory back to "/path/to" -`, }, { name: "non-existent release in needs", @@ -1253,54 +1121,14 @@ releases: }, detailedExitcode: true, diffs: map[exectest.DiffKey]error{ - {Name: "baz", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, - {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --detailed-exitcode --reset-values"}: helmexec.ExitError{Code: 2}, + {Name: "baz", Chart: "mychart3", Flags: "--kube-context default --namespace ns1 --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, + {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, }, lists: map[exectest.ListKey]string{}, upgraded: []exectest.Release{}, deleted: []exectest.Release{}, concurrency: 1, error: `in ./helmfile.yaml: release(s) "default//foo" depend(s) on an undefined release "default//bar". Perhaps you made a typo in "needs" or forgot defining a release named "bar" with appropriate "namespace" and "kubeContext"?`, - log: `processing file "helmfile.yaml" in directory "." -changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -merged environment: &{default map[] map[]} -WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs -2 release(s) found in helmfile.yaml - -err: release(s) "default//foo" depend(s) on an undefined release "default//bar". Perhaps you made a typo in "needs" or forgot defining a release named "bar" with appropriate "namespace" and "kubeContext"? -changing working directory back to "/path/to" -`, }, } diff --git a/pkg/app/init.go b/pkg/app/init.go index 1cdfaad2..f7cc3add 100644 --- a/pkg/app/init.go +++ b/pkg/app/init.go @@ -17,12 +17,12 @@ import ( ) const ( - HelmRequiredVersion = "v3.15.4" - HelmRecommendedVersion = "v3.16.1" - HelmDiffRecommendedVersion = "v3.9.11" - HelmSecretsRecommendedVersion = "v4.6.0" - HelmGitRecommendedVersion = "v0.15.1" - HelmS3RecommendedVersion = "v0.16.0" + HelmRequiredVersion = "v3.16.4" + HelmRecommendedVersion = "v3.17.3" + HelmDiffRecommendedVersion = "v3.11.0" + HelmSecretsRecommendedVersion = "v4.6.3" + HelmGitRecommendedVersion = "v1.3.0" + HelmS3RecommendedVersion = "v0.16.3" HelmInstallCommand = "https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3" ) diff --git a/pkg/app/init_test.go b/pkg/app/init_test.go index f9f40b3e..59d9124d 100644 --- a/pkg/app/init_test.go +++ b/pkg/app/init_test.go @@ -8,27 +8,28 @@ import ( "path/filepath" "regexp" "testing" + + "github.com/stretchr/testify/assert" ) func TestDownloadfile(t *testing.T) { - var ts *httptest.Server cases := []struct { name string handler func(http.ResponseWriter, *http.Request) - url string filepath string wantContent string wantError string }{ { - name: "download success", + name: "successful download of file content", handler: func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) fmt.Fprint(w, "helmfile") }, wantContent: "helmfile", }, { - name: "download 404", + name: "404 error when file not found", handler: func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, "not found") @@ -36,7 +37,7 @@ func TestDownloadfile(t *testing.T) { wantError: "download .*? error, code: 404", }, { - name: "download 500", + name: "500 error on server failure", handler: func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) fmt.Fprint(w, "server error") @@ -44,14 +45,16 @@ func TestDownloadfile(t *testing.T) { wantError: "download .*? error, code: 500", }, { - name: "download path error", + name: "error due to invalid file path", handler: func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) fmt.Fprint(w, "helmfile") }, filepath: "abc/down.txt", wantError: "open .*? no such file or directory", }, } + for _, c := range cases { t.Run(c.name, func(t *testing.T) { dir := t.TempDir() @@ -60,30 +63,24 @@ func TestDownloadfile(t *testing.T) { downfile = filepath.Join(dir, c.filepath) } - ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - c.handler(w, r) - })) + ts := httptest.NewServer(http.HandlerFunc(c.handler)) defer ts.Close() - url := ts.URL - if c.url != "" { - url = c.url - } - err := downloadfile(downfile, url) + + err := downloadfile(downfile, ts.URL) + if c.wantError != "" { - if err == nil { - t.Errorf("download got no error, want error: %v", c.wantError) - } else if matched, regexErr := regexp.MatchString(c.wantError, err.Error()); regexErr != nil || !matched { - t.Errorf("download got error: %v, want error: %v", err, c.wantError) + assert.Error(t, err) + if err != nil { + matched, regexErr := regexp.MatchString(c.wantError, err.Error()) + assert.NoError(t, regexErr) + assert.True(t, matched, "expected error message to match regex: %s", c.wantError) } return } + content, err := os.ReadFile(downfile) - if err != nil { - t.Errorf("read download file error: %v", err) - } - if string(content) != c.wantContent { - t.Errorf("download file content got: %v, want content: %v", string(content), c.wantContent) - } + assert.NoError(t, err) + assert.Equal(t, c.wantContent, string(content), "unexpected content in downloaded file") }) } } diff --git a/pkg/app/run.go b/pkg/app/run.go index a9d77e08..e617c0f7 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -7,6 +7,8 @@ import ( "sort" "strings" + "github.com/fatih/color" + "github.com/helmfile/helmfile/pkg/helmexec" "github.com/helmfile/helmfile/pkg/state" ) @@ -139,17 +141,6 @@ func (r *Run) Repos(c ReposConfigProvider) error { return r.ctx.SyncReposOnce(r.state, r.helm) } -// TODO: Remove this function once Helmfile v0.x -func (r *Run) DeprecatedSyncCharts(c DeprecatedChartsConfigProvider) []error { - st := r.state - helm := r.helm - - affectedReleases := state.AffectedReleases{} - errs := st.SyncReleases(&affectedReleases, helm, c.Values(), c.Concurrency()) - affectedReleases.DisplayAffectedReleases(c.Logger()) - return errs -} - func (r *Run) diff(triggerCleanupEvent bool, detailedExitCode bool, c DiffConfigProvider, diffOpts *state.DiffOpts) (*string, map[string]state.ReleaseSpec, map[string]state.ReleaseSpec, []error) { st := r.state helm := r.helm @@ -220,7 +211,11 @@ func (r *Run) diff(triggerCleanupEvent bool, detailedExitCode bool, c DiffConfig names = append(names, fmt.Sprintf(" %s (%s) UPDATED", r.Name, r.Chart)) } for _, r := range releasesToBeDeleted { - names = append(names, fmt.Sprintf(" %s (%s) DELETED", r.Name, r.Chart)) + releaseToBeDeleted := fmt.Sprintf(" %s (%s) DELETED", r.Name, r.Chart) + if c.Color() { + releaseToBeDeleted = color.RedString(releaseToBeDeleted) + } + names = append(names, releaseToBeDeleted) } // Make the output deterministic for testing purpose sort.Strings(names) diff --git a/pkg/app/testdata/app_diff_test/bad_selector b/pkg/app/testdata/app_diff_test/bad_selector index 9a3ab785..7d03a1f4 100644 --- a/pkg/app/testdata/app_diff_test/bad_selector +++ b/pkg/app/testdata/app_diff_test/bad_selector @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 0 release(s) matching app=test_non_existent found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default b/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default index a0113f65..ab53c3ad 100644 --- a/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default +++ b/pkg/app/testdata/app_diff_test/fail_on_unselected_need_by_default @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs b/pkg/app/testdata/app_diff_test/include-needs index 892b6ea0..58fa9cab 100644 --- a/pkg/app/testdata/app_diff_test/include-needs +++ b/pkg/app/testdata/app_diff_test/include-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need index 9154b011..368cb842 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need index 84a81703..0396ca0d 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index 9154b011..368cb842 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index 84a81703..0396ca0d 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-transitive-needs b/pkg/app/testdata/app_diff_test/include-transitive-needs index 892b6ea0..58fa9cab 100644 --- a/pkg/app/testdata/app_diff_test/include-transitive-needs +++ b/pkg/app/testdata/app_diff_test/include-transitive-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index 84a81703..0396ca0d 100644 --- a/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/no-hooks b/pkg/app/testdata/app_diff_test/no-hooks index 67ee2936..ceb99f63 100644 --- a/pkg/app/testdata/app_diff_test/no-hooks +++ b/pkg/app/testdata/app_diff_test/no-hooks @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release b/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release index a695f222..66b419fa 100644 --- a/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release +++ b/pkg/app/testdata/app_diff_test/show_diff_on_changed_selected_release @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: a - 3: chart: incubator/raw - 4: namespace: default - 5: - name: b - 6: chart: incubator/raw - 7: namespace: default - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: a - 3: chart: incubator/raw - 4: namespace: default - 5: - name: b - 6: chart: incubator/raw - 7: namespace: default - 8: - merged environment: &{default map[] map[]} 1 release(s) matching name=a found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release b/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release index a0a45f09..58d51e49 100644 --- a/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release +++ b/pkg/app/testdata/app_diff_test/shows_no_diff_on_already_uninstalled_selected_release @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: a - 3: chart: incubator/raw - 4: installed: false - 5: namespace: default - 6: - name: b - 7: chart: incubator/raw - 8: namespace: default - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: a - 3: chart: incubator/raw - 4: installed: false - 5: namespace: default - 6: - name: b - 7: chart: incubator/raw - 8: namespace: default - 9: - merged environment: &{default map[] map[]} 1 release(s) matching name=a found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test/skip-needs b/pkg/app/testdata/app_diff_test/skip-needs index 67ee2936..ceb99f63 100644 --- a/pkg/app/testdata/app_diff_test/skip-needs +++ b/pkg/app/testdata/app_diff_test/skip-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/bar b/pkg/app/testdata/app_diff_test_1/bar index cf0a0bb0..26cad101 100644 --- a/pkg/app/testdata/app_diff_test_1/bar +++ b/pkg/app/testdata/app_diff_test_1/bar @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: mychart2 - 9: namespace: ns2 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: mychart2 - 9: namespace: ns2 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/bar_is_disabled b/pkg/app/testdata/app_diff_test_1/bar_is_disabled new file mode 100644 index 00000000..219f70e2 --- /dev/null +++ b/pkg/app/testdata/app_diff_test_1/bar_is_disabled @@ -0,0 +1,18 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +3 release(s) found in helmfile.yaml + +processing 2 groups of releases in this order: +GROUP RELEASES +1 default/ns1/bar +2 default/ns1/foo + +processing releases in group 1/2: default/ns1/bar +processing releases in group 2/2: default/ns1/foo +Affected releases are: + bar (mychart2) DELETED + bar (mychart2) UPDATED + foo (mychart1) UPDATED + +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo index 993d71e8..96453206 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_bar_needs_foo @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: installed: false - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: installed: false - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar index febbbebd..9afd557d 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs index 1ac8c2d3..820af517 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs index 2cae2be4..b79babf5 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_skip-needs @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo index db62f332..126b04b4 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_bar_needs_foo @@ -1,40 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: needs: - 6: - foo - 7: - name: foo - 8: chart: mychart1 - 9: installed: false -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: needs: - 6: - foo - 7: - name: foo - 8: chart: mychart1 - 9: installed: false -10: - merged environment: &{default map[] map[]} -WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar index 7268940e..126b04b4 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_and_bar_when_foo_needs_bar @@ -1,40 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: installed: false - 8: needs: - 9: - bar -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: installed: false - 8: needs: - 9: - bar -10: - merged environment: &{default map[] map[]} -WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo index b10dd133..fb673733 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs index c34f7b46..3456f070 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs index 60002d0c..13f06734 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_skip-needs @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar index f2e49270..cb7b8fc7 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_foo_needs_bar @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo b/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo index 2c4a2fef..bb76a70e 100644 --- a/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo +++ b/pkg/app/testdata/app_diff_test_1/helm3_upgrade_when_ns2_bar_needs_ns1_foo @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: mychart1 - 9: namespace: ns1 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: mychart1 - 9: namespace: ns1 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/install b/pkg/app/testdata/app_diff_test_1/install index bc8c2830..ba4ef00f 100644 --- a/pkg/app/testdata/app_diff_test_1/install +++ b/pkg/app/testdata/app_diff_test_1/install @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: mychart3 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - name: bar - 9: chart: mychart2 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: mychart3 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - name: bar - 9: chart: mychart2 -10: - merged environment: &{default map[] map[]} 3 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/non-existent_release_in_needs b/pkg/app/testdata/app_diff_test_1/non-existent_release_in_needs new file mode 100644 index 00000000..60dead90 --- /dev/null +++ b/pkg/app/testdata/app_diff_test_1/non-existent_release_in_needs @@ -0,0 +1,8 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs +2 release(s) found in helmfile.yaml + +err: release(s) "default//foo" depend(s) on an undefined release "default//bar". Perhaps you made a typo in "needs" or forgot defining a release named "bar" with appropriate "namespace" and "kubeContext"? +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_1/noop b/pkg/app/testdata/app_diff_test_1/noop index 5c2c5753..beea0d82 100644 --- a/pkg/app/testdata/app_diff_test_1/noop +++ b/pkg/app/testdata/app_diff_test_1/noop @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/smoke b/pkg/app/testdata/app_diff_test_1/smoke index 3cd9cd5a..bf85c9e5 100644 --- a/pkg/app/testdata/app_diff_test_1/smoke +++ b/pkg/app/testdata/app_diff_test_1/smoke @@ -1,128 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - merged environment: &{default map[] map[]} -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_1/unselected_release_in_needs b/pkg/app/testdata/app_diff_test_1/unselected_release_in_needs new file mode 100644 index 00000000..d82f9d50 --- /dev/null +++ b/pkg/app/testdata/app_diff_test_1/unselected_release_in_needs @@ -0,0 +1,7 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +1 release(s) matching name=foo found in helmfile.yaml + +err: release "default//foo" depends on "default//bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo index 20aae345..e1ade01c 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override index f78c15ac..37ac4517 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_bar_needs_foo,_with_ns_override @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar index b87bccce..4add017f 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override index e0d964ad..f54ab275 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar,_with_ns_override @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override index bbdfc3d1..358aaaf6 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_foo_needs_bar_with_context_override @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: helmDefaults: - 2: kubeContext: hello/world - 3: releases: - 4: - name: bar - 5: chart: mychart2 - 6: - name: foo - 7: chart: mychart1 - 8: needs: - 9: - bar -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: helmDefaults: - 2: kubeContext: hello/world - 3: releases: - 4: - name: bar - 5: chart: mychart2 - 6: - name: foo - 7: chart: mychart1 - 8: needs: - 9: - bar -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context b/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context index e6383a6a..1ca95228 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_releaseb_needs_releasea_with_aws_context @@ -1,42 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: releaseA - 3: chart: mychart1 - 4: namespace: namespaceA - 5: kubeContext: arn:aws:eks:us-east-1:1234567890:cluster/myekscluster - 6: - name: releaseB - 7: chart: mychart2 - 8: namespace: namespaceA - 9: kubeContext: arn:aws:eks:us-east-1:1234567890:cluster/myekscluster -10: needs: -11: - arn:aws:eks:us-east-1:1234567890:cluster/myekscluster/namespaceA/releaseA -12: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: releaseA - 3: chart: mychart1 - 4: namespace: namespaceA - 5: kubeContext: arn:aws:eks:us-east-1:1234567890:cluster/myekscluster - 6: - name: releaseB - 7: chart: mychart2 - 8: namespace: namespaceA - 9: kubeContext: arn:aws:eks:us-east-1:1234567890:cluster/myekscluster -10: needs: -11: - arn:aws:eks:us-east-1:1234567890:cluster/myekscluster/namespaceA/releaseA -12: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar b/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar index cf0a0bb0..26cad101 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar +++ b/pkg/app/testdata/app_diff_test_1/upgrade_when_tns1_ns1_foo_needs_tns2_ns2_bar @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: mychart2 - 9: namespace: ns2 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: mychart2 - 9: namespace: ns2 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_1/upgrades_with_bad_selector b/pkg/app/testdata/app_diff_test_1/upgrades_with_bad_selector new file mode 100644 index 00000000..8e3e99cf --- /dev/null +++ b/pkg/app/testdata/app_diff_test_1/upgrades_with_bad_selector @@ -0,0 +1,33 @@ +processing file "helmfile.yaml.gotmpl" in directory "." +changing working directory to "/path/to" +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": + 0: + 1: + 2: + 3: releases: + 4: - name: kubernetes-external-secrets + 5: chart: incubator/raw + 6: namespace: kube-system + 7: + 8: - name: external-secrets + 9: chart: incubator/raw +10: namespace: default +11: labels: +12: app: test +13: needs: +14: - kube-system/kubernetes-external-secrets +15: +16: - name: my-release +17: chart: incubator/raw +18: namespace: default +19: labels: +20: app: test +21: needs: +22: - default/external-secrets +23: + +merged environment: &{default map[] map[]} +0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl + +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=false b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=false new file mode 100644 index 00000000..f29aa140 --- /dev/null +++ b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=false @@ -0,0 +1,34 @@ +processing file "helmfile.yaml.gotmpl" in directory "." +changing working directory to "/path/to" +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": + 0: + 1: + 2: + 3: releases: + 4: - name: kubernetes-external-secrets + 5: chart: incubator/raw + 6: namespace: kube-system + 7: + 8: - name: external-secrets + 9: chart: incubator/raw +10: namespace: default +11: labels: +12: app: test +13: needs: +14: - kube-system/kubernetes-external-secrets +15: +16: - name: my-release +17: chart: incubator/raw +18: namespace: default +19: labels: +20: app: test +21: needs: +22: - default/external-secrets +23: + +merged environment: &{default map[] map[]} +2 release(s) matching app=test found in helmfile.yaml.gotmpl + +err: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true index 427f901f..6e264062 100644 --- a/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true +++ b/pkg/app/testdata/app_diff_test_1/upgrades_with_good_selector_with_--skip-needs=true @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl processing 2 groups of releases in this order: GROUP RELEASES diff --git a/pkg/app/testdata/app_diff_test_2/bar b/pkg/app/testdata/app_diff_test_2/bar index 91ee7d7e..f5cea33b 100644 --- a/pkg/app/testdata/app_diff_test_2/bar +++ b/pkg/app/testdata/app_diff_test_2/bar @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: mychart2 - 9: namespace: ns2 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: mychart2 - 9: namespace: ns2 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo index 4e540849..7867ad46 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_bar_needs_foo @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: installed: false - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: installed: false - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar index f3a1cd0f..e0bc8dea 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs index 451d5aba..f08db1b7 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs index a54fce36..03791661 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_skip-needs @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo index db62f332..126b04b4 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_bar_needs_foo @@ -1,40 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: needs: - 6: - foo - 7: - name: foo - 8: chart: mychart1 - 9: installed: false -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: needs: - 6: - foo - 7: - name: foo - 8: chart: mychart1 - 9: installed: false -10: - merged environment: &{default map[] map[]} -WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar index 7268940e..126b04b4 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_and_bar_when_foo_needs_bar @@ -1,40 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: installed: false - 8: needs: - 9: - bar -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: installed: false - 5: - name: foo - 6: chart: mychart1 - 7: installed: false - 8: needs: - 9: - bar -10: - merged environment: &{default map[] map[]} -WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo index f4cc93bd..52e9c63e 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_when_bar_needs_foo @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: installed: false - 5: - name: bar - 6: chart: mychart2 - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar index 8c2fb60c..b897150f 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/delete_foo_when_foo_needs_bar @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/foo b/pkg/app/testdata/app_diff_test_2/foo index 7cdf3a2e..2638d8ff 100644 --- a/pkg/app/testdata/app_diff_test_2/foo +++ b/pkg/app/testdata/app_diff_test_2/foo @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: mychart1 - 9: namespace: ns1 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: mychart1 - 9: namespace: ns1 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo b/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo index 7cdf3a2e..2638d8ff 100644 --- a/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo +++ b/pkg/app/testdata/app_diff_test_2/helm3_upgrade_when_ns2_bar_needs_ns1_foo @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: mychart1 - 9: namespace: ns1 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: mychart1 - 9: namespace: ns1 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/install b/pkg/app/testdata/app_diff_test_2/install index 95591b3a..55f951fc 100644 --- a/pkg/app/testdata/app_diff_test_2/install +++ b/pkg/app/testdata/app_diff_test_2/install @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: mychart3 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - name: bar - 9: chart: mychart2 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: mychart3 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - name: bar - 9: chart: mychart2 -10: - merged environment: &{default map[] map[]} 3 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/non-existent_release_in_needs b/pkg/app/testdata/app_diff_test_2/non-existent_release_in_needs new file mode 100644 index 00000000..34aaed69 --- /dev/null +++ b/pkg/app/testdata/app_diff_test_2/non-existent_release_in_needs @@ -0,0 +1,8 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs +2 release(s) found in helmfile.yaml + +err: release(s) "foo" depend(s) on an undefined release "bar". Perhaps you made a typo in "needs" or forgot defining a release named "bar" with appropriate "namespace" and "kubeContext"? +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_2/noop b/pkg/app/testdata/app_diff_test_2/noop index 4bb79c7f..3f843e50 100644 --- a/pkg/app/testdata/app_diff_test_2/noop +++ b/pkg/app/testdata/app_diff_test_2/noop @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/smoke b/pkg/app/testdata/app_diff_test_2/smoke index fcaf8164..d77b29ed 100644 --- a/pkg/app/testdata/app_diff_test_2/smoke +++ b/pkg/app/testdata/app_diff_test_2/smoke @@ -1,128 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - merged environment: &{default map[] map[]} -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo index 6b69bd73..2239c0c5 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override index 87892d12..0841c62e 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_bar_needs_foo,_with_ns_override @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: mychart1 - 4: - name: bar - 5: chart: mychart2 - 6: needs: - 7: - foo - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar index 7ea553a7..0a5c6018 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override index 49bb72fe..686dabf1 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override +++ b/pkg/app/testdata/app_diff_test_2/upgrade_when_foo_needs_bar,_with_ns_override @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: mychart2 - 4: - name: foo - 5: chart: mychart1 - 6: needs: - 7: - bar - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/app_diff_test_2/upgrades_with_bad_selector b/pkg/app/testdata/app_diff_test_2/upgrades_with_bad_selector new file mode 100644 index 00000000..8e3e99cf --- /dev/null +++ b/pkg/app/testdata/app_diff_test_2/upgrades_with_bad_selector @@ -0,0 +1,33 @@ +processing file "helmfile.yaml.gotmpl" in directory "." +changing working directory to "/path/to" +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": + 0: + 1: + 2: + 3: releases: + 4: - name: kubernetes-external-secrets + 5: chart: incubator/raw + 6: namespace: kube-system + 7: + 8: - name: external-secrets + 9: chart: incubator/raw +10: namespace: default +11: labels: +12: app: test +13: needs: +14: - kube-system/kubernetes-external-secrets +15: +16: - name: my-release +17: chart: incubator/raw +18: namespace: default +19: labels: +20: app: test +21: needs: +22: - default/external-secrets +23: + +merged environment: &{default map[] map[]} +0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl + +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=false b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=false new file mode 100644 index 00000000..3be41c57 --- /dev/null +++ b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=false @@ -0,0 +1,34 @@ +processing file "helmfile.yaml.gotmpl" in directory "." +changing working directory to "/path/to" +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": + 0: + 1: + 2: + 3: releases: + 4: - name: kubernetes-external-secrets + 5: chart: incubator/raw + 6: namespace: kube-system + 7: + 8: - name: external-secrets + 9: chart: incubator/raw +10: namespace: default +11: labels: +12: app: test +13: needs: +14: - kube-system/kubernetes-external-secrets +15: +16: - name: my-release +17: chart: incubator/raw +18: namespace: default +19: labels: +20: app: test +21: needs: +22: - default/external-secrets +23: + +merged environment: &{default map[] map[]} +2 release(s) matching app=test found in helmfile.yaml.gotmpl + +err: release "default/external-secrets" depends on "kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true index 926e26fd..e61b33e8 100644 --- a/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true +++ b/pkg/app/testdata/app_diff_test_2/upgrades_with_good_selector_with_--skip-needs=true @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl processing 2 groups of releases in this order: GROUP RELEASES diff --git a/pkg/app/testdata/app_lint_test/bad_selector b/pkg/app/testdata/app_lint_test/bad_selector index 9a3ab785..7d03a1f4 100644 --- a/pkg/app/testdata/app_lint_test/bad_selector +++ b/pkg/app/testdata/app_lint_test/bad_selector @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 0 release(s) matching app=test_non_existent found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default b/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default index a0113f65..ab53c3ad 100644 --- a/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default +++ b/pkg/app/testdata/app_lint_test/fail_on_unselected_need_by_default @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs b/pkg/app/testdata/app_lint_test/include-needs index 892b6ea0..58fa9cab 100644 --- a/pkg/app/testdata/app_lint_test/include-needs +++ b/pkg/app/testdata/app_lint_test/include-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need index ad93dd62..54c6135e 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need index c51d74d8..f2ad0c8f 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index ad93dd62..54c6135e 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index c51d74d8..f2ad0c8f 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-transitive-needs b/pkg/app/testdata/app_lint_test/include-transitive-needs index 892b6ea0..58fa9cab 100644 --- a/pkg/app/testdata/app_lint_test/include-transitive-needs +++ b/pkg/app/testdata/app_lint_test/include-transitive-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index c51d74d8..f2ad0c8f 100644 --- a/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_lint_test/skip-needs b/pkg/app/testdata/app_lint_test/skip-needs index 67ee2936..ceb99f63 100644 --- a/pkg/app/testdata/app_lint_test/skip-needs +++ b/pkg/app/testdata/app_lint_test/skip-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_list_test/default_environment_includes_all_releases b/pkg/app/testdata/app_list_test/default_environment_includes_all_releases index 5dd4bb4a..75efff96 100644 --- a/pkg/app/testdata/app_list_test/default_environment_includes_all_releases +++ b/pkg/app/testdata/app_list_test/default_environment_includes_all_releases @@ -1,221 +1,16 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml processing file "helmfile_1.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_1.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - merged environment: &{default map[] map[]} -first-pass rendering starting for "helmfile_1.yaml.part.1": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - 5: - name: kubernetes-external-secrets - 6: chart: incubator/raw - 7: namespace: kube-system - 8: needs: - 9: - kube-system/logging -10: -11: - name: external-secrets -12: chart: incubator/raw -13: namespace: default -14: labels: -15: app: test -16: needs: -17: - kube-system/kubernetes-external-secrets -18: -19: - name: my-release -20: chart: incubator/raw -21: namespace: default -22: labels: -23: app: test -24: needs: -25: - default/external-secrets -26: -27: -28: # Disabled releases are treated as missing -29: - name: disabled -30: chart: incubator/raw -31: namespace: kube-system -32: installed: false -33: -34: - name: test2 -35: chart: incubator/raw -36: needs: -37: - kube-system/disabled -38: -39: - name: test3 -40: chart: incubator/raw -41: needs: -42: - test2 -43: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.1": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - 5: - name: kubernetes-external-secrets - 6: chart: incubator/raw - 7: namespace: kube-system - 8: needs: - 9: - kube-system/logging -10: -11: - name: external-secrets -12: chart: incubator/raw -13: namespace: default -14: labels: -15: app: test -16: needs: -17: - kube-system/kubernetes-external-secrets -18: -19: - name: my-release -20: chart: incubator/raw -21: namespace: default -22: labels: -23: app: test -24: needs: -25: - default/external-secrets -26: -27: -28: # Disabled releases are treated as missing -29: - name: disabled -30: chart: incubator/raw -31: namespace: kube-system -32: installed: false -33: -34: - name: test2 -35: chart: incubator/raw -36: needs: -37: - kube-system/disabled -38: -39: - name: test3 -40: chart: incubator/raw -41: needs: -42: - test2 -43: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs changing working directory back to "/path/to" processing file "helmfile_2.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_2.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - merged environment: &{default map[] map[]} -first-pass rendering starting for "helmfile_2.yaml.part.1": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.1": - 0: repositories: - 1: - name: bitnami - 2: url: https://charts.bitnami.com/bitnami - 3: - 4: releases: - 5: - name: cache - 6: namespace: my-app - 7: chart: bitnami/redis - 8: version: 17.0.7 - 9: labels: -10: app: test -11: -12: - name: database -13: namespace: my-app -14: chart: bitnami/postgres -15: version: 11.6.22 -16: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.1": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.1": - 0: repositories: - 1: - name: bitnami - 2: url: https://charts.bitnami.com/bitnami - 3: - 4: releases: - 5: - name: cache - 6: namespace: my-app - 7: chart: bitnami/redis - 8: version: 17.0.7 - 9: labels: -10: app: test -11: -12: - name: database -13: namespace: my-app -14: chart: bitnami/postgres -15: version: 11.6.22 -16: - merged environment: &{default map[] map[]} changing working directory back to "/path/to" processing file "helmfile_3.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_3.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile_3.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - merged environment: &{default map[] map[]} changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_list_test/fail_on_unknown_environment b/pkg/app/testdata/app_list_test/fail_on_unknown_environment index 040b2ebe..9eccd0c3 100644 --- a/pkg/app/testdata/app_list_test/fail_on_unknown_environment +++ b/pkg/app/testdata/app_list_test/fail_on_unknown_environment @@ -1,74 +1,13 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml processing file "helmfile_1.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_1.yaml.part.0": inherited=&{staging map[] map[]}, overrode= -first-pass uses: &{staging map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - -first-pass produced: &{staging map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.0": {staging map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - merged environment: &{staging map[] map[]} changing working directory back to "/path/to" processing file "helmfile_2.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_2.yaml.part.0": inherited=&{staging map[] map[]}, overrode= -first-pass uses: &{staging map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - -first-pass produced: &{staging map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.0": {staging map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - merged environment: &{staging map[] map[]} changing working directory back to "/path/to" processing file "helmfile_3.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_3.yaml.part.0": inherited=&{staging map[] map[]}, overrode= -first-pass uses: &{staging map[] map[]} -first-pass rendering output of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - -first-pass produced: &{staging map[] map[]} -first-pass rendering result of "helmfile_3.yaml.part.0": {staging map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - merged environment: &{staging map[] map[]} changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files index 8350e3c8..b161220b 100644 --- a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files +++ b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_multiple_files @@ -1,221 +1,16 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml processing file "helmfile_1.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_1.yaml.part.0": inherited=&{shared map[] map[]}, overrode= -first-pass uses: &{shared map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - -first-pass produced: &{shared map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.0": {shared map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - merged environment: &{shared map[] map[]} -first-pass rendering starting for "helmfile_1.yaml.part.1": inherited=&{shared map[] map[]}, overrode= -first-pass uses: &{shared map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - 5: - name: kubernetes-external-secrets - 6: chart: incubator/raw - 7: namespace: kube-system - 8: needs: - 9: - kube-system/logging -10: -11: - name: external-secrets -12: chart: incubator/raw -13: namespace: default -14: labels: -15: app: test -16: needs: -17: - kube-system/kubernetes-external-secrets -18: -19: - name: my-release -20: chart: incubator/raw -21: namespace: default -22: labels: -23: app: test -24: needs: -25: - default/external-secrets -26: -27: -28: # Disabled releases are treated as missing -29: - name: disabled -30: chart: incubator/raw -31: namespace: kube-system -32: installed: false -33: -34: - name: test2 -35: chart: incubator/raw -36: needs: -37: - kube-system/disabled -38: -39: - name: test3 -40: chart: incubator/raw -41: needs: -42: - test2 -43: - -first-pass produced: &{shared map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.1": {shared map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - 5: - name: kubernetes-external-secrets - 6: chart: incubator/raw - 7: namespace: kube-system - 8: needs: - 9: - kube-system/logging -10: -11: - name: external-secrets -12: chart: incubator/raw -13: namespace: default -14: labels: -15: app: test -16: needs: -17: - kube-system/kubernetes-external-secrets -18: -19: - name: my-release -20: chart: incubator/raw -21: namespace: default -22: labels: -23: app: test -24: needs: -25: - default/external-secrets -26: -27: -28: # Disabled releases are treated as missing -29: - name: disabled -30: chart: incubator/raw -31: namespace: kube-system -32: installed: false -33: -34: - name: test2 -35: chart: incubator/raw -36: needs: -37: - kube-system/disabled -38: -39: - name: test3 -40: chart: incubator/raw -41: needs: -42: - test2 -43: - merged environment: &{shared map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs changing working directory back to "/path/to" processing file "helmfile_2.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_2.yaml.part.0": inherited=&{shared map[] map[]}, overrode= -first-pass uses: &{shared map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - -first-pass produced: &{shared map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.0": {shared map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - merged environment: &{shared map[] map[]} -first-pass rendering starting for "helmfile_2.yaml.part.1": inherited=&{shared map[] map[]}, overrode= -first-pass uses: &{shared map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.1": - 0: repositories: - 1: - name: bitnami - 2: url: https://charts.bitnami.com/bitnami - 3: - 4: releases: - 5: - name: cache - 6: namespace: my-app - 7: chart: bitnami/redis - 8: version: 17.0.7 - 9: labels: -10: app: test -11: -12: - name: database -13: namespace: my-app -14: chart: bitnami/postgres -15: version: 11.6.22 -16: - -first-pass produced: &{shared map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.1": {shared map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.1": - 0: repositories: - 1: - name: bitnami - 2: url: https://charts.bitnami.com/bitnami - 3: - 4: releases: - 5: - name: cache - 6: namespace: my-app - 7: chart: bitnami/redis - 8: version: 17.0.7 - 9: labels: -10: app: test -11: -12: - name: database -13: namespace: my-app -14: chart: bitnami/postgres -15: version: 11.6.22 -16: - merged environment: &{shared map[] map[]} changing working directory back to "/path/to" processing file "helmfile_3.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_3.yaml.part.0": inherited=&{shared map[] map[]}, overrode= -first-pass uses: &{shared map[] map[]} -first-pass rendering output of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - -first-pass produced: &{shared map[] map[]} -first-pass rendering result of "helmfile_3.yaml.part.0": {shared map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - merged environment: &{shared map[] map[]} changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only index 927ee649..a214f41f 100644 --- a/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only +++ b/pkg/app/testdata/app_list_test/filters_releases_for_environment_used_in_one_file_only @@ -1,120 +1,14 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml processing file "helmfile_1.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_1.yaml.part.0": inherited=&{test map[] map[]}, overrode= -first-pass uses: &{test map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - -first-pass produced: &{test map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.0": {test map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - merged environment: &{test map[] map[]} changing working directory back to "/path/to" processing file "helmfile_2.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_2.yaml.part.0": inherited=&{test map[] map[]}, overrode= -first-pass uses: &{test map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - -first-pass produced: &{test map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.0": {test map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - merged environment: &{test map[] map[]} -first-pass rendering starting for "helmfile_2.yaml.part.1": inherited=&{test map[] map[]}, overrode= -first-pass uses: &{test map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.1": - 0: repositories: - 1: - name: bitnami - 2: url: https://charts.bitnami.com/bitnami - 3: - 4: releases: - 5: - name: cache - 6: namespace: my-app - 7: chart: bitnami/redis - 8: version: 17.0.7 - 9: labels: -10: app: test -11: -12: - name: database -13: namespace: my-app -14: chart: bitnami/postgres -15: version: 11.6.22 -16: - -first-pass produced: &{test map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.1": {test map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.1": - 0: repositories: - 1: - name: bitnami - 2: url: https://charts.bitnami.com/bitnami - 3: - 4: releases: - 5: - name: cache - 6: namespace: my-app - 7: chart: bitnami/redis - 8: version: 17.0.7 - 9: labels: -10: app: test -11: -12: - name: database -13: namespace: my-app -14: chart: bitnami/postgres -15: version: 11.6.22 -16: - merged environment: &{test map[] map[]} changing working directory back to "/path/to" processing file "helmfile_3.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_3.yaml.part.0": inherited=&{test map[] map[]}, overrode= -first-pass uses: &{test map[] map[]} -first-pass rendering output of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - -first-pass produced: &{test map[] map[]} -first-pass rendering result of "helmfile_3.yaml.part.0": {test map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - merged environment: &{test map[] map[]} changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment b/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment index 4d332f10..41a5321e 100644 --- a/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment +++ b/pkg/app/testdata/app_list_test/list_releases_matching_selector_and_environment @@ -1,175 +1,15 @@ found 3 helmfile state files in helmfile.d: /path/to/helmfile.d/helmfile_1.yaml, /path/to/helmfile.d/helmfile_2.yaml, /path/to/helmfile.d/helmfile_3.yaml processing file "helmfile_1.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_1.yaml.part.0": inherited=&{development map[] map[]}, overrode= -first-pass uses: &{development map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - -first-pass produced: &{development map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.0": {development map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - merged environment: &{development map[] map[]} -first-pass rendering starting for "helmfile_1.yaml.part.1": inherited=&{development map[] map[]}, overrode= -first-pass uses: &{development map[] map[]} -first-pass rendering output of "helmfile_1.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - 5: - name: kubernetes-external-secrets - 6: chart: incubator/raw - 7: namespace: kube-system - 8: needs: - 9: - kube-system/logging -10: -11: - name: external-secrets -12: chart: incubator/raw -13: namespace: default -14: labels: -15: app: test -16: needs: -17: - kube-system/kubernetes-external-secrets -18: -19: - name: my-release -20: chart: incubator/raw -21: namespace: default -22: labels: -23: app: test -24: needs: -25: - default/external-secrets -26: -27: -28: # Disabled releases are treated as missing -29: - name: disabled -30: chart: incubator/raw -31: namespace: kube-system -32: installed: false -33: -34: - name: test2 -35: chart: incubator/raw -36: needs: -37: - kube-system/disabled -38: -39: - name: test3 -40: chart: incubator/raw -41: needs: -42: - test2 -43: - -first-pass produced: &{development map[] map[]} -first-pass rendering result of "helmfile_1.yaml.part.1": {development map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_1.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - 5: - name: kubernetes-external-secrets - 6: chart: incubator/raw - 7: namespace: kube-system - 8: needs: - 9: - kube-system/logging -10: -11: - name: external-secrets -12: chart: incubator/raw -13: namespace: default -14: labels: -15: app: test -16: needs: -17: - kube-system/kubernetes-external-secrets -18: -19: - name: my-release -20: chart: incubator/raw -21: namespace: default -22: labels: -23: app: test -24: needs: -25: - default/external-secrets -26: -27: -28: # Disabled releases are treated as missing -29: - name: disabled -30: chart: incubator/raw -31: namespace: kube-system -32: installed: false -33: -34: - name: test2 -35: chart: incubator/raw -36: needs: -37: - kube-system/disabled -38: -39: - name: test3 -40: chart: incubator/raw -41: needs: -42: - test2 -43: - merged environment: &{development map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs changing working directory back to "/path/to" processing file "helmfile_2.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_2.yaml.part.0": inherited=&{development map[] map[]}, overrode= -first-pass uses: &{development map[] map[]} -first-pass rendering output of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - -first-pass produced: &{development map[] map[]} -first-pass rendering result of "helmfile_2.yaml.part.0": {development map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_2.yaml.part.0": - 0: - 1: environments: - 2: test: {} - 3: shared: {} - merged environment: &{development map[] map[]} changing working directory back to "/path/to" processing file "helmfile_3.yaml" in directory "/path/to/helmfile.d" changing working directory to "/path/to/helmfile.d" -first-pass rendering starting for "helmfile_3.yaml.part.0": inherited=&{development map[] map[]}, overrode= -first-pass uses: &{development map[] map[]} -first-pass rendering output of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - -first-pass produced: &{development map[] map[]} -first-pass rendering result of "helmfile_3.yaml.part.0": {development map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile_3.yaml.part.0": - 0: - 1: releases: - 2: - name: global - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - merged environment: &{development map[] map[]} changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_template_test/bad_selector b/pkg/app/testdata/app_template_test/bad_selector index 9a3ab785..7d03a1f4 100644 --- a/pkg/app/testdata/app_template_test/bad_selector +++ b/pkg/app/testdata/app_template_test/bad_selector @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 0 release(s) matching app=test_non_existent found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default b/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default index a0113f65..ab53c3ad 100644 --- a/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default +++ b/pkg/app/testdata/app_template_test/fail_on_unselected_need_by_default @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs b/pkg/app/testdata/app_template_test/include-needs index 892b6ea0..58fa9cab 100644 --- a/pkg/app/testdata/app_template_test/include-needs +++ b/pkg/app/testdata/app_template_test/include-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need index 5b8e896d..ebd01666 100644 --- a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need index 47172c7e..29ad4ef5 100644 --- a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index 5b8e896d..ebd01666 100644 --- a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index 47172c7e..29ad4ef5 100644 --- a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-transitive-needs b/pkg/app/testdata/app_template_test/include-transitive-needs index 892b6ea0..58fa9cab 100644 --- a/pkg/app/testdata/app_template_test/include-transitive-needs +++ b/pkg/app/testdata/app_template_test/include-transitive-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index 47172c7e..29ad4ef5 100644 --- a/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/no-hooks b/pkg/app/testdata/app_template_test/no-hooks new file mode 100644 index 00000000..ceb99f63 --- /dev/null +++ b/pkg/app/testdata/app_template_test/no-hooks @@ -0,0 +1,14 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs +2 release(s) matching app=test found in helmfile.yaml + +processing 2 groups of releases in this order: +GROUP RELEASES +1 default/default/external-secrets +2 default/default/my-release + +processing releases in group 1/2: default/default/external-secrets +processing releases in group 2/2: default/default/my-release +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/app_template_test/show-only b/pkg/app/testdata/app_template_test/show-only index 16806eb9..e528ba50 100644 --- a/pkg/app/testdata/app_template_test/show-only +++ b/pkg/app/testdata/app_template_test/show-only @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=logging found in helmfile.yaml diff --git a/pkg/app/testdata/app_template_test/skip-needs b/pkg/app/testdata/app_template_test/skip-needs index 67ee2936..ceb99f63 100644 --- a/pkg/app/testdata/app_template_test/skip-needs +++ b/pkg/app/testdata/app_template_test/skip-needs @@ -1,106 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: logging - 3: chart: incubator/raw - 4: namespace: kube-system - 5: - 6: - name: kubernetes-external-secrets - 7: chart: incubator/raw - 8: namespace: kube-system - 9: needs: -10: - kube-system/logging -11: -12: - name: external-secrets -13: chart: incubator/raw -14: namespace: default -15: labels: -16: app: test -17: needs: -18: - kube-system/kubernetes-external-secrets -19: -20: - name: my-release -21: chart: incubator/raw -22: namespace: default -23: labels: -24: app: test -25: needs: -26: - default/external-secrets -27: -28: -29: # Disabled releases are treated as missing -30: - name: disabled -31: chart: incubator/raw -32: namespace: kube-system -33: installed: false -34: -35: - name: test2 -36: chart: incubator/raw -37: needs: -38: - kube-system/disabled -39: -40: - name: test3 -41: chart: incubator/raw -42: needs: -43: - test2 -44: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml diff --git a/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order b/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order index c64a76f9..6b1135ae 100644 --- a/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order +++ b/pkg/app/testdata/dag_test/dag_lists_dependencies_in_order @@ -1,120 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: environments: - 2: development: {} - 3: shared: {} - merged environment: &{default map[] map[]} -first-pass rendering starting for "helmfile.yaml.part.1": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: needs: - 8: - kube-system/logging - 9: - name: external-secrets -10: chart: incubator/raw -11: namespace: default -12: labels: -13: app: test -14: needs: -15: - kube-system/kubernetes-external-secrets -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: # Disabled releases are treated as missing -24: - name: disabled -25: chart: incubator/raw -26: namespace: kube-system -27: installed: false -28: - name: test2 -29: chart: incubator/raw -30: needs: -31: - kube-system/disabled -32: - name: test3 -33: chart: incubator/raw -34: needs: -35: - test2 -36: - name: test4 -37: chart: incubator/raw -38: needs: -39: - test2 -40: - test3 -41: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.1": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.1": - 0: releases: - 1: - name: logging - 2: chart: incubator/raw - 3: namespace: kube-system - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: needs: - 8: - kube-system/logging - 9: - name: external-secrets -10: chart: incubator/raw -11: namespace: default -12: labels: -13: app: test -14: needs: -15: - kube-system/kubernetes-external-secrets -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: # Disabled releases are treated as missing -24: - name: disabled -25: chart: incubator/raw -26: namespace: kube-system -27: installed: false -28: - name: test2 -29: chart: incubator/raw -30: needs: -31: - kube-system/disabled -32: - name: test3 -33: chart: incubator/raw -34: needs: -35: - test2 -36: - name: test4 -37: chart: incubator/raw -38: needs: -39: - test2 -40: - test3 -41: - merged environment: &{default map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log b/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log index 3ee09b86..7999740f 100644 --- a/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/delete_bar_when_bar_needs_foo/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: - name: bar - 5: chart: stable/mychart2 - 6: installed: false - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: - name: bar - 5: chart: stable/mychart2 - 6: installed: false - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log b/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log index 02d852b3..63e24849 100644 --- a/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/delete_bar_when_foo_needs_bar/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: installed: false - 5: - name: foo - 6: chart: stable/mychart1 - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: installed: false - 5: - name: foo - 6: chart: stable/mychart1 - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log b/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log index f3377bd1..11813de1 100644 --- a/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/delete_foo_and_bar_when_bar_needs_foo/log @@ -1,40 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: installed: false - 5: needs: - 6: - foo - 7: - name: foo - 8: chart: stable/mychart1 - 9: installed: false -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: installed: false - 5: needs: - 6: - foo - 7: - name: foo - 8: chart: stable/mychart1 - 9: installed: false -10: - merged environment: &{default map[] map[]} -WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log b/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log index e8850438..abbb3ddf 100644 --- a/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/delete_foo_and_bar_when_foo_needs_bar/log @@ -1,40 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: installed: false - 5: - name: foo - 6: chart: stable/mychart1 - 7: installed: false - 8: needs: - 9: - bar -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: installed: false - 5: - name: foo - 6: chart: stable/mychart1 - 7: installed: false - 8: needs: - 9: - bar -10: - merged environment: &{default map[] map[]} -WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log b/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log index 25bb1eef..1dc037b0 100644 --- a/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/delete_foo_when_bar_needs_foo/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: installed: false - 5: - name: bar - 6: chart: stable/mychart2 - 7: needs: - 8: - foo - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: installed: false - 5: - name: bar - 6: chart: stable/mychart2 - 7: needs: - 8: - foo - 9: - merged environment: &{default map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log b/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log index 38541ce3..3f58a191 100644 --- a/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/delete_foo_when_foo_needs_bar/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/duplicate_releases/log b/pkg/app/testdata/testapply/duplicate_releases/log index 5a14f57e..ccdf69e2 100644 --- a/pkg/app/testdata/testapply/duplicate_releases/log +++ b/pkg/app/testdata/testapply/duplicate_releases/log @@ -1,44 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart2 - 7: needs: - 8: - ns1/bar - 9: - name: foo -10: chart: mychart1 -11: needs: -12: - ns1/bar -13: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart2 - 7: needs: - 8: - ns1/bar - 9: - name: foo -10: chart: mychart1 -11: needs: -12: - ns1/bar -13: - merged environment: &{default map[] map[]} err: found 2 duplicate releases with ID "default//foo" changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log b/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log index 223b67ad..3dd5b87b 100644 --- a/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log +++ b/pkg/app/testdata/testapply/helm-status-check-to-release-existence/log @@ -1,32 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo_notFound - 5: chart: stable/mychart1 - 6: installed: false - 7: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo_notFound - 5: chart: stable/mychart1 - 6: installed: false - 7: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log b/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log index e309756f..c5e811d4 100644 --- a/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log +++ b/pkg/app/testdata/testapply/install-with-upgrade-with-skip-diff-on-install/log @@ -1,44 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: stable/mychart3 - 4: disableValidationOnInstall: true - 5: - name: foo - 6: chart: stable/mychart1 - 7: disableValidationOnInstall: true - 8: needs: - 9: - bar -10: - name: bar -11: chart: stable/mychart2 -12: disableValidation: true -13: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: stable/mychart3 - 4: disableValidationOnInstall: true - 5: - name: foo - 6: chart: stable/mychart1 - 7: disableValidationOnInstall: true - 8: needs: - 9: - bar -10: - name: bar -11: chart: stable/mychart2 -12: disableValidation: true -13: - merged environment: &{default map[] map[]} 3 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log b/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log index e309756f..c5e811d4 100644 --- a/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log +++ b/pkg/app/testdata/testapply/install-with-upgrade-with-validation-control/log @@ -1,44 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: stable/mychart3 - 4: disableValidationOnInstall: true - 5: - name: foo - 6: chart: stable/mychart1 - 7: disableValidationOnInstall: true - 8: needs: - 9: - bar -10: - name: bar -11: chart: stable/mychart2 -12: disableValidation: true -13: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: stable/mychart3 - 4: disableValidationOnInstall: true - 5: - name: foo - 6: chart: stable/mychart1 - 7: disableValidationOnInstall: true - 8: needs: - 9: - bar -10: - name: bar -11: chart: stable/mychart2 -12: disableValidation: true -13: - merged environment: &{default map[] map[]} 3 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/install/log b/pkg/app/testdata/testapply/install/log index 288e71a2..b6766a38 100644 --- a/pkg/app/testdata/testapply/install/log +++ b/pkg/app/testdata/testapply/install/log @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: stable/mychart3 - 4: - name: foo - 5: chart: stable/mychart1 - 6: needs: - 7: - bar - 8: - name: bar - 9: chart: stable/mychart2 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: chart: stable/mychart3 - 4: - name: foo - 5: chart: stable/mychart1 - 6: needs: - 7: - bar - 8: - name: bar - 9: chart: stable/mychart2 -10: - merged environment: &{default map[] map[]} 3 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/non-existent_release_in_needs/log b/pkg/app/testdata/testapply/non-existent_release_in_needs/log index b13e2b15..714f59fa 100644 --- a/pkg/app/testdata/testapply/non-existent_release_in_needs/log +++ b/pkg/app/testdata/testapply/non-existent_release_in_needs/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - ns1/bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: baz - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - ns1/bar - 9: - merged environment: &{default map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/noop/log b/pkg/app/testdata/testapply/noop/log index 89669abf..b9eb3b39 100644 --- a/pkg/app/testdata/testapply/noop/log +++ b/pkg/app/testdata/testapply/noop/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: installed: false - 7: needs: - 8: - bar - 9: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/smoke/log b/pkg/app/testdata/testapply/smoke/log index 6ef2316c..f94cd7c1 100644 --- a/pkg/app/testdata/testapply/smoke/log +++ b/pkg/app/testdata/testapply/smoke/log @@ -1,128 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - merged environment: &{default map[] map[]} -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 10 release(s) found in helmfile.yaml Affected releases are: diff --git a/pkg/app/testdata/testapply/unselected_release_in_needs/log b/pkg/app/testdata/testapply/unselected_release_in_needs/log index fd4dca83..9f34aacd 100644 --- a/pkg/app/testdata/testapply/unselected_release_in_needs/log +++ b/pkg/app/testdata/testapply/unselected_release_in_needs/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - ns1/bar - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: namespace: ns1 - 4: chart: mychart3 - 5: - name: foo - 6: chart: mychart1 - 7: needs: - 8: - ns1/bar - 9: - merged environment: &{default map[] map[]} 1 release(s) matching name=foo found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log index 75c0b4ce..c216b8ee 100644 --- a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log +++ b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo,_with_ns_override/log @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: - name: bar - 5: chart: stable/mychart2 - 6: needs: - 7: - foo - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: - name: bar - 5: chart: stable/mychart2 - 6: needs: - 7: - foo - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log index 0854f6f9..06004eba 100644 --- a/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log +++ b/pkg/app/testdata/testapply/upgrade_when_bar_needs_foo/log @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: - name: bar - 5: chart: stable/mychart2 - 6: needs: - 7: - foo - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: - name: bar - 5: chart: stable/mychart2 - 6: needs: - 7: - foo - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log index 18819452..f590244f 100644 --- a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log +++ b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar,_with_ns_override/log @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: needs: - 7: - bar - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: needs: - 7: - bar - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log index 38252743..53a2991c 100644 --- a/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log +++ b/pkg/app/testdata/testapply/upgrade_when_foo_needs_bar/log @@ -1,34 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: needs: - 7: - bar - 8: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: - name: foo - 5: chart: stable/mychart1 - 6: needs: - 7: - bar - 8: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log new file mode 100644 index 00000000..36eb250f --- /dev/null +++ b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns1/bar_and_ns2/bar_is_disabled/log @@ -0,0 +1,43 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +3 release(s) found in helmfile.yaml + +Affected releases are: + bar (stable/mychart2) DELETED + bar (stable/mychart2) UPDATED + foo (stable/mychart1) UPDATED + +invoking preapply hooks for 2 groups of releases in this order: +GROUP RELEASES +1 default/ns1/foo +2 default/ns1/bar, default/ns2/bar + +invoking preapply hooks for releases in group 1/2: default/ns1/foo +invoking preapply hooks for releases in group 2/2: default/ns1/bar, default/ns2/bar +processing 1 groups of releases in this order: +GROUP RELEASES +1 default/ns2/bar + +processing releases in group 1/1: default/ns2/bar +processing 2 groups of releases in this order: +GROUP RELEASES +1 default/ns1/bar +2 default/ns1/foo + +processing releases in group 1/2: default/ns1/bar +getting deployed release version failed: Failed to get the version for: mychart2 +processing releases in group 2/2: default/ns1/foo +getting deployed release version failed: Failed to get the version for: mychart1 + +UPDATED RELEASES: +NAME NAMESPACE CHART VERSION DURATION +bar ns1 stable/mychart2 0s +foo ns1 stable/mychart1 0s + + +DELETED RELEASES: +NAME NAMESPACE DURATION +bar ns2 0s + +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log index 6f129537..13ca7ee3 100644 --- a/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log +++ b/pkg/app/testdata/testapply/upgrade_when_ns1/foo_needs_ns2/bar/log @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: stable/mychart2 - 9: namespace: ns2 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: stable/mychart1 - 4: namespace: ns1 - 5: needs: - 6: - ns2/bar - 7: - name: bar - 8: chart: stable/mychart2 - 9: namespace: ns2 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log b/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log index 76015ef1..5e96b8fd 100644 --- a/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log +++ b/pkg/app/testdata/testapply/upgrade_when_ns2/bar_needs_ns1/foo/log @@ -1,38 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: stable/mychart1 - 9: namespace: ns1 -10: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: bar - 3: chart: stable/mychart2 - 4: namespace: ns2 - 5: needs: - 6: - ns1/foo - 7: - name: foo - 8: chart: stable/mychart1 - 9: namespace: ns1 -10: - merged environment: &{default map[] map[]} 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testapply/upgrades_with_bad_selector/log b/pkg/app/testdata/testapply/upgrades_with_bad_selector/log index 37de515c..8e3e99cf 100644 --- a/pkg/app/testdata/testapply/upgrades_with_bad_selector/log +++ b/pkg/app/testdata/testapply/upgrades_with_bad_selector/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,6 +28,6 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -0 release(s) matching app=test_non_existent found in helmfile.yaml +0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log index b286816b..f29aa140 100644 --- a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log +++ b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=false_--include-needs=true/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl err: release "default/default/external-secrets" depends on "default/kube-system/kubernetes-external-secrets" which does not match the selectors. Please add a selector like "--selector name=kubernetes-external-secrets", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log index d1a55a90..65c32bd4 100644 --- a/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log +++ b/pkg/app/testdata/testapply/upgrades_with_good_selector_with_--skip-needs=true/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_2/bad_--selector/log b/pkg/app/testdata/testapply_2/bad_--selector/log new file mode 100644 index 00000000..8e3e99cf --- /dev/null +++ b/pkg/app/testdata/testapply_2/bad_--selector/log @@ -0,0 +1,33 @@ +processing file "helmfile.yaml.gotmpl" in directory "." +changing working directory to "/path/to" +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": + 0: + 1: + 2: + 3: releases: + 4: - name: kubernetes-external-secrets + 5: chart: incubator/raw + 6: namespace: kube-system + 7: + 8: - name: external-secrets + 9: chart: incubator/raw +10: namespace: default +11: labels: +12: app: test +13: needs: +14: - kube-system/kubernetes-external-secrets +15: +16: - name: my-release +17: chart: incubator/raw +18: namespace: default +19: labels: +20: app: test +21: needs: +22: - default/external-secrets +23: + +merged environment: &{default map[] map[]} +0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl + +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log b/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log index dfde4bdd..6e400919 100644 --- a/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log +++ b/pkg/app/testdata/testapply_2/deduplicate_by_--selector/log @@ -1,52 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: incubator/raw - 4: namespace: default - 5: labels: - 6: app: test - 7: component: raw - 8: index: '1' - 9: -10: - name: foo -11: chart: incubator/raw -12: namespace: default -13: labels: -14: app: test -15: component: raw -16: index: '2' -17: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: incubator/raw - 4: namespace: default - 5: labels: - 6: app: test - 7: component: raw - 8: index: '1' - 9: -10: - name: foo -11: chart: incubator/raw -12: namespace: default -13: labels: -14: app: test -15: component: raw -16: index: '2' -17: - merged environment: &{default map[] map[]} 1 release(s) matching index=1 found in helmfile.yaml diff --git a/pkg/app/testdata/testapply_2/include-transitive-needs=true/log b/pkg/app/testdata/testapply_2/include-transitive-needs=true/log index 80fe6952..c4fd365e 100644 --- a/pkg/app/testdata/testapply_2/include-transitive-needs=true/log +++ b/pkg/app/testdata/testapply_2/include-transitive-needs=true/log @@ -1,35 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: serviceA - 5: chart: my/chart - 6: needs: - 7: - serviceB - 8: - 9: - name: serviceB -10: chart: my/chart -11: needs: -12: - serviceC -13: -14: - name: serviceC -15: chart: my/chart -16: -17: - name: serviceD -18: chart: my/chart -19: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -52,7 +24,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 19: merged environment: &{default map[] map[]} -3 release(s) matching name=serviceA found in helmfile.yaml +3 release(s) matching name=serviceA found in helmfile.yaml.gotmpl Affected releases are: serviceA (my/chart) UPDATED diff --git a/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log b/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log index ed58f794..2c735ba9 100644 --- a/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log +++ b/pkg/app/testdata/testapply_2/select_non_existent_release_with_--allow-no-matching-release/log @@ -1,44 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: incubator/raw - 4: namespace: default - 5: labels: - 6: app: test - 7: - 8: - name: bar - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: incubator/raw - 4: namespace: default - 5: labels: - 6: app: test - 7: - 8: - name: bar - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: - merged environment: &{default map[] map[]} 0 release(s) matching app=foo found in helmfile.yaml diff --git a/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log b/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log index 5aad40b2..07be1f75 100644 --- a/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log +++ b/pkg/app/testdata/testapply_2/select_single_release_from_helmfile_with_two_duplicates/log @@ -1,56 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: incubator/raw - 4: namespace: default - 5: labels: - 6: app: test - 7: - 8: - name: bar - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: build -13: -14: - name: bar -15: chart: incubator/raw -16: namespace: default -17: labels: -18: app: test -19: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: foo - 3: chart: incubator/raw - 4: namespace: default - 5: labels: - 6: app: test - 7: - 8: - name: bar - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: build -13: -14: - name: bar -15: chart: incubator/raw -16: namespace: default -17: labels: -18: app: test -19: - merged environment: &{default map[] map[]} 1 release(s) matching name=foo found in helmfile.yaml diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log index 0350fb56..fad7bdc6 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log index 2f1fa1f1..370e8e8e 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log index c6a51f3c..9998300d 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log @@ -1,40 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: installed: false - 8: - 9: - name: external-secrets -10: chart: incubator/raw -11: namespace: default -12: labels: -13: app: test -14: needs: -15: - kube-system/kubernetes-external-secrets -16: -17: - name: my-release -18: chart: incubator/raw -19: namespace: default -20: labels: -21: app: test -22: needs: -23: - default/external-secrets -24: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -63,7 +30,7 @@ second-pass rendering result of "helmfile.yaml.part.0": merged environment: &{default map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs Affected releases are: diff --git a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log index 13ca54dd..6bf96b12 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log @@ -1,40 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: installed: false - 8: - 9: - name: external-secrets -10: chart: incubator/raw -11: namespace: default -12: labels: -13: app: test -14: needs: -15: - kube-system/kubernetes-external-secrets -16: -17: - name: my-release -18: chart: incubator/raw -19: namespace: default -20: labels: -21: app: test -22: needs: -23: - default/external-secrets -24: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -63,7 +30,7 @@ second-pass rendering result of "helmfile.yaml.part.0": merged environment: &{default map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs Affected releases are: diff --git a/pkg/app/testdata/testapply_2/skip-needs=true/log b/pkg/app/testdata/testapply_2/skip-needs=true/log index d1a55a90..65c32bd4 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=true/log +++ b/pkg/app/testdata/testapply_2/skip-needs=true/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log b/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log index 26968c1e..1f4c6d72 100644 --- a/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log +++ b/pkg/app/testdata/testapply_2/skip-needs=true_with_no_diff_on_a_release/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_3/bad_--selector/log b/pkg/app/testdata/testapply_3/bad_--selector/log new file mode 100644 index 00000000..8e3e99cf --- /dev/null +++ b/pkg/app/testdata/testapply_3/bad_--selector/log @@ -0,0 +1,33 @@ +processing file "helmfile.yaml.gotmpl" in directory "." +changing working directory to "/path/to" +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": + 0: + 1: + 2: + 3: releases: + 4: - name: kubernetes-external-secrets + 5: chart: incubator/raw + 6: namespace: kube-system + 7: + 8: - name: external-secrets + 9: chart: incubator/raw +10: namespace: default +11: labels: +12: app: test +13: needs: +14: - kube-system/kubernetes-external-secrets +15: +16: - name: my-release +17: chart: incubator/raw +18: namespace: default +19: labels: +20: app: test +21: needs: +22: - default/external-secrets +23: + +merged environment: &{default map[] map[]} +0 release(s) matching app=test_non_existent found in helmfile.yaml.gotmpl + +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log index 4193cc54..4245010a 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log index 1b585c5b..653c58c2 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_but_no_diff_on_needed_release/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log index 84e5b96e..0996c8a0 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_installed_but_disabled_release/log @@ -1,40 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: installed: false - 8: - 9: - name: external-secrets -10: chart: incubator/raw -11: namespace: default -12: labels: -13: app: test -14: needs: -15: - kube-system/kubernetes-external-secrets -16: -17: - name: my-release -18: chart: incubator/raw -19: namespace: default -20: labels: -21: app: test -22: needs: -23: - default/external-secrets -24: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -63,7 +30,7 @@ second-pass rendering result of "helmfile.yaml.part.0": merged environment: &{default map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs Affected releases are: diff --git a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log index 3018fdfa..222191de 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=false_include-needs=true_with_not_installed_and_disabled_release/log @@ -1,40 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: installed: false - 8: - 9: - name: external-secrets -10: chart: incubator/raw -11: namespace: default -12: labels: -13: app: test -14: needs: -15: - kube-system/kubernetes-external-secrets -16: -17: - name: my-release -18: chart: incubator/raw -19: namespace: default -20: labels: -21: app: test -22: needs: -23: - default/external-secrets -24: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -63,7 +30,7 @@ second-pass rendering result of "helmfile.yaml.part.0": merged environment: &{default map[] map[]} WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs Affected releases are: diff --git a/pkg/app/testdata/testapply_3/skip-needs=true/log b/pkg/app/testdata/testapply_3/skip-needs=true/log index e7200b58..3a82d6bc 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=true/log +++ b/pkg/app/testdata/testapply_3/skip-needs=true/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log b/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log index 0bb7dd4b..3c4dc215 100644 --- a/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log +++ b/pkg/app/testdata/testapply_3/skip-needs=true_with_no_diff_on_a_release/log @@ -1,39 +1,7 @@ -processing file "helmfile.yaml" in directory "." +processing file "helmfile.yaml.gotmpl" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: - 2: - 3: releases: - 4: - name: kubernetes-external-secrets - 5: chart: incubator/raw - 6: namespace: kube-system - 7: - 8: - name: external-secrets - 9: chart: incubator/raw -10: namespace: default -11: labels: -12: app: test -13: needs: -14: - kube-system/kubernetes-external-secrets -15: -16: - name: my-release -17: chart: incubator/raw -18: namespace: default -19: labels: -20: app: test -21: needs: -22: - default/external-secrets -23: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": +rendering starting for "helmfile.yaml.gotmpl.part.0": inherited=&{default map[] map[]}, overrode= +rendering result of "helmfile.yaml.gotmpl.part.0": 0: 1: 2: @@ -60,7 +28,7 @@ second-pass rendering result of "helmfile.yaml.part.0": 23: merged environment: &{default map[] map[]} -2 release(s) matching app=test found in helmfile.yaml +2 release(s) matching app=test found in helmfile.yaml.gotmpl Affected releases are: external-secrets (incubator/raw) UPDATED diff --git a/pkg/app/testdata/testdeps/smoke/log b/pkg/app/testdata/testdeps/smoke/log new file mode 100644 index 00000000..52b88928 --- /dev/null +++ b/pkg/app/testdata/testdeps/smoke/log @@ -0,0 +1,7 @@ +processing file "helmfile.yaml" in directory "." +changing working directory to "/path/to" +merged environment: &{default map[] map[]} +There are no repositories defined in your helmfile.yaml. +This means helmfile cannot update your dependencies or create a lock file. +See https://github.com/roboll/helmfile/issues/878 for more information. +changing working directory back to "/path/to" diff --git a/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log b/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log index e7d3352d..a7eea328 100644 --- a/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log +++ b/pkg/app/testdata/testdestroy/destroy_installed_but_disabled_release/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - merged environment: &{default map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log b/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log index b3ea59f1..c8731536 100644 --- a/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log +++ b/pkg/app/testdata/testdestroy/destroy_only_one_release_with_selector/log @@ -1,128 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - merged environment: &{default map[] map[]} -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 1 release(s) matching name=logging found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/testdestroy/helm3/log b/pkg/app/testdata/testdestroy/helm3/log index e7d3352d..a7eea328 100644 --- a/pkg/app/testdata/testdestroy/helm3/log +++ b/pkg/app/testdata/testdestroy/helm3/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - merged environment: &{default map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy/smoke/log b/pkg/app/testdata/testdestroy/smoke/log index 13a80305..3a28bfe7 100644 --- a/pkg/app/testdata/testdestroy/smoke/log +++ b/pkg/app/testdata/testdestroy/smoke/log @@ -1,128 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - merged environment: &{default map[] map[]} -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: @@ -136,7 +14,6 @@ GROUP RELEASES processing releases in group 1/5: default//frontend-v3, default//frontend-v2, default//frontend-v1 release "frontend-v3" processed release "frontend-v2" processed -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs release "frontend-v1" processed processing releases in group 2/5: default//backend-v2, default//backend-v1 release "backend-v2" processed diff --git a/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log b/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log index 04b1ccfd..eebb5cdb 100644 --- a/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log +++ b/pkg/app/testdata/testdestroy_2/destroy_installed_but_disabled_release/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - merged environment: &{default map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log b/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log index 917d5684..253339d8 100644 --- a/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log +++ b/pkg/app/testdata/testdestroy_2/destroy_only_one_release_with_selector/log @@ -1,128 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - merged environment: &{default map[] map[]} -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 1 release(s) matching name=logging found in helmfile.yaml processing 1 groups of releases in this order: diff --git a/pkg/app/testdata/testdestroy_2/helm3/log b/pkg/app/testdata/testdestroy_2/helm3/log index 04b1ccfd..eebb5cdb 100644 --- a/pkg/app/testdata/testdestroy_2/helm3/log +++ b/pkg/app/testdata/testdestroy_2/helm3/log @@ -1,36 +1,5 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: backend-v1 - 3: chart: charts/backend - 4: installed: false - 5: - name: frontend-v1 - 6: chart: charts/frontend - 7: needs: - 8: - backend-v1 - 9: - merged environment: &{default map[] map[]} WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 2 release(s) found in helmfile.yaml diff --git a/pkg/app/testdata/testdestroy_2/smoke/log b/pkg/app/testdata/testdestroy_2/smoke/log index d4fd6427..e8987816 100644 --- a/pkg/app/testdata/testdestroy_2/smoke/log +++ b/pkg/app/testdata/testdestroy_2/smoke/log @@ -1,128 +1,6 @@ processing file "helmfile.yaml" in directory "." changing working directory to "/path/to" -first-pass rendering starting for "helmfile.yaml.part.0": inherited=&{default map[] map[]}, overrode= -first-pass uses: &{default map[] map[]} -first-pass rendering output of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - -first-pass produced: &{default map[] map[]} -first-pass rendering result of "helmfile.yaml.part.0": {default map[] map[]} -vals: -map[] -defaultVals:[] -second-pass rendering result of "helmfile.yaml.part.0": - 0: - 1: releases: - 2: - name: database - 3: chart: charts/mysql - 4: needs: - 5: - logging - 6: - name: frontend-v1 - 7: chart: charts/frontend - 8: installed: false - 9: needs: -10: - servicemesh -11: - logging -12: - backend-v1 -13: - name: frontend-v2 -14: chart: charts/frontend -15: needs: -16: - servicemesh -17: - logging -18: - backend-v2 -19: - name: frontend-v3 -20: chart: charts/frontend -21: needs: -22: - servicemesh -23: - logging -24: - backend-v2 -25: - name: backend-v1 -26: chart: charts/backend -27: installed: false -28: needs: -29: - servicemesh -30: - logging -31: - database -32: - anotherbackend -33: - name: backend-v2 -34: chart: charts/backend -35: needs: -36: - servicemesh -37: - logging -38: - database -39: - anotherbackend -40: - name: anotherbackend -41: chart: charts/anotherbackend -42: needs: -43: - servicemesh -44: - logging -45: - database -46: - name: servicemesh -47: chart: charts/istio -48: needs: -49: - logging -50: - name: logging -51: chart: charts/fluent-bit -52: - name: front-proxy -53: chart: stable/envoy -54: - merged environment: &{default map[] map[]} -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs 10 release(s) found in helmfile.yaml processing 5 groups of releases in this order: @@ -136,7 +14,6 @@ GROUP RELEASES processing releases in group 1/5: frontend-v3, frontend-v2, frontend-v1 release "frontend-v3" processed release "frontend-v2" processed -WARNING: release frontend-v1 needs backend-v1, but backend-v1 is not installed due to installed: false. Either mark backend-v1 as installed or remove backend-v1 from frontend-v1's needs release "frontend-v1" processed processing releases in group 2/5: backend-v2, backend-v1 release "backend-v2" processed diff --git a/pkg/app/testdata/testreadfromyaml_rendertemplatelog/log b/pkg/app/testdata/testreadfromyaml_rendertemplatelog/log new file mode 100644 index 00000000..db8157f1 --- /dev/null +++ b/pkg/app/testdata/testreadfromyaml_rendertemplatelog/log @@ -0,0 +1,10 @@ +rendering starting for "": inherited=&{default map[] map[]}, overrode= +rendering result of "": + 0: + 1: releases: + 2: - name: foo + 3: chart: mychart1 + 4: - name: bar + 5: + 6: + diff --git a/pkg/app/two_pass_renderer.go b/pkg/app/two_pass_renderer.go index 221af0c2..637f99be 100644 --- a/pkg/app/two_pass_renderer.go +++ b/pkg/app/two_pass_renderer.go @@ -5,10 +5,7 @@ import ( "fmt" "strings" - "github.com/google/go-cmp/cmp" - "github.com/helmfile/helmfile/pkg/environment" - "github.com/helmfile/helmfile/pkg/runtime" "github.com/helmfile/helmfile/pkg/state" "github.com/helmfile/helmfile/pkg/tmpl" ) @@ -17,57 +14,11 @@ func prependLineNumbers(text string) string { buf := bytes.NewBufferString("") lines := strings.Split(text, "\n") for i, line := range lines { - buf.WriteString(fmt.Sprintf("%2d: %s\n", i, line)) + fmt.Fprintf(buf, "%2d: %s\n", i, line) } return buf.String() } -func (r *desiredStateLoader) renderPrestate(firstPassEnv, overrode *environment.Environment, baseDir, filename string, content []byte) (*environment.Environment, *state.HelmState) { - initEnv, err := firstPassEnv.Merge(overrode) - if err != nil { - return firstPassEnv, nil - } - tmplData := state.NewEnvironmentTemplateData(*initEnv, r.namespace, map[string]any{}) - firstPassRenderer := tmpl.NewFirstPassRenderer(baseDir, tmplData) - - // parse as much as we can, tolerate errors, this is a preparse - yamlBuf, err := firstPassRenderer.RenderTemplateContentToBuffer(content) - if err != nil { - r.logger.Debugf("first-pass rendering input of \"%s\":\n%s", filename, prependLineNumbers(string(content))) - r.logger.Debugf("template syntax error: %v", err) - if yamlBuf == nil { // we have a template syntax error, let the second parse report - return firstPassEnv, nil - } - } - yamlData := yamlBuf.String() - r.logger.Debugf("first-pass rendering output of \"%s\":\n%s", filename, prependLineNumbers(yamlData)) - - // Work-around for https://github.com/golang/go/issues/24963 - sanitized := strings.ReplaceAll(yamlData, "", "") - - if len(yamlData) != len(sanitized) { - msg := "replaced s to workaround https://github.com/golang/go/issues/24963 to address https://github.com/roboll/helmfile/issues/553:\n%s" - r.logger.Debugf(msg, cmp.Diff(yamlData, sanitized)) - } - - c := r.underlying() - c.Strict = false - // create preliminary state, as we may have an environment. Tolerate errors. - prestate, err := c.ParseAndLoad([]byte(sanitized), baseDir, filename, r.env, true, false, firstPassEnv, overrode) - if err != nil { - if _, ok := err.(*state.StateLoadError); ok { - r.logger.Debugf("could not deduce `environment:` block, configuring only .Environment.Name. error: %v", err) - } - r.logger.Debugf("error in first-pass rendering: result of \"%s\":\n%s", filename, prependLineNumbers(yamlBuf.String())) - } - - if prestate != nil { - firstPassEnv = &prestate.Env - } - - return firstPassEnv, prestate -} - type RenderOpts struct { } @@ -82,11 +33,7 @@ func (r *desiredStateLoader) renderTemplatesToYamlWithEnv(baseDir, filename stri } func (r *desiredStateLoader) twoPassRenderTemplateToYaml(inherited, overrode *environment.Environment, baseDir, filename string, content []byte) (*bytes.Buffer, error) { - // try a first pass render. This will always succeed, but can produce a limited env var phase string - if !runtime.V1Mode { - phase = "first-pass " - } r.logger.Debugf("%srendering starting for \"%s\": inherited=%v, overrode=%v", phase, filename, inherited, overrode) initEnv, err := inherited.Merge(nil) @@ -100,53 +47,14 @@ func (r *desiredStateLoader) twoPassRenderTemplateToYaml(inherited, overrode *en vals map[string]any ) - if runtime.V1Mode { - var err error + finalEnv, err = initEnv.Merge(overrode) + if err != nil { + return nil, err + } - finalEnv, err = initEnv.Merge(overrode) - if err != nil { - return nil, err - } - - vals, err = finalEnv.GetMergedValues() - if err != nil { - return nil, err - } - } else { - r.logger.Debugf("first-pass uses: %v", initEnv) - firstPassEnv, err := initEnv.Merge(nil) - if err != nil { - return nil, err - } - renderedEnv, prestate := r.renderPrestate(firstPassEnv, overrode, baseDir, filename, content) - - r.logger.Debugf("first-pass produced: %v", renderedEnv) - - mergedEnv, err := inherited.Merge(renderedEnv) - if err != nil { - return nil, err - } - - mergedEnv, err = mergedEnv.Merge(overrode) - if err != nil { - return nil, err - } - - r.logger.Debugf("first-pass rendering result of \"%s\": %v", filename, *mergedEnv) - - renderingPhase = "second-pass " - - finalEnv = mergedEnv - - vals, err = finalEnv.GetMergedValues() - if err != nil { - return nil, err - } - - if prestate != nil { - prestate.Env = *mergedEnv - r.logger.Debugf("vals:\n%v\ndefaultVals:%v", vals, prestate.DefaultValues) - } + vals, err = finalEnv.GetMergedValues() + if err != nil { + return nil, err } tmplData := state.NewEnvironmentTemplateData(*finalEnv, r.namespace, vals) diff --git a/pkg/app/two_pass_renderer_test.go b/pkg/app/two_pass_renderer_test.go index fde1630f..5190f9f6 100644 --- a/pkg/app/two_pass_renderer_test.go +++ b/pkg/app/two_pass_renderer_test.go @@ -7,7 +7,6 @@ import ( "github.com/helmfile/helmfile/pkg/helmexec" "github.com/helmfile/helmfile/pkg/remote" - "github.com/helmfile/helmfile/pkg/runtime" "github.com/helmfile/helmfile/pkg/state" "github.com/helmfile/helmfile/pkg/testhelper" "github.com/helmfile/helmfile/pkg/yaml" @@ -68,60 +67,6 @@ releases: } } -func TestReadFromYaml_RenderTemplate(t *testing.T) { - defaultValuesYaml := ` -releaseName: "hello" -conditionalReleaseTag: "yes" -` - - yamlContent := []byte(` -environments: - staging: - values: - - default/values.yaml - production: - -releases: -- name: {{ .Environment.Values.releaseName }} - chart: mychart1 - -{{ if (eq .Environment.Values.conditionalReleaseTag "yes") }} -- name: conditionalRelease -{{ end }} - -`) - - files := map[string]string{ - "/path/to/default/values.yaml": defaultValuesYaml, - } - - r, _, _ := makeLoader(files, "staging") - // test the double rendering - yamlBuf, err := r.renderTemplatesToYaml("", "", yamlContent) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - var state state.HelmState - err = yaml.Unmarshal(yamlBuf.Bytes(), &state) - - if err != nil { - t.Errorf("unexpected error: %v", err) - } - - if len(state.Releases) != 2 { - t.Fatal("there should be 2 releases") - } - - if state.Releases[0].Name != "hello" { - t.Errorf("release name should be hello") - } - - if state.Releases[1].Name != "conditionalRelease" { - t.Error("conditional release should have been present") - } -} - func testReadFromYaml_RenderTemplateLog(t *testing.T) { t.Helper() @@ -165,20 +110,7 @@ releases: } func TestReadFromYaml_RenderTemplateLog(t *testing.T) { - v := runtime.V1Mode - t.Cleanup(func() { - runtime.V1Mode = v - }) - - t.Run("v0mode", func(t *testing.T) { - runtime.V1Mode = false - testReadFromYaml_RenderTemplateLog(t) - }) - - t.Run("v1mode", func(t *testing.T) { - runtime.V1Mode = true - testReadFromYaml_RenderTemplateLog(t) - }) + testReadFromYaml_RenderTemplateLog(t) } func TestReadFromYaml_RenderTemplateWithValuesReferenceError(t *testing.T) { @@ -211,51 +143,6 @@ releases: } } -// This test shows that a gotmpl reference will get rendered correctly -// even if the pre-render disables the readFile and exec functions. -// This does not apply to .gotmpl files, which is a nice side-effect. -func TestReadFromYaml_RenderTemplateWithGotmpl(t *testing.T) { - defaultValuesYamlGotmpl := ` -releaseName: {{ readFile "nonIgnoredFile" }} -` - - yamlContent := []byte(` -environments: - staging: - values: - - values.yaml.gotmpl - production: - -{{ if (eq .Environment.Values.releaseName "release-a") }} # line 8 -releases: -- name: a - chart: mychart1 -{{ end }} -`) - - files := map[string]string{ - "/path/to/nonIgnoredFile": `release-a`, - "/path/to/values.yaml.gotmpl": defaultValuesYamlGotmpl, - } - - r, _, _ := makeLoader(files, "staging") - rendered, _ := r.renderTemplatesToYaml("", "", yamlContent) - - var state state.HelmState - err := yaml.Unmarshal(rendered.Bytes(), &state) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if len(state.Releases) != 1 { - t.Fatal("there should be 1 release") - } - - if state.Releases[0].Name != "a" { - t.Fatal("release should have been declared") - } -} - func TestReadFromYaml_RenderTemplateWithNamespace(t *testing.T) { yamlContent := []byte(`releases: - name: {{ .Namespace }}-myrelease diff --git a/pkg/config/apply.go b/pkg/config/apply.go index 296c17cc..7cfc6d3c 100644 --- a/pkg/config/apply.go +++ b/pkg/config/apply.go @@ -18,10 +18,6 @@ type ApplyOptions struct { DetailedExitcode bool // StripTrailingCR is true if trailing carriage returns should be stripped during diffing StripTrailingCR bool - // TODO: Remove this function once Helmfile v0.x - // DEPRECATED: Use skip-cleanup instead - RetainValuesFiles bool - // SkipCleanup is true if the cleanup of temporary values files should be skipped SkipCleanup bool // SkipCRDs is true if the CRDs should be skipped @@ -50,8 +46,12 @@ type ApplyOptions struct { SuppressDiff bool // Wait is true if the helm command should wait for the release to be deployed Wait bool + // WaitRetries is the number of times to retry waiting for the release to be deployed + WaitRetries int // WaitForJobs is true if the helm command should wait for the jobs to be completed WaitForJobs bool + // Propagate '--skip-schema-validation' to helmv3 template and helm install + SkipSchemaValidation bool // ReuseValues is true if the helm command should reuse the values ReuseValues bool // ResetValues is true if helm command should reset values to charts' default @@ -68,6 +68,11 @@ type ApplyOptions struct { SyncArgs string // HideNotes is the hide notes flag HideNotes bool + + // TakeOwnership is true if the ownership should be taken + TakeOwnership bool + + SyncReleaseLabels bool } // NewApply creates a new Apply @@ -116,7 +121,7 @@ func (a *ApplyImpl) StripTrailingCR() bool { // DiffOutput returns the diff output. func (a *ApplyImpl) DiffOutput() string { - return a.ApplyOptions.Output + return a.Output } // IncludeNeeds returns the include needs. @@ -134,12 +139,6 @@ func (a *ApplyImpl) IncludeTransitiveNeeds() bool { return a.ApplyOptions.IncludeTransitiveNeeds } -// TODO: Remove this function once Helmfile v0.x -// RetainValuesFiles returns the retain values files. -func (a *ApplyImpl) RetainValuesFiles() bool { - return a.ApplyOptions.RetainValuesFiles -} - // ShowSecrets returns the show secrets. func (a *ApplyImpl) ShowSecrets() bool { return a.ApplyOptions.ShowSecrets @@ -208,6 +207,11 @@ func (a *ApplyImpl) Wait() bool { return a.ApplyOptions.Wait } +// WaitRetries returns the wait retries. +func (a *ApplyImpl) WaitRetries() int { + return a.ApplyOptions.WaitRetries +} + // WaitForJobs returns the wait for jobs. func (a *ApplyImpl) WaitForJobs() bool { return a.ApplyOptions.WaitForJobs @@ -235,6 +239,11 @@ func (a *ApplyImpl) PostRendererArgs() []string { return a.ApplyOptions.PostRendererArgs } +// SkipSchemaValidation returns the SkipSchemaValidation. +func (a *ApplyImpl) SkipSchemaValidation() bool { + return a.ApplyOptions.SkipSchemaValidation +} + // Cascade returns cascade flag func (a *ApplyImpl) Cascade() string { return a.ApplyOptions.Cascade @@ -250,6 +259,16 @@ func (a *ApplyImpl) SyncArgs() string { return a.ApplyOptions.SyncArgs } +// HideNotes returns the HideNotes. func (a *ApplyImpl) HideNotes() bool { return a.ApplyOptions.HideNotes } + +// TakeOwnership returns the TakeOwnership. +func (a *ApplyImpl) TakeOwnership() bool { + return a.ApplyOptions.TakeOwnership +} + +func (a *ApplyImpl) SyncReleaseLabels() bool { + return a.ApplyOptions.SyncReleaseLabels +} diff --git a/pkg/config/charts.go b/pkg/config/charts.go deleted file mode 100644 index 859894bc..00000000 --- a/pkg/config/charts.go +++ /dev/null @@ -1,46 +0,0 @@ -// TODO: Remove this function once Helmfile v0.x -package config - -// ChartsOptions is the options for the build command -type ChartsOptions struct { - // Set is the additional values to be merged into the helm command --set flag - Set []string - // Values is the additional value files to be merged into the helm command --values flag - Values []string - // Concurrency is the maximum number of concurrent helm processes to run, 0 is unlimited - Concurrency int -} - -// NewChartsOptions creates a new Apply -func NewChartsOptions() *ChartsOptions { - return &ChartsOptions{} -} - -// ChartsImpl is impl for applyOptions -type ChartsImpl struct { - *GlobalImpl - *ChartsOptions -} - -// NewChartsImpl creates a new ChartsImpl -func NewChartsImpl(g *GlobalImpl, b *ChartsOptions) *ChartsImpl { - return &ChartsImpl{ - GlobalImpl: g, - ChartsOptions: b, - } -} - -// Concurrency returns the concurrency -func (c *ChartsImpl) Concurrency() int { - return c.ChartsOptions.Concurrency -} - -// IncludeTransitiveNeeds returns the includeTransitiveNeeds -func (c *ChartsImpl) IncludeTransitiveNeeds() bool { - return false -} - -// Values returns the values -func (c *ChartsImpl) Values() []string { - return c.ChartsOptions.Values -} diff --git a/pkg/config/config.go b/pkg/config/config.go index 7bfe1aca..f49ec705 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -1,21 +1,23 @@ package config import ( + "regexp" "strings" "github.com/helmfile/helmfile/pkg/maputil" ) func NewCLIConfigImpl(g *GlobalImpl) error { + re := regexp.MustCompile(`(?:,|^)([^\s=]+)=(['"][^'"]*['"]|[^,]+)`) optsSet := g.RawStateValuesSetString() if len(optsSet) > 0 { set := map[string]any{} for i := range optsSet { - ops := strings.Split(optsSet[i], ",") + ops := re.FindAllStringSubmatch(optsSet[i], -1) for j := range ops { - op := strings.SplitN(ops[j], "=", 2) - k := maputil.ParseKey(op[0]) - v := op[1] + op := ops[j] + k := maputil.ParseKey(op[1]) + v := op[2] maputil.Set(set, k, v, true) } diff --git a/pkg/config/delete.go b/pkg/config/delete.go deleted file mode 100644 index f688e94f..00000000 --- a/pkg/config/delete.go +++ /dev/null @@ -1,67 +0,0 @@ -// TODO: Remove this function once Helmfile v0.x -package config - -// DeleteOptions is the options for the build command -type DeleteOptions struct { - // Concurrency is the maximum number of concurrent helm processes to run, 0 is unlimited - Concurrency int - // Purge is the purge flag - Purge bool - // SkipCharts makes Delete skip `withPreparedCharts` - SkipCharts bool - // Cascade '--cascade' to helmv3 delete, available values: background, foreground, or orphan, default: background - Cascade string - // Wait '--wait' if set, will wait until all the resources are deleted before returning. It will wait for as long as --timeout - DeleteWait bool - // Timeout '--timeout', to wait for helm delete operation (default 5m0s) - DeleteTimeout int -} - -// NewDeleteOptions creates a new Apply -func NewDeleteOptions() *DeleteOptions { - return &DeleteOptions{} -} - -// DeleteImpl is impl for applyOptions -type DeleteImpl struct { - *GlobalImpl - *DeleteOptions -} - -// NewDeleteImpl creates a new DeleteImpl -func NewDeleteImpl(g *GlobalImpl, b *DeleteOptions) *DeleteImpl { - return &DeleteImpl{ - GlobalImpl: g, - DeleteOptions: b, - } -} - -// Concurrency returns the concurrency -func (c *DeleteImpl) Concurrency() int { - return c.DeleteOptions.Concurrency -} - -// Purge returns the purge -func (c *DeleteImpl) Purge() bool { - return c.DeleteOptions.Purge -} - -// SkipCharts returns skipCharts flag -func (c *DeleteImpl) SkipCharts() bool { - return c.DeleteOptions.SkipCharts -} - -// Cascade returns cascade flag -func (c *DeleteImpl) Cascade() string { - return c.DeleteOptions.Cascade -} - -// DeleteWait returns the wait flag -func (c *DeleteImpl) DeleteWait() bool { - return c.DeleteOptions.DeleteWait -} - -// DeleteTimeout returns the timeout flag -func (c *DeleteImpl) DeleteTimeout() int { - return c.DeleteOptions.DeleteTimeout -} diff --git a/pkg/config/diff.go b/pkg/config/diff.go index 0fe525e8..ac8018b9 100644 --- a/pkg/config/diff.go +++ b/pkg/config/diff.go @@ -48,6 +48,7 @@ type DiffOptions struct { DiffArgs string // SuppressOutputLineRegex is a list of regexes to suppress output lines SuppressOutputLineRegex []string + SkipSchemaValidation bool } // NewDiffOptions creates a new Apply @@ -125,7 +126,7 @@ func (a *DiffImpl) StripTrailingCR() bool { // Output returns the output func (t *DiffImpl) DiffOutput() string { - return t.DiffOptions.Output + return t.Output } // IncludeTests returns the include tests @@ -199,3 +200,7 @@ func (t *DiffImpl) PostRendererArgs() []string { func (t *DiffImpl) SuppressOutputLineRegex() []string { return t.DiffOptions.SuppressOutputLineRegex } + +func (t *DiffImpl) SkipSchemaValidation() bool { + return t.DiffOptions.SkipSchemaValidation +} diff --git a/pkg/config/global.go b/pkg/config/global.go index 23066711..fe906195 100644 --- a/pkg/config/global.go +++ b/pkg/config/global.go @@ -32,6 +32,8 @@ type GlobalOptions struct { StateValuesFile []string // SkipDeps is true if the running "helm repo update" and "helm dependency build" should be skipped SkipDeps bool + // SkipRefresh is true if the running "helm repo update" should be skipped + SkipRefresh bool // StripArgsValuesOnExitError is true if the ARGS output on exit error should be suppressed StripArgsValuesOnExitError bool // DisableForceUpdate is true if force updating repos is not desirable when executing "helm repo add" @@ -131,7 +133,7 @@ func (g *GlobalImpl) Chart() string { // FileOrDir returns the path to the Helmfile. func (g *GlobalImpl) FileOrDir() string { - file := g.GlobalOptions.File + file := g.File if file == "" { file = os.Getenv(envvar.FilePath) } @@ -141,7 +143,7 @@ func (g *GlobalImpl) FileOrDir() string { // Selectors returns the selectors to use. func (g *GlobalImpl) Selectors() []string { - return g.GlobalOptions.Selector + return g.Selector } // StateValuesSet returns the set @@ -156,12 +158,12 @@ func (g *GlobalImpl) RawStateValuesSet() []string { // RawStateValuesSetString returns the set func (g *GlobalImpl) RawStateValuesSetString() []string { - return g.GlobalOptions.StateValuesSetString + return g.StateValuesSetString } // StateValuesFiles returns the state values files func (g *GlobalImpl) StateValuesFiles() []string { - return g.GlobalOptions.StateValuesFile + return g.StateValuesFile } // EnableLiveOutput return when to pipe the stdout and stderr from Helm live to the helmfile stdout @@ -174,6 +176,11 @@ func (g *GlobalImpl) SkipDeps() bool { return g.GlobalOptions.SkipDeps } +// SkipRefresh return if running "helm repo update" +func (g *GlobalImpl) SkipRefresh() bool { + return g.GlobalOptions.SkipRefresh +} + // StripArgsValuesOnExitError return if the ARGS output on exit error should be suppressed func (g *GlobalImpl) StripArgsValuesOnExitError() bool { return g.GlobalOptions.StripArgsValuesOnExitError @@ -186,7 +193,7 @@ func (g *GlobalImpl) DisableForceUpdate() bool { // Logger returns the logger func (g *GlobalImpl) Logger() *zap.SugaredLogger { - return g.GlobalOptions.logger + return g.logger } func (g *GlobalImpl) Color() bool { @@ -219,8 +226,8 @@ func (g *GlobalImpl) Env() string { var env string switch { - case g.GlobalOptions.Environment != "": - env = g.GlobalOptions.Environment + case g.Environment != "": + env = g.Environment case os.Getenv("HELMFILE_ENVIRONMENT") != "": env = os.Getenv("HELMFILE_ENVIRONMENT") default: @@ -239,13 +246,16 @@ func (g *GlobalImpl) ValidateConfig() error { // Interactive returns the Interactive func (g *GlobalImpl) Interactive() bool { - return g.GlobalOptions.Interactive + if g.GlobalOptions.Interactive { + return true + } + return os.Getenv(envvar.Interactive) == "true" } // Args returns the args to use for helm func (g *GlobalImpl) Args() string { args := g.GlobalOptions.Args - enableHelmDebug := g.GlobalOptions.Debug + enableHelmDebug := g.Debug if enableHelmDebug { args = fmt.Sprintf("%s %s", args, "--debug") diff --git a/pkg/config/sync.go b/pkg/config/sync.go index 7c01598e..71d38034 100644 --- a/pkg/config/sync.go +++ b/pkg/config/sync.go @@ -20,6 +20,8 @@ type SyncOptions struct { SkipCRDs bool // Wait is the wait flag Wait bool + // WaitRetries is the wait retries flag + WaitRetries int // WaitForJobs is the wait for jobs flag WaitForJobs bool // ReuseValues is true if the helm command should reuse the values @@ -30,12 +32,18 @@ type SyncOptions struct { PostRenderer string // Propagate '--post-renderer-args' to helmv3 template and helm install PostRendererArgs []string + // Propagate '--skip-schema-validation' to helmv3 template and helm install + SkipSchemaValidation bool // Cascade '--cascade' to helmv3 delete, available values: background, foreground, or orphan, default: background Cascade string // SyncArgs is the list of arguments to pass to the helm upgrade command. SyncArgs string // HideNotes is the hide notes flag HideNotes bool + // TakeOwnership is the take ownership flag + TakeOwnership bool + // SyncReleaseLabels is the sync release labels flag + SyncReleaseLabels bool } // NewSyncOptions creates a new Apply @@ -106,6 +114,11 @@ func (t *SyncImpl) Wait() bool { return t.SyncOptions.Wait } +// WaitRetries returns the wait retries +func (t *SyncImpl) WaitRetries() int { + return t.SyncOptions.WaitRetries +} + // WaitForJobs returns the wait for jobs func (t *SyncImpl) WaitForJobs() bool { return t.SyncOptions.WaitForJobs @@ -132,6 +145,11 @@ func (t *SyncImpl) PostRendererArgs() []string { return t.SyncOptions.PostRendererArgs } +// SkipSchemaValidation returns the SkipSchemaValidation. +func (t *SyncImpl) SkipSchemaValidation() bool { + return t.SyncOptions.SkipSchemaValidation +} + // Cascade returns cascade flag func (t *SyncImpl) Cascade() string { return t.SyncOptions.Cascade @@ -142,6 +160,16 @@ func (t *SyncImpl) SyncArgs() string { return t.SyncOptions.SyncArgs } +// HideNotes returns the hide notes func (t *SyncImpl) HideNotes() bool { return t.SyncOptions.HideNotes } + +// TakeOwnership returns the take ownership +func (t *SyncImpl) TakeOwnership() bool { + return t.SyncOptions.TakeOwnership +} + +func (t *SyncImpl) SyncReleaseLabels() bool { + return t.SyncOptions.SyncReleaseLabels +} diff --git a/pkg/config/template.go b/pkg/config/template.go index 5ef781ea..90c82691 100644 --- a/pkg/config/template.go +++ b/pkg/config/template.go @@ -30,12 +30,16 @@ type TemplateOptions struct { IncludeNeeds bool // IncludeTransitiveNeeds is the include transitive needs flag IncludeTransitiveNeeds bool + // No-Hooks is the no hooks flag + NoHooks bool // SkipCleanup is the skip cleanup flag SkipCleanup bool // Propagate '--post-renderer' to helmv3 template and helm install PostRenderer string // Propagate '--post-renderer-args' to helmv3 template and helm install PostRendererArgs []string + // Propagate '--skip-schema-validation' to helmv3 template and helm install + SkipSchemaValidation bool // KubeVersion is the kube-version flag KubeVersion string // Propagate '--show-only` to helm template @@ -71,6 +75,11 @@ func (t *TemplateImpl) IncludeCRDs() bool { return t.TemplateOptions.IncludeCRDs } +// NoHooks returns the no hooks +func (t *TemplateImpl) NoHooks() bool { + return t.TemplateOptions.NoHooks +} + // IncludeNeeds returns the include needs func (t *TemplateImpl) IncludeNeeds() bool { return t.TemplateOptions.IncludeNeeds || t.IncludeTransitiveNeeds() @@ -135,6 +144,11 @@ func (t *TemplateImpl) PostRendererArgs() []string { return t.TemplateOptions.PostRendererArgs } +// SkipSchemaValidation returns the SkipSchemaValidation. +func (t *TemplateImpl) SkipSchemaValidation() bool { + return t.TemplateOptions.SkipSchemaValidation +} + // KubeVersion returns the the KubeVersion. func (t *TemplateImpl) KubeVersion() string { return t.TemplateOptions.KubeVersion diff --git a/pkg/envvar/const.go b/pkg/envvar/const.go index a40f5d43..0235af17 100644 --- a/pkg/envvar/const.go +++ b/pkg/envvar/const.go @@ -6,16 +6,13 @@ const ( // use helm status to check if a release exists before installing it UseHelmStatusToCheckReleaseExistence = "HELMFILE_USE_HELM_STATUS_TO_CHECK_RELEASE_EXISTENCE" - // TODO: Remove this function once Helmfile v0.x - SkipInsecureTemplateFunctions = "HELMFILE_SKIP_INSECURE_TEMPLATE_FUNCTIONS" - DisableRunnerUniqueID = "HELMFILE_DISABLE_RUNNER_UNIQUE_ID" Experimental = "HELMFILE_EXPERIMENTAL" // environment variable for experimental features, expecting "true" lower case Environment = "HELMFILE_ENVIRONMENT" FilePath = "HELMFILE_FILE_PATH" TempDir = "HELMFILE_TEMPDIR" UpgradeNoticeDisabled = "HELMFILE_UPGRADE_NOTICE_DISABLED" - V1Mode = "HELMFILE_V1MODE" GoccyGoYaml = "HELMFILE_GOCCY_GOYAML" CacheHome = "HELMFILE_CACHE_HOME" + Interactive = "HELMFILE_INTERACTIVE" ) diff --git a/pkg/errors/errors.go b/pkg/errors/errors.go index 2372e2b0..956233d3 100644 --- a/pkg/errors/errors.go +++ b/pkg/errors/errors.go @@ -85,12 +85,12 @@ func HandleExitCoder(err error) { if exitErr, ok := err.(ExitCoder); ok { if errMsg := err.Error(); errMsg != "" { - fmt.Fprintln(ErrWriter, errMsg) + _, _ = fmt.Fprintln(ErrWriter, errMsg) } OsExiter(exitErr.ExitCode()) return } - fmt.Fprintln(ErrWriter, err) + _, _ = fmt.Fprintln(ErrWriter, err) OsExiter(3) } diff --git a/pkg/errors/errors_test.go b/pkg/errors/errors_test.go index f8541d93..d147deb0 100644 --- a/pkg/errors/errors_test.go +++ b/pkg/errors/errors_test.go @@ -43,7 +43,7 @@ var ( func expect(t *testing.T, a any, b any) { _, fn, line, _ := runtime.Caller(1) - fn = strings.Replace(fn, wd+"/", "", -1) + fn = strings.ReplaceAll(fn, wd+"/", "") require.Equalf(t, a, b, "(%s:%d) Expected %v (type %v) - Got %v (type %v)", fn, line, b, reflect.TypeOf(b), a, reflect.TypeOf(a)) } diff --git a/pkg/exectest/helm.go b/pkg/exectest/helm.go index 3b7c405c..9daaf0ec 100644 --- a/pkg/exectest/helm.go +++ b/pkg/exectest/helm.go @@ -94,6 +94,8 @@ func (helm *Helm) SetEnableLiveOutput(enableLiveOutput bool) { } func (helm *Helm) SetDisableForceUpdate(forceUpdate bool) { } +func (helm *Helm) SkipSchemaValidation(skipSchemaValidation bool) { +} func (helm *Helm) AddRepo(name, repository, cafile, certfile, keyfile, username, password string, managed string, passCredentials, skipTLSVerify bool) error { helm.Repo = []string{name, repository, cafile, certfile, keyfile, username, password, managed, fmt.Sprintf("%v", passCredentials), fmt.Sprintf("%v", skipTLSVerify)} return nil diff --git a/pkg/filesystem/fs_test.go b/pkg/filesystem/fs_test.go index 49b3af1d..94219179 100644 --- a/pkg/filesystem/fs_test.go +++ b/pkg/filesystem/fs_test.go @@ -7,6 +7,7 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -39,69 +40,154 @@ func NewTestFileSystem() FileSystem { } func TestFs_resolveSymlinks(t *testing.T) { + cases := []struct { + name string + symlinkPath string + expected string + expectedErr error + }{ + { + name: "existing file symlink", + symlinkPath: "../existing_file.txt", + expected: "/real/existing_file.txt", + expectedErr: nil, + }, + { + name: "missing file symlink", + symlinkPath: "../missing_file.txt", + expected: "", + expectedErr: os.ErrExist, + }, + { + name: "local existing file symlink", + symlinkPath: "./existing_file.txt", + expected: "./existing_file.txt", + expectedErr: nil, + }, + { + name: "absolute existing file symlink", + symlinkPath: "/a/b/c/existing_file.txt", + expected: "/a/b/c/existing_file.txt", + expectedErr: nil, + }, + { + name: "current directory existing file symlink", + symlinkPath: "existing_file.txt", + expected: "existing_file.txt", + expectedErr: nil, + }, + } + ffs := NewTestFileSystem() - path, err := ffs.resolveSymlinks("../existing_file.txt") - require.NoErrorf(t, err, "Expected no error but got %v", err) - require.Equalf(t, "/real/existing_file.txt", path, "Expected absolute path %s but got %s", "/real/existing_file.txt", path) - path, err = ffs.resolveSymlinks("../missing_file.txt") - require.ErrorIsf(t, err, os.ErrExist, "Expected error %v but got %v", os.ErrExist, err) - require.Equalf(t, "", path, "Expected empty path but got %s", path) - - path, err = ffs.resolveSymlinks("./existing_file.txt") - require.NoErrorf(t, err, "Expected no error but got %v", err) - require.Equalf(t, "./existing_file.txt", path, "Expected local path %s but got %s", "./existing_file.txt", path) - - path, err = ffs.resolveSymlinks("existing_file.txt") - require.NoErrorf(t, err, "Expected no error but got %v", err) - require.Equalf(t, "existing_file.txt", path, "Expected local path %s but got %s", "existing_file.txt", path) - - path, err = ffs.resolveSymlinks("/a/b/c/existing_file.txt") - - require.NoErrorf(t, err, "Expected no error but got %v", err) - require.Equalf(t, "/a/b/c/existing_file.txt", path, "Expected absolute path %s but got %s", "/a/b/c/existing_file.txt", path) + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + path, err := ffs.resolveSymlinks(c.symlinkPath) + if c.expectedErr != nil { + require.ErrorIs(t, err, c.expectedErr) + } else { + require.NoError(t, err) + } + assert.Equal(t, c.expected, path) + }) + } } func TestFs_fileExistsDefault(t *testing.T) { + cases := []struct { + name string + filePath string + expected bool + expectedErr error + }{ + { + name: "existing file", + filePath: "existing_file.txt", + expected: true, + expectedErr: nil, + }, + { + name: "missing file", + filePath: "missing_file.txt", + expected: false, + expectedErr: os.ErrExist, + }, + } + ffs := NewTestFileSystem() - exists, err := ffs.FileExists("existing_file.txt") - require.NoErrorf(t, err, "Expected no error but got %v", err) - require.Truef(t, exists, "Expected file %s, not found", "existing_file.txt") - exists, err = ffs.FileExists("missing_file.txt") - require.Falsef(t, exists, "Not expected file %s, found", "missing_file.txt") - require.ErrorIsf(t, err, os.ErrExist, "Expected error %v but got %v", os.ErrExist, err) - - dfs := DefaultFileSystem() - exists, err = dfs.FileExists("-") - require.NoErrorf(t, err, "Expected no error but got %v", err) - require.Truef(t, exists, "Expected file %s, not found", "-") + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + exists, err := ffs.FileExists(c.filePath) + if c.expectedErr != nil { + require.ErrorIs(t, err, c.expectedErr) + } else { + require.NoError(t, err) + } + assert.Equal(t, c.expected, exists) + }) + } } func TestFs_fileExistsAtDefault(t *testing.T) { + cases := []struct { + name string + filePath string + expected bool + }{ + { + name: "existing file", + filePath: "existing_file.txt", + expected: true, + }, + { + name: "missing file", + filePath: "missing_file.txt", + expected: false, + }, + { + name: "existing dir", + filePath: "existing_dir", + expected: false, + }, + } + ffs := NewTestFileSystem() - exists := ffs.FileExistsAt("existing_file.txt") - require.Truef(t, exists, "Expected file %s, not found", "existing_file.txt") - - exists = ffs.FileExistsAt("missing_file.txt") - require.Falsef(t, exists, "Not expected file %s, found", "missing_file.txt") - - exists = ffs.FileExistsAt("existing_dir") - require.Falsef(t, exists, "Not expected file %s, found", "existing_dir") - - dfs := DefaultFileSystem() - exists = dfs.FileExistsAt("-") - require.Truef(t, exists, "Expected file %s, not found", "-") + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + exists := ffs.FileExistsAt(c.filePath) + assert.Equal(t, c.expected, exists) + }) + } } func TestFs_directoryExistsDefault(t *testing.T) { - ffs := NewTestFileSystem() - exists := ffs.DirectoryExistsAt("existing_dir") - require.Truef(t, exists, "Expected file %s, not found", "existing_dir") + cases := []struct { + name string + dirPath string + expected bool + }{ + { + name: "existing dir", + dirPath: "existing_dir", + expected: true, + }, + { + name: "missing dir", + dirPath: "missing_dir", + expected: false, + }, + } - exists = ffs.DirectoryExistsAt("missing_dir") - require.Falsef(t, exists, "Not expected file %s, found", "missing_dir") + ffs := NewTestFileSystem() + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + exists := ffs.DirectoryExistsAt(c.dirPath) + assert.Equal(t, c.expected, exists) + }) + } } func TestFsTeadFile(t *testing.T) { @@ -122,6 +208,7 @@ func TestFsTeadFile(t *testing.T) { path: "-", }, } + for _, c := range cases { t.Run(c.name, func(t *testing.T) { dir := t.TempDir() @@ -129,9 +216,6 @@ func TestFsTeadFile(t *testing.T) { dfs := DefaultFileSystem() tmpfile, err := os.Create(yamlPath) - if err != nil { - t.Errorf("create file %s error: %v", yamlPath, err) - } require.NoErrorf(t, err, "create file %s error: %v", yamlPath, err) _, err = tmpfile.Write(c.content) @@ -156,18 +240,16 @@ func TestFsTeadFile(t *testing.T) { func TestFs_DefaultBuilder(t *testing.T) { ffs := DefaultFileSystem() - if ffs.ReadFile == nil || - ffs.ReadDir == nil || - ffs.DeleteFile == nil || - ffs.FileExists == nil || - ffs.Glob == nil || - ffs.FileExistsAt == nil || - ffs.DirectoryExistsAt == nil || - ffs.Stat == nil || - ffs.Getwd == nil || - ffs.Chdir == nil || - ffs.Abs == nil || - ffs.EvalSymlinks == nil { - t.Errorf("Missing functions in DefaultFileSystem") - } + assert.NotNil(t, ffs.ReadFile) + assert.NotNil(t, ffs.ReadDir) + assert.NotNil(t, ffs.DeleteFile) + assert.NotNil(t, ffs.FileExists) + assert.NotNil(t, ffs.Glob) + assert.NotNil(t, ffs.FileExistsAt) + assert.NotNil(t, ffs.DirectoryExistsAt) + assert.NotNil(t, ffs.Stat) + assert.NotNil(t, ffs.Getwd) + assert.NotNil(t, ffs.Chdir) + assert.NotNil(t, ffs.Abs) + assert.NotNil(t, ffs.EvalSymlinks) } diff --git a/pkg/hcllang/hcl_loader_test.go b/pkg/hcllang/hcl_loader_test.go index 2cce2aee..56fc18b3 100644 --- a/pkg/hcllang/hcl_loader_test.go +++ b/pkg/hcllang/hcl_loader_test.go @@ -44,7 +44,7 @@ func TestHCL_localsTraversalsParser(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -79,7 +79,7 @@ func TestHCL_localsTraversalsAttrParser(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } func TestHCL_valuesTraversalsParser(t *testing.T) { @@ -105,7 +105,7 @@ func TestHCL_valuesTraversalsParser(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -137,7 +137,7 @@ func TestHCL_valuesTraversalsAttrParser(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -158,6 +158,6 @@ func TestHCL_resultValidate(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } diff --git a/pkg/helmexec/exec.go b/pkg/helmexec/exec.go index a980f5dc..a2044470 100644 --- a/pkg/helmexec/exec.go +++ b/pkg/helmexec/exec.go @@ -461,7 +461,7 @@ func (helm *execer) TemplateRelease(name string, chart string, flags ...string) func (helm *execer) DiffRelease(context HelmContext, name, chart, namespace string, suppressDiff bool, flags ...string) error { diffMsg := fmt.Sprintf("Comparing release=%v, chart=%v, namespace=%v\n", name, redactedURL(chart), namespace) if context.Writer != nil && !suppressDiff { - fmt.Fprint(context.Writer, diffMsg) + _, _ = fmt.Fprint(context.Writer, diffMsg) } else { helm.logger.Info(diffMsg) } @@ -519,8 +519,8 @@ func (helm *execer) ChartPull(chart string, path string, flags ...string) error if helmVersionConstraint.Check(helm.version) { // in the 3.7.0 version, the chart pull has been replaced with helm pull // https://github.com/helm/helm/releases/tag/v3.7.0 - ociChartURL, ociChartTag := resolveOciChart(chart) - helmArgs = []string{"pull", ociChartURL, "--version", ociChartTag, "--destination", path, "--untar"} + ociChartURL, _ := resolveOciChart(chart) + helmArgs = []string{"pull", ociChartURL, "--destination", path, "--untar"} helmArgs = append(helmArgs, flags...) } else { helmArgs = []string{"chart", "pull", chart} @@ -637,7 +637,7 @@ func (helm *execer) write(w io.Writer, out []byte) { if w == nil { w = os.Stdout } - fmt.Fprintf(w, "%s\n", out) + _, _ = fmt.Fprintf(w, "%s\n", out) } } diff --git a/pkg/helmexec/exec_test.go b/pkg/helmexec/exec_test.go index 6115462a..b68c3e76 100644 --- a/pkg/helmexec/exec_test.go +++ b/pkg/helmexec/exec_test.go @@ -826,20 +826,20 @@ exec: helm --kubeconfig config --kube-context dev chart pull chart helmVersion: "v3.10.0", chartName: "repo/helm-charts:0.14.0", chartPath: "path1", - chartFlags: []string{"--untardir", "/tmp/dir"}, + chartFlags: []string{"--untardir", "/tmp/dir", "--version", "0.14.0"}, listResult: `Pulling repo/helm-charts:0.14.0 -exec: helm --kubeconfig config --kube-context dev pull oci://repo/helm-charts --version 0.14.0 --destination path1 --untar --untardir /tmp/dir +exec: helm --kubeconfig config --kube-context dev pull oci://repo/helm-charts --destination path1 --untar --untardir /tmp/dir --version 0.14.0 `, }, { name: "more then v3.7.0 with rc", helmBin: "helm", helmVersion: "v3.14.0-rc.1+g69dcc92", - chartName: "repo/helm-charts:0.14.0", + chartName: "repo/helm-charts", chartPath: "path1", - chartFlags: []string{"--untardir", "/tmp/dir"}, - listResult: `Pulling repo/helm-charts:0.14.0 -exec: helm --kubeconfig config --kube-context dev pull oci://repo/helm-charts --version 0.14.0 --destination path1 --untar --untardir /tmp/dir + chartFlags: []string{"--untardir", "/tmp/dir", "--devel"}, + listResult: `Pulling repo/helm-charts +exec: helm --kubeconfig config --kube-context dev pull oci://repo/helm-charts --destination path1 --untar --untardir /tmp/dir --devel `, }, } @@ -997,7 +997,7 @@ func Test_GetPluginVersion(t *testing.T) { v3SecretPluginVersion, err := GetPluginVersion("secrets", v3PluginDirPath) if err != nil { - t.Errorf(err.Error()) + t.Error(err.Error()) } if v3SecretPluginVersion.String() != v3ExpectedVersion { t.Errorf("secrets v3 plugin version is %v, expected %v", v3SecretPluginVersion.String(), v3ExpectedVersion) @@ -1005,7 +1005,7 @@ func Test_GetPluginVersion(t *testing.T) { v4SecretPluginVersion, err := GetPluginVersion("secrets", v4PluginDirPath) if err != nil { - t.Errorf(err.Error()) + t.Error(err.Error()) } if v4SecretPluginVersion.String() != v4ExpectedVersion { t.Errorf("secrets v4 plugin version is %v, expected %v", v4SecretPluginVersion.String(), v4ExpectedVersion) diff --git a/pkg/helmexec/runner.go b/pkg/helmexec/runner.go index c1669f39..1456caf9 100644 --- a/pkg/helmexec/runner.go +++ b/pkg/helmexec/runner.go @@ -146,7 +146,7 @@ func LiveOutput(ctx context.Context, c *exec.Cmd, stripArgsValuesOnExitError boo } line = strings.TrimSuffix(line, "\n") - fmt.Fprintln(stdout, line) + _, _ = fmt.Fprintln(stdout, line) } }() diff --git a/pkg/maputil/maputil.go b/pkg/maputil/maputil.go index 8df924ee..e5cf925b 100644 --- a/pkg/maputil/maputil.go +++ b/pkg/maputil/maputil.go @@ -19,7 +19,7 @@ func CastKeysToStrings(s any) (map[string]any, error) { return nil, fmt.Errorf("unexpected type of key in map: expected string, got %T: value=%v, map=%v", typedK, typedK, src) } - castedV, err := recursivelyStringifyMapKey(v) + castedV, err := RecursivelyStringifyMapKey(v) if err != nil { return nil, err } @@ -28,7 +28,7 @@ func CastKeysToStrings(s any) (map[string]any, error) { } case map[string]any: for k, v := range src { - castedV, err := recursivelyStringifyMapKey(v) + castedV, err := RecursivelyStringifyMapKey(v) if err != nil { return nil, err } @@ -39,7 +39,7 @@ func CastKeysToStrings(s any) (map[string]any, error) { return new, nil } -func recursivelyStringifyMapKey(v any) (any, error) { +func RecursivelyStringifyMapKey(v any) (any, error) { var castedV any switch typedV := v.(type) { case map[any]any, map[string]any: @@ -51,7 +51,7 @@ func recursivelyStringifyMapKey(v any) (any, error) { case []any: a := []any{} for i := range typedV { - res, err := recursivelyStringifyMapKey(typedV[i]) + res, err := RecursivelyStringifyMapKey(typedV[i]) if err != nil { return nil, err } @@ -231,6 +231,9 @@ func MergeMaps(a, b map[string]interface{}) map[string]interface{} { out[k] = v } for k, v := range b { + if v == nil { + continue + } if v, ok := v.(map[string]interface{}); ok { if bv, ok := out[k]; ok { if bv, ok := bv.(map[string]interface{}); ok { diff --git a/pkg/maputil/maputil_test.go b/pkg/maputil/maputil_test.go index 837c5b4e..74bd9b0a 100644 --- a/pkg/maputil/maputil_test.go +++ b/pkg/maputil/maputil_test.go @@ -215,6 +215,10 @@ func TestMapUtil_MergeMaps(t *testing.T) { "app1": 3, }, } + map5 := map[string]interface{}{ + "logLevel": "error", + "replicaCount": nil, + } testMap := MergeMaps(map2, map4) equal := reflect.DeepEqual(testMap, map4) @@ -247,4 +251,17 @@ func TestMapUtil_MergeMaps(t *testing.T) { if !equal { t.Errorf("Expected a map with different keys to merge properly with another map. Expected: %v, got %v", expectedMap, testMap) } + + testMap = MergeMaps(map3, map5) + expectedMap = map[string]interface{}{ + "logLevel": "error", + "replicaCount": map[string]any{ + "app1": 3, + "awesome": 4, + }, + } + equal = reflect.DeepEqual(testMap, expectedMap) + if !equal { + t.Errorf("Expected a map with empty value not to overwrite another map's value. Expected: %v, got %v", expectedMap, testMap) + } } diff --git a/pkg/policy/checker.go b/pkg/policy/checker.go index eea0a0cd..a609b8fa 100644 --- a/pkg/policy/checker.go +++ b/pkg/policy/checker.go @@ -8,12 +8,11 @@ import ( "regexp" "slices" "strings" - - "github.com/helmfile/helmfile/pkg/runtime" + "unicode" ) var ( - EnvironmentsAndReleasesWithinSameYamlPartErr = errors.New("environments and releases cannot be defined within the same YAML part. Use --- to extract the environments into a dedicated part") + ErrEnvironmentsAndReleasesWithinSameYamlPart = errors.New("environments and releases cannot be defined within the same YAML part. Use --- to extract the environments into a dedicated part") topConfigKeysRegex = regexp.MustCompile(`^[a-zA-Z]+:`) separatorRegex = regexp.MustCompile(`^--- *$`) topkeysPriority = map[string]int{ @@ -50,7 +49,7 @@ func forbidEnvironmentsWithReleases(filePath string, content []byte) (bool, erro } for i := 0; i < len(result)-1; i++ { if result[i] != "---" && result[i+1] != "---" { - return runtime.V1Mode, EnvironmentsAndReleasesWithinSameYamlPartErr + return true, ErrEnvironmentsAndReleasesWithinSameYamlPart } } return false, nil @@ -83,13 +82,15 @@ func TopKeys(helmfileContent []byte, hasSeparator bool) []string { clines := bytes.Split(helmfileContent, []byte("\n")) for _, line := range clines { - lineStr := strings.TrimSpace(string(line)) + lineStr := strings.TrimRightFunc(string(line), unicode.IsSpace) if lineStr == "" { continue // Skip empty lines } if hasSeparator && separatorRegex.MatchString(lineStr) { topKeys = append(topKeys, lineStr) - } else if topConfigKeysRegex.MatchString(lineStr) { + } + + if topConfigKeysRegex.MatchString(lineStr) { topKey := strings.SplitN(lineStr, ":", 2)[0] topKeys = append(topKeys, topKey) } @@ -120,7 +121,7 @@ func TopConfigKeysVerifier(filePath string, helmfileContent []byte) (bool, error preKey := orderKeys[i-1] currentKey := orderKeys[i] if topkeysPriority[preKey] > topkeysPriority[currentKey] { - return runtime.V1Mode, fmt.Errorf("top-level config key %s must be defined before %s in %s", currentKey, preKey, filePath) + return true, fmt.Errorf("top-level config key %s must be defined before %s in %s", currentKey, preKey, filePath) } } return false, nil diff --git a/pkg/policy/checker_test.go b/pkg/policy/checker_test.go index b867b4ad..b7cd667f 100644 --- a/pkg/policy/checker_test.go +++ b/pkg/policy/checker_test.go @@ -4,15 +4,12 @@ import ( "testing" "github.com/stretchr/testify/require" - - "github.com/helmfile/helmfile/pkg/runtime" ) func TestForbidEnvironmentsWithReleases(t *testing.T) { testCases := []struct { name string filePath string - v1mode bool content []byte expectedErr bool isStrict bool @@ -21,7 +18,6 @@ func TestForbidEnvironmentsWithReleases(t *testing.T) { name: "no error when only releases", filePath: "helmfile.yaml", content: []byte("releases:\n"), - v1mode: false, expectedErr: false, isStrict: false, }, @@ -29,7 +25,6 @@ func TestForbidEnvironmentsWithReleases(t *testing.T) { name: "no error when only environments", filePath: "helmfile.yaml", content: []byte("environments:\n"), - v1mode: false, expectedErr: false, isStrict: false, }, @@ -37,7 +32,6 @@ func TestForbidEnvironmentsWithReleases(t *testing.T) { name: "no error when has --- between releases and environments", filePath: "helmfile.yaml", content: []byte("environments:\n---\nreleases:\n"), - v1mode: false, expectedErr: false, isStrict: false, }, @@ -45,7 +39,6 @@ func TestForbidEnvironmentsWithReleases(t *testing.T) { name: "no error when has --- between releases and environments, and --- on top of helmfile.yaml.gotmpl", filePath: "helmfile.yaml", content: []byte("---\nenvironments:\n---\nreleases:\n"), - v1mode: false, expectedErr: false, isStrict: false, }, @@ -53,32 +46,17 @@ func TestForbidEnvironmentsWithReleases(t *testing.T) { name: "error when both releases and environments", filePath: "helmfile.yaml", content: []byte("environments:\nreleases:\n"), - v1mode: false, - expectedErr: true, - isStrict: false, - }, - { - name: "error when both releases and environments for plain yaml on v1", - filePath: "helmfile.yaml", - content: []byte("environments:\nreleases:\n"), - v1mode: true, expectedErr: true, isStrict: true, }, } - v1mode := runtime.V1Mode - t.Cleanup(func() { - runtime.V1Mode = v1mode - }) - for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - runtime.V1Mode = tc.v1mode isStrict, err := forbidEnvironmentsWithReleases(tc.filePath, tc.content) require.Equal(t, tc.isStrict, isStrict, "expected isStrict=%v, got=%v", tc.isStrict, isStrict) if tc.expectedErr { - require.ErrorIsf(t, err, EnvironmentsAndReleasesWithinSameYamlPartErr, "expected error=%v, got=%v", EnvironmentsAndReleasesWithinSameYamlPartErr, err) + require.ErrorIsf(t, err, ErrEnvironmentsAndReleasesWithinSameYamlPart, "expected error=%v, got=%v", ErrEnvironmentsAndReleasesWithinSameYamlPart, err) } else { require.NoError(t, err, "expected no error but got error: %v", err) } @@ -153,26 +131,31 @@ func TestTopConfigKeysVerifier(t *testing.T) { name: "error when not correct order 00", helmfileContent: []byte("releases:\nbases:\n"), wantErr: true, + wantStrict: true, }, { name: "error when not correct order 01", helmfileContent: []byte("releases:\nhelmDefaults:\nbases:\n"), wantErr: true, + wantStrict: true, }, { name: "error when not correct order 02", helmfileContent: []byte("helmDefaults:\nreleases:\nbases:\n"), wantErr: true, + wantStrict: true, }, { name: "error when not correct order 03", helmfileContent: []byte("releases:\nva:\nve:\nbases:\n"), wantErr: true, + wantStrict: true, }, { name: "error when not correct order 04", helmfileContent: []byte("bases:\nreleases:\nenvironments:\n"), wantErr: true, + wantStrict: true, }, { name: "no error when only has bases", @@ -230,6 +213,11 @@ func TestTopKeys(t *testing.T) { helmfileContent: []byte(""), want: nil, }, + { + name: "sub level contains top level key", + helmfileContent: []byte("bases:\n releases:\n - name: test\n namespace: test\n"), + want: []string{"bases"}, + }, } for _, tt := range tests { diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index e2e407b5..7c1e1d14 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -3,24 +3,15 @@ package runtime import ( "fmt" "os" - "strconv" "github.com/helmfile/helmfile/pkg/envvar" ) -// V1Mode is false by default for Helmfile v0.x and -// true by default for Helmfile v1.x var ( - V1Mode bool - // GoccyGoYaml is set to true in order to let Helmfile use // goccy/go-yaml instead of gopkg.in/yaml.v2. // It's false by default in Helmfile v0.x and true by default for Helmfile v1.x. GoccyGoYaml bool - - // We set this via ldflags at build-time so that we can use the - // value specified at the build time as the runtime default. - v1Mode string ) func Info() string { @@ -29,22 +20,10 @@ func Info() string { yamlLib = "goccy/go-yaml" } - return fmt.Sprintf("V1 mode = %v\nYAML library = %v", V1Mode, yamlLib) + return fmt.Sprintf("YAML library = %v", yamlLib) } func init() { - // You can toggle the V1 mode at runtime via an envvar: - // - Helmfile v1.x behaves like v0.x by running it with HELMFILE_V1MODE=false - // - Helmfile v0.x behaves like v1.x by with HELMFILE_V1MODE=true - switch os.Getenv(envvar.V1Mode) { - case "true": - V1Mode = true - case "false": - V1Mode = false - default: - V1Mode, _ = strconv.ParseBool(v1Mode) - } - // You can switch the YAML library at runtime via an envvar: switch os.Getenv(envvar.GoccyGoYaml) { case "true": @@ -52,6 +31,6 @@ func init() { case "false": GoccyGoYaml = false default: - GoccyGoYaml = V1Mode + GoccyGoYaml = true } } diff --git a/pkg/state/create.go b/pkg/state/create.go index c08086d4..b175faf9 100644 --- a/pkg/state/create.go +++ b/pkg/state/create.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + "path/filepath" "slices" "strings" @@ -109,6 +110,9 @@ func (c *StateCreator) Parse(content []byte, baseDir, file string) (*HelmState, if err == io.EOF { break } else if err != nil { + if filepath.Ext(file) != ".gotmpl" { + return nil, &StateLoadError{fmt.Sprintf("failed to read %s: reading document at index %d. Started seeing this since Helmfile v1? Add the .gotmpl file extension", file, i), err} + } return nil, &StateLoadError{fmt.Sprintf("failed to read %s: reading document at index %d", file, i), err} } @@ -117,20 +121,6 @@ func (c *StateCreator) Parse(content []byte, baseDir, file string) (*HelmState, } } - // TODO: Remove this function once Helmfile v0.x - if len(state.DeprecatedReleases) > 0 { - if len(state.Releases) > 0 { - return nil, fmt.Errorf("failed to parse %s: you can't specify both `charts` and `releases` sections", file) - } - state.Releases = state.DeprecatedReleases - state.DeprecatedReleases = []ReleaseSpec{} - } - - // TODO: Remove this function once Helmfile v0.x - if state.DeprecatedContext != "" && state.HelmDefaults.KubeContext == "" { - state.HelmDefaults.KubeContext = state.DeprecatedContext - } - if c.overrideHelmBinary != "" && c.overrideHelmBinary != DefaultHelmBinary { state.DefaultHelmBinary = c.overrideHelmBinary } else if state.DefaultHelmBinary == "" { @@ -278,7 +268,11 @@ func (c *StateCreator) loadEnvValues(st *HelmState, name string, failOnMissingEn valuesFiles = append(valuesFiles, f) } envValuesEntries := append(valuesFiles, envSpec.Values...) - valuesVals, err = st.loadValuesEntries(envSpec.MissingFileHandler, envValuesEntries, c.remote, ctxEnv, name) + loadValuesEntriesEnv, err := ctxEnv.Merge(overrode) + if err != nil { + return nil, err + } + valuesVals, err = st.loadValuesEntries(envSpec.MissingFileHandler, envValuesEntries, c.remote, loadValuesEntriesEnv, name) if err != nil { return nil, err } diff --git a/pkg/state/create_test.go b/pkg/state/create_test.go index 46b1e072..4cc282be 100644 --- a/pkg/state/create_test.go +++ b/pkg/state/create_test.go @@ -280,26 +280,6 @@ func TestReadFromYaml_StrictUnmarshalling(t *testing.T) { } } -// TODO: Remove this function once Helmfile v0.x -func TestReadFromYaml_DeprecatedReleaseReferences(t *testing.T) { - yamlFile := "example/path/to/yaml/file" - yamlContent := []byte(`charts: -- name: myrelease - chart: mychart -`) - state, err := createFromYaml(yamlContent, yamlFile, DefaultEnv, logger) - if err != nil { - t.Errorf("unxpected error: %v", err) - } - - if state.Releases[0].Name != "myrelease" { - t.Errorf("unexpected release name: expected=myrelease actual=%s", state.Releases[0].Name) - } - if state.Releases[0].Chart != "mychart" { - t.Errorf("unexpected chart name: expected=mychart actual=%s", state.Releases[0].Chart) - } -} - func TestReadFromYaml_ConflictingReleasesConfig(t *testing.T) { yamlFile := "example/path/to/yaml/file" yamlContent := []byte(`charts: diff --git a/pkg/state/envvals_loader.go b/pkg/state/envvals_loader.go index b0101f34..731cc70d 100644 --- a/pkg/state/envvals_loader.go +++ b/pkg/state/envvals_loader.go @@ -65,7 +65,7 @@ func (ld *EnvironmentValuesLoader) LoadEnvironmentValues(missingFileHandler *str if strings.HasSuffix(f, ".hcl") { hclLoader.AddFile(f) } else { - tmplData := NewEnvironmentTemplateData(env, "", map[string]any{}) + tmplData := NewEnvironmentTemplateData(env, "", env.Values) r := tmpl.NewFileRenderer(ld.fs, filepath.Dir(f), tmplData) bytes, err := r.RenderToBytes(f) if err != nil { diff --git a/pkg/state/envvals_loader_test.go b/pkg/state/envvals_loader_test.go index b0f37719..764ada78 100644 --- a/pkg/state/envvals_loader_test.go +++ b/pkg/state/envvals_loader_test.go @@ -39,7 +39,7 @@ func TestEnvValsLoad_SingleValuesFile(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -93,7 +93,7 @@ func TestEnvValsLoad_EnvironmentNameFile(t *testing.T) { } if diff := cmp.Diff(tt.expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } }) } @@ -113,7 +113,7 @@ func TestEnvValsLoad_SingleValuesFileRemote(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -135,7 +135,7 @@ func TestEnvValsLoad_OverwriteNilValue_Issue1150(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -158,7 +158,7 @@ func TestEnvValsLoad_OverwriteWithNilValue_Issue1154(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -184,7 +184,7 @@ func TestEnvValsLoad_OverwriteEmptyValue_Issue1168(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) } } @@ -225,6 +225,25 @@ func TestEnvValsLoad_MultiHCL(t *testing.T) { } if diff := cmp.Diff(expected, actual); diff != "" { - t.Errorf(diff) + t.Error(diff) + } +} + +func TestEnvValsLoad_EnvironmentValues(t *testing.T) { + l := newLoader() + env := environment.New("test") + env.Values["foo"] = "bar" + + actual, err := l.LoadEnvironmentValues(nil, []any{"testdata/values.9.yaml.gotmpl"}, env, "") + if err != nil { + t.Fatal(err) + } + + expected := map[string]any{ + "foo": "bar", + } + + if diff := cmp.Diff(expected, actual); diff != "" { + t.Error(diff) } } diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index b1b2bb8d..00d29cac 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -4,8 +4,13 @@ import ( "fmt" "os" "path/filepath" + "slices" + "sort" + "strconv" + "strings" "github.com/helmfile/chartify" + "helm.sh/helm/v3/pkg/storage/driver" "github.com/helmfile/helmfile/pkg/helmexec" "github.com/helmfile/helmfile/pkg/remote" @@ -25,6 +30,39 @@ func (st *HelmState) appendHelmXFlags(flags []string, release *ReleaseSpec) []st return flags } +func formatLabels(labels map[string]string) string { + var labelsList, keys []string + for k := range labels { + if k == "" || slices.Contains(driver.GetSystemLabels(), k) { + continue + } + + keys = append(keys, k) + } + sort.Strings(keys) + + if len(keys) == 0 { + return "" + } + + for _, k := range keys { + val := labels[k] + labelsList = append(labelsList, fmt.Sprintf("%s=%s", k, val)) + } + return strings.Join(labelsList, ",") +} + +// append labels flags to helm flags, starting from helm v3.13.0 +func (st *HelmState) appendLabelsFlags(flags []string, helm helmexec.Interface, release *ReleaseSpec, syncReleaseLabels bool) []string { + if helm.IsVersionAtLeast("3.13.0") && (syncReleaseLabels || release.SyncReleaseLabels) { + labels := formatLabels(release.Labels) + if labels != "" { + flags = append(flags, "--labels", labels) + } + } + return flags +} + // append post-renderer flags to helm flags func (st *HelmState) appendPostRenderFlags(flags []string, release *ReleaseSpec, postRenderer string) []string { switch { @@ -58,6 +96,22 @@ func (st *HelmState) appendPostRenderArgsFlags(flags []string, release *ReleaseS return flags } +// append skip-schema-validation flags to helm flags +func (st *HelmState) appendSkipSchemaValidationFlags(flags []string, release *ReleaseSpec, skipSchemaValidation bool) []string { + switch { + // Check if SkipSchemaValidation is true in the release spec. + case release.SkipSchemaValidation != nil && *release.SkipSchemaValidation: + flags = append(flags, "--skip-schema-validation") + // Check if skipSchemaValidation argument is true. + case skipSchemaValidation: + flags = append(flags, "--skip-schema-validation") + // Check if SkipSchemaValidation is true in HelmDefaults. + case st.HelmDefaults.SkipSchemaValidation != nil && *st.HelmDefaults.SkipSchemaValidation: + flags = append(flags, "--skip-schema-validation") + } + return flags +} + // append suppress-output-line-regex flags to helm diff flags func (st *HelmState) appendSuppressOutputLineRegexFlags(flags []string, release *ReleaseSpec, suppressOutputLineRegex []string) []string { suppressOutputLineRegexFlags := []string{} @@ -89,15 +143,31 @@ func (st *HelmState) appendWaitForJobsFlags(flags []string, release *ReleaseSpec return flags } -func (st *HelmState) appendWaitFlags(flags []string, release *ReleaseSpec, ops *SyncOpts) []string { +func (st *HelmState) appendWaitFlags(flags []string, helm helmexec.Interface, release *ReleaseSpec, ops *SyncOpts) []string { + var hasWait bool switch { case release.Wait != nil && *release.Wait: + hasWait = true flags = append(flags, "--wait") case ops != nil && ops.Wait: + hasWait = true flags = append(flags, "--wait") case release.Wait == nil && st.HelmDefaults.Wait: + hasWait = true flags = append(flags, "--wait") } + // see https://github.com/helm/helm/releases/tag/v3.15.0 + // https://github.com/helm/helm/commit/fc74964 + if hasWait && helm.IsVersionAtLeast("3.15.0") { + switch { + case release.WaitRetries != nil && *release.WaitRetries > 0: + flags = append(flags, "--wait-retries", strconv.Itoa(*release.WaitRetries)) + case ops != nil && ops.WaitRetries > 0: + flags = append(flags, "--wait-retries", strconv.Itoa(ops.WaitRetries)) + case release.WaitRetries == nil && st.HelmDefaults.WaitRetries > 0: + flags = append(flags, "--wait-retries", strconv.Itoa(st.HelmDefaults.WaitRetries)) + } + } return flags } @@ -132,6 +202,19 @@ func (st *HelmState) appendHideNotesFlags(flags []string, helm helmexec.Interfac return flags } +// append take-ownership flags to helm flags +func (st *HelmState) appendTakeOwnershipFlags(flags []string, helm helmexec.Interface, ops *SyncOpts) []string { + // see https://github.com/helm/helm/releases/tag/v3.17.0 + if !helm.IsVersionAtLeast("3.17.0") { + return flags + } + switch { + case ops.TakeOwnership: + flags = append(flags, "--take-ownership") + } + return flags +} + // append show-only flags to helm flags func (st *HelmState) appendShowOnlyFlags(flags []string, showOnly []string) []string { showOnlyFlags := []string{} diff --git a/pkg/state/helmx_test.go b/pkg/state/helmx_test.go index fae63bfc..76f4300d 100644 --- a/pkg/state/helmx_test.go +++ b/pkg/state/helmx_test.go @@ -76,13 +76,16 @@ func TestAppendWaitFlags(t *testing.T) { name string release *ReleaseSpec syncOpts *SyncOpts + helm helmexec.Interface helmSpec HelmSpec expected []string }{ + // --wait { name: "release wait", release: &ReleaseSpec{Wait: &[]bool{true}[0]}, syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.11.0"), helmSpec: HelmSpec{}, expected: []string{"--wait"}, }, @@ -90,6 +93,7 @@ func TestAppendWaitFlags(t *testing.T) { name: "cli flags wait", release: &ReleaseSpec{}, syncOpts: &SyncOpts{Wait: true}, + helm: testutil.NewVersionHelmExec("3.11.0"), helmSpec: HelmSpec{}, expected: []string{"--wait"}, }, @@ -97,6 +101,7 @@ func TestAppendWaitFlags(t *testing.T) { name: "helm defaults wait", release: &ReleaseSpec{}, syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.11.0"), helmSpec: HelmSpec{Wait: true}, expected: []string{"--wait"}, }, @@ -104,6 +109,7 @@ func TestAppendWaitFlags(t *testing.T) { name: "release wait false", release: &ReleaseSpec{Wait: &[]bool{false}[0]}, syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.11.0"), helmSpec: HelmSpec{Wait: true}, expected: []string{}, }, @@ -111,6 +117,7 @@ func TestAppendWaitFlags(t *testing.T) { name: "cli flags wait false", release: &ReleaseSpec{}, syncOpts: &SyncOpts{}, + helm: testutil.NewVersionHelmExec("3.11.0"), helmSpec: HelmSpec{Wait: true}, expected: []string{"--wait"}, }, @@ -118,16 +125,74 @@ func TestAppendWaitFlags(t *testing.T) { name: "helm defaults wait false", release: &ReleaseSpec{}, syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.11.0"), helmSpec: HelmSpec{Wait: false}, expected: []string{}, }, + // --wait-retries + { + name: "release wait and retry unsupported", + release: &ReleaseSpec{Wait: &[]bool{true}[0], WaitRetries: &[]int{1}[0]}, + syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.11.0"), + helmSpec: HelmSpec{}, + expected: []string{"--wait"}, + }, + { + name: "release wait and retry supported", + release: &ReleaseSpec{Wait: &[]bool{true}[0], WaitRetries: &[]int{1}[0]}, + syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.15.0"), + helmSpec: HelmSpec{}, + expected: []string{"--wait", "--wait-retries", "1"}, + }, + { + name: "no wait retry", + release: &ReleaseSpec{WaitRetries: &[]int{1}[0]}, + syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.15.0"), + helmSpec: HelmSpec{}, + expected: []string{}, + }, + { + name: "cli flags wait and retry", + release: &ReleaseSpec{}, + syncOpts: &SyncOpts{Wait: true, WaitRetries: 2}, + helm: testutil.NewVersionHelmExec("3.15.0"), + helmSpec: HelmSpec{}, + expected: []string{"--wait", "--wait-retries", "2"}, + }, + { + name: "helm defaults wait retry", + release: &ReleaseSpec{}, + syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.15.0"), + helmSpec: HelmSpec{Wait: true, WaitRetries: 3}, + expected: []string{"--wait", "--wait-retries", "3"}, + }, + { + name: "release wait default retries", + release: &ReleaseSpec{Wait: &[]bool{true}[0]}, + syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.15.0"), + helmSpec: HelmSpec{WaitRetries: 4}, + expected: []string{"--wait", "--wait-retries", "4"}, + }, + { + name: "release retries default wait", + release: &ReleaseSpec{WaitRetries: &[]int{5}[0]}, + syncOpts: nil, + helm: testutil.NewVersionHelmExec("3.15.0"), + helmSpec: HelmSpec{Wait: true}, + expected: []string{"--wait", "--wait-retries", "5"}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { st := &HelmState{} st.HelmDefaults = tt.helmSpec - got := st.appendWaitFlags([]string{}, tt.release, tt.syncOpts) + got := st.appendWaitFlags([]string{}, tt.helm, tt.release, tt.syncOpts) require.Equalf(t, tt.expected, got, "appendWaitFlags() = %v, want %v", got, tt.expected) }) } @@ -321,3 +386,99 @@ func TestAppendHideNotesFlags(t *testing.T) { }) } } + +func TestAppendTakeOwnershipFlags(t *testing.T) { + type args struct { + flags []string + helm helmexec.Interface + helmSpec HelmSpec + opt *SyncOpts + expected []string + } + tests := []struct { + name string + args args + }{ + { + name: "no take-ownership when helm less than 3.17.0", + args: args{ + flags: []string{}, + helm: testutil.NewVersionHelmExec("3.16.0"), + opt: &SyncOpts{ + TakeOwnership: true, + }, + expected: []string{}, + }, + }, + { + name: "take-ownership from cmd flag", + args: args{ + flags: []string{}, + helm: testutil.NewVersionHelmExec("3.17.0"), + opt: &SyncOpts{ + TakeOwnership: true, + }, + expected: []string{"--take-ownership"}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + st := &HelmState{} + st.HelmDefaults = tt.args.helmSpec + got := st.appendTakeOwnershipFlags(tt.args.flags, tt.args.helm, tt.args.opt) + require.Equalf(t, tt.args.expected, got, "appendTakeOwnershipFlags() = %v, want %v", got, tt.args.expected) + }) + } +} + +func TestFormatLabels(t *testing.T) { + tests := []struct { + name string + labels map[string]string + want string + }{ + { + name: "empty labels", + labels: map[string]string{}, + want: "", + }, + { + name: "single label", + labels: map[string]string{"foo": "bar"}, + want: "foo=bar", + }, + { + name: "multiple labels", + labels: map[string]string{"foo": "bar", "baz": "qux"}, + want: "baz=qux,foo=bar", + }, + { + name: "multiple labels with empty value", + labels: map[string]string{"foo": "bar", "baz": "qux", "quux": ""}, + want: "baz=qux,foo=bar,quux=", + }, + { + name: "multiple labels with empty key", + labels: map[string]string{"foo": "bar", "baz": "qux", "": "quux"}, + want: "baz=qux,foo=bar", + }, + { + name: "empty label value", + labels: map[string]string{"foo": ""}, + want: "foo=", + }, + { + name: "empty label key", + labels: map[string]string{"": "bar"}, + want: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := formatLabels(tt.labels) + require.Equal(t, tt.want, got, "formatLabels() = %v, want %v", got, tt.want) + }) + } +} diff --git a/pkg/state/release.go b/pkg/state/release.go index 5cedcf91..c1b5c437 100644 --- a/pkg/state/release.go +++ b/pkg/state/release.go @@ -90,6 +90,18 @@ func (r ReleaseSpec) ExecuteTemplateExpressions(renderer *tmpl.FileRenderer) (*R result.Labels[key] = s.String() } + { + postRendererArgs := []string{} + for _, ts := range result.PostRendererArgs { + postRendererArg, err := renderer.RenderTemplateContentToString([]byte(ts)) + if err != nil { + return nil, fmt.Errorf("failed executing template expressions in release \"%s\".postRendererArgs = \"%s\": %v", r.Name, ts, err) + } + postRendererArgs = append(postRendererArgs, postRendererArg) + } + result.PostRendererArgs = postRendererArgs + } + if len(result.ValuesTemplate) > 0 { for i, t := range result.ValuesTemplate { switch ts := t.(type) { diff --git a/pkg/state/selector_test.go b/pkg/state/selector_test.go index 787a79c3..e955aed4 100644 --- a/pkg/state/selector_test.go +++ b/pkg/state/selector_test.go @@ -108,14 +108,14 @@ func TestSelectReleasesWithOverrides(t *testing.T) { }.MustLoadState(t, "/helmfile.yaml", "default") for _, tc := range testcases { + var err error state.Selectors = tc.selector - releases, err := state.GetReleasesWithOverrides() - state.Releases = releases - + state.Releases, err = state.GetReleasesWithOverrides() if err != nil { t.Fatalf("%s %s: %v", tc.selector, tc.subject, err) } + state.Releases = state.GetReleasesWithLabels() rs, err := state.GetSelectedReleases(false) if err != nil { @@ -144,13 +144,13 @@ func TestSelectReleasesWithOverridesWithIncludedTransitives(t *testing.T) { testcases := []testcase{ { - subject: "include transitives", + subject: "include transitives is false", selector: []string{"name=serviceA"}, want: []string{"serviceA"}, includeTransitiveNeeds: false, }, { - subject: "include transitives", + subject: "include transitives is true", selector: []string{"name=serviceA"}, want: []string{"serviceA", "serviceB", "serviceC"}, includeTransitiveNeeds: true, @@ -184,13 +184,13 @@ func TestSelectReleasesWithOverridesWithIncludedTransitives(t *testing.T) { }.MustLoadState(t, "/helmfile.yaml", "default") for _, tc := range testcases { + var err error state.Selectors = tc.selector - releases, err := state.GetReleasesWithOverrides() + state.Releases, err = state.GetReleasesWithOverrides() if err != nil { t.Fatalf("%s %s: %v", tc.selector, tc.subject, err) } - - state.Releases = releases + state.Releases = state.GetReleasesWithLabels() rs, err := state.GetSelectedReleases(tc.includeTransitiveNeeds) if err != nil { diff --git a/pkg/state/state.go b/pkg/state/state.go index 32e6fc9e..8d7b176d 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -59,10 +59,6 @@ type ReleaseSetSpec struct { HelmDefaults HelmSpec `yaml:"helmDefaults,omitempty"` Helmfiles []SubHelmfileSpec `yaml:"helmfiles,omitempty"` - // TODO: Remove this function once Helmfile v0.x - DeprecatedContext string `yaml:"context,omitempty"` - DeprecatedReleases []ReleaseSpec `yaml:"charts,omitempty"` - OverrideKubeContext string `yaml:"kubeContext,omitempty"` OverrideNamespace string `yaml:"namespace,omitempty"` OverrideChart string `yaml:"chart,omitempty"` @@ -160,10 +156,14 @@ type HelmSpec struct { Keyring string `yaml:"keyring,omitempty"` // EnableDNS, when set to true, enable DNS lookups when rendering templates EnableDNS bool `yaml:"enableDNS"` + // Propagate '--skip-schema-validation' to helmv3 template and helm install + SkipSchemaValidation *bool `yaml:"skipSchemaValidation,omitempty"` // Devel, when set to true, use development versions, too. Equivalent to version '>0.0.0-0' Devel bool `yaml:"devel"` // Wait, if set to true, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful Wait bool `yaml:"wait"` + // WaitRetries, if set and --wait enabled, will retry any failed check on resource state, except if HTTP status code < 500 is received, subject to the specified number of retries + WaitRetries int `yaml:"waitRetries"` // WaitForJobs, if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout WaitForJobs bool `yaml:"waitForJobs"` // Timeout is the time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300) @@ -184,6 +184,8 @@ type HelmSpec struct { // This is relevant only when your release uses a local chart or a directory containing K8s manifests or a Kustomization // as a Helm chart. SkipDeps bool `yaml:"skipDeps"` + // SkipRefresh disables running `helm dependency up` + SkipRefresh bool `yaml:"skipRefresh"` // on helm upgrade/diff, reuse values currently set in the release and merge them with the ones defined within helmfile ReuseValues bool `yaml:"reuseValues"` // Propagate '--post-renderer' to helmv3 template and helm install @@ -205,6 +207,8 @@ type HelmSpec struct { DeleteWait bool `yaml:"deleteWait"` // Timeout is the time in seconds to wait for helmfile delete command (default 300) DeleteTimeout int `yaml:"deleteTimeout"` + // SyncReleaseLabels is true if the release labels should be synced with the helmfile labels + SyncReleaseLabels bool `yaml:"syncReleaseLabels"` } // RepositorySpec that defines values for a helm repo @@ -257,6 +261,8 @@ type ReleaseSpec struct { Devel *bool `yaml:"devel,omitempty"` // Wait, if set to true, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment are in a ready state before marking the release as successful Wait *bool `yaml:"wait,omitempty"` + // WaitRetries, if set and --wait enabled, will retry any failed check on resource state, except if HTTP status code < 500 is received, subject to the specified number of retries + WaitRetries *int `yaml:"waitRetries,omitempty"` // WaitForJobs, if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout WaitForJobs *bool `yaml:"waitForJobs,omitempty"` // Timeout is the time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300) @@ -277,6 +283,8 @@ type ReleaseSpec struct { Condition string `yaml:"condition,omitempty"` // CreateNamespace, when set to true (default), --create-namespace is passed to helm3 on install (ignored for helm2) CreateNamespace *bool `yaml:"createNamespace,omitempty"` + // ReuseValues, on helm upgrade/diff, reuse values currently set in the release and merge them with the ones defined within helmfile + ReuseValues *bool `yaml:"reuseValues,omitempty"` // DisableOpenAPIValidation is rarely used to bypass OpenAPI validations only that is used for e.g. // work-around against broken CRs @@ -304,13 +312,14 @@ type ReleaseSpec struct { Hooks []event.Hook `yaml:"hooks,omitempty"` // Name is the name of this release - Name string `yaml:"name,omitempty"` - Namespace string `yaml:"namespace,omitempty"` - Labels map[string]string `yaml:"labels,omitempty"` - Values []any `yaml:"values,omitempty"` - Secrets []any `yaml:"secrets,omitempty"` - SetValues []SetValue `yaml:"set,omitempty"` - duration time.Duration + Name string `yaml:"name,omitempty"` + Namespace string `yaml:"namespace,omitempty"` + Labels map[string]string `yaml:"labels,omitempty"` + Values []any `yaml:"values,omitempty"` + Secrets []any `yaml:"secrets,omitempty"` + SetValues []SetValue `yaml:"set,omitempty"` + SetStringValues []SetValue `yaml:"setString,omitempty"` + duration time.Duration ValuesTemplate []any `yaml:"valuesTemplate,omitempty"` SetValuesTemplate []SetValue `yaml:"setTemplate,omitempty"` @@ -374,9 +383,15 @@ type ReleaseSpec struct { // as a Helm chart. SkipDeps *bool `yaml:"skipDeps,omitempty"` + // SkipRefresh disables running `helm dependency up` + SkipRefresh *bool `yaml:"skipRefresh,omitempty"` + // Propagate '--post-renderer' to helmv3 template and helm install PostRenderer *string `yaml:"postRenderer,omitempty"` + // Propagate '--skip-schema-validation' to helmv3 template and helm install + SkipSchemaValidation *bool `yaml:"skipSchemaValidation,omitempty"` + // Propagate '--post-renderer-args' to helmv3 template and helm install PostRendererArgs []string `yaml:"postRendererArgs,omitempty"` @@ -396,6 +411,8 @@ type ReleaseSpec struct { DeleteWait *bool `yaml:"deleteWait,omitempty"` // Timeout is the time in seconds to wait for helmfile delete command (default 300) DeleteTimeout *int `yaml:"deleteTimeout,omitempty"` + // SyncReleaseLabels is true if the release labels should be synced with the helmfile labels + SyncReleaseLabels bool `yaml:"syncReleaseLabels"` } func (r *Inherits) UnmarshalYAML(unmarshal func(any) error) error { @@ -439,9 +456,10 @@ type SetValue struct { // AffectedReleases hold the list of released that where updated, deleted, or in error type AffectedReleases struct { - Upgraded []*ReleaseSpec - Deleted []*ReleaseSpec - Failed []*ReleaseSpec + Upgraded []*ReleaseSpec + Deleted []*ReleaseSpec + Failed []*ReleaseSpec + DeleteFailed []*ReleaseSpec } // DefaultEnv is the default environment to use for helm commands @@ -472,7 +490,17 @@ func (st *HelmState) reformat(spec *ReleaseSpec) []string { var needs []string releaseInstalledInfo := make(map[string]bool) for _, r := range st.OrginReleases { - releaseInstalledInfo[r.Name] = r.Desired() + kubecontext := r.KubeContext + namespace := r.Namespace + + if st.OverrideKubeContext != "" { + kubecontext = st.OverrideKubeContext + } + if st.OverrideNamespace != "" { + namespace = st.OverrideNamespace + } + + releaseInstalledInfo[fmt.Sprintf("%s/%s/%s", kubecontext, namespace, r.Name)] = r.Desired() } // Since the representation differs between needs and id, @@ -485,9 +513,6 @@ func (st *HelmState) reformat(spec *ReleaseSpec) []string { components := strings.Split(n, "/") name = components[len(components)-1] - if !releaseInstalledInfo[name] { - st.logger.Warnf("WARNING: %s", fmt.Sprintf("release %s needs %s, but %s is not installed due to installed: false. Either mark %s as installed or remove %s from %s's needs", spec.Name, name, name, name, name, spec.Name)) - } if len(components) > 1 { ns = components[len(components)-2] @@ -503,6 +528,10 @@ func (st *HelmState) reformat(spec *ReleaseSpec) []string { kubecontext = spec.KubeContext } + if spec.Desired() && !releaseInstalledInfo[fmt.Sprintf("%s/%s/%s", kubecontext, ns, name)] { + st.logger.Warnf("WARNING: %s", fmt.Sprintf("release %s needs %s, but %s is not installed due to installed: false. Either mark %s as installed or remove %s from %s's needs", spec.Name, name, name, name, name, spec.Name)) + } + var componentsAfterOverride []string if kubecontext != "" { @@ -571,7 +600,7 @@ func (st *HelmState) SyncRepos(helm RepoUpdater, shouldSkip map[string]bool) ([] func gatherUsernamePassword(repoName string, username string, password string) (string, string) { var user, pass string - replacedRepoName := strings.ToUpper(strings.Replace(repoName, "-", "_", -1)) + replacedRepoName := strings.ToUpper(strings.ReplaceAll(repoName, "-", "_")) if username != "" { user = username } else if u := os.Getenv(fmt.Sprintf("%s_USERNAME", replacedRepoName)); u != "" { @@ -679,7 +708,7 @@ func (st *HelmState) prepareSyncReleases(helm helmexec.Interface, additionalValu flags = append(flags, "--skip-crds") } - flags = st.appendValuesControlModeFlag(flags, opts.ReuseValues, opts.ResetValues) + flags = st.appendValuesControlModeFlag(flags, opts.ReuseValues, opts.ResetValues, release) if len(errs) > 0 { results <- syncPrepareResult{errors: errs, files: files} @@ -764,17 +793,21 @@ func (st *HelmState) DetectReleasesToBeDeleted(helm helmexec.Interface, releases } type SyncOpts struct { - Set []string - SkipCleanup bool - SkipCRDs bool - Wait bool - WaitForJobs bool - ReuseValues bool - ResetValues bool - PostRenderer string - PostRendererArgs []string - SyncArgs string - HideNotes bool + Set []string + SkipCleanup bool + SkipCRDs bool + Wait bool + WaitRetries int + WaitForJobs bool + SyncReleaseLabels bool + ReuseValues bool + ResetValues bool + PostRenderer string + SkipSchemaValidation bool + PostRendererArgs []string + SyncArgs string + HideNotes bool + TakeOwnership bool } type SyncOpt interface{ Apply(*SyncOpts) } @@ -873,13 +906,13 @@ func (st *HelmState) DeleteReleasesForSync(affectedReleases *AffectedReleases, h m.Lock() start := time.Now() if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, release) + affectedReleases.DeleteFailed = append(affectedReleases.Failed, release) relErr = newReleaseFailedError(release, err) } else if err := helm.DeleteRelease(context, release.Name, deletionFlags...); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, release) + affectedReleases.DeleteFailed = append(affectedReleases.Failed, release) relErr = newReleaseFailedError(release, err) } else if _, err := st.triggerReleaseEvent("postuninstall", nil, release, "sync"); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, release) + affectedReleases.DeleteFailed = append(affectedReleases.Failed, release) relErr = newReleaseFailedError(release, err) } else { affectedReleases.Deleted = append(affectedReleases.Deleted, release) @@ -1099,6 +1132,7 @@ type ChartPrepareOptions struct { ForceDownload bool SkipRepos bool SkipDeps bool + SkipRefresh bool SkipResolve bool SkipCleanup bool // Validate is a helm-3-only option. When it is set to true, it configures chartify to pass --validate to helm-template run by it. @@ -1106,6 +1140,7 @@ type ChartPrepareOptions struct { Validate bool IncludeCRDs *bool Wait bool + WaitRetries int WaitForJobs bool OutputDir string OutputDirTemplate string @@ -1113,6 +1148,7 @@ type ChartPrepareOptions struct { Concurrency int KubeVersion string Set []string + Values []string // Delete wait DeleteWait bool DeleteTimeout int @@ -1280,6 +1316,10 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre chartifyOpts.KubeVersion = st.getKubeVersion(release, opts.KubeVersion) chartifyOpts.ApiVersions = st.getApiVersions(release) + if opts.Values != nil { + chartifyOpts.ValuesFiles = append(opts.Values, chartifyOpts.ValuesFiles...) + } + // https://github.com/helmfile/helmfile/pull/867 // https://github.com/helmfile/helmfile/issues/895 var flags []string @@ -1347,7 +1387,8 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre // only fetch chart if it is not already fetched if _, err := os.Stat(chartPath); os.IsNotExist(err) { - fetchFlags := st.chartVersionFlags(release) + var fetchFlags []string + fetchFlags = st.appendChartVersionFlags(fetchFlags, release) fetchFlags = append(fetchFlags, "--untar", "--untardir", chartPath) if err := helm.Fetch(chartName, fetchFlags...); err != nil { results <- &chartPrepareResult{err: err} @@ -1363,6 +1404,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre chartPath = filepath.Dir(fullChartPath) } } + results <- &chartPrepareResult{ releaseName: release.Name, chartName: chartName, @@ -1370,7 +1412,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre releaseContext: release.KubeContext, chartPath: chartPath, buildDeps: buildDeps, - skipRefresh: !isLocal, + skipRefresh: !isLocal || opts.SkipRefresh, chartFetchedByGoGetter: chartFetchedByGoGetter, } } @@ -1425,6 +1467,7 @@ func (st *HelmState) runHelmDepBuilds(helm helmexec.Interface, concurrency int, // So we shouldn't use goroutines like we do for other helm operations here. // // See https://github.com/roboll/helmfile/issues/1521 + for _, r := range builds { buildDepsFlags := getBuildDepsFlags(r) if err := helm.BuildDeps(r.releaseName, r.chartPath, buildDepsFlags...); err != nil { @@ -1456,11 +1499,14 @@ type TemplateOpts struct { SkipCleanup bool OutputDirTemplate string IncludeCRDs bool + NoHooks bool SkipTests bool PostRenderer string PostRendererArgs []string KubeVersion string ShowOnly []string + // Propagate '--skip-schema-validation' to helmv3 template and helm install + SkipSchemaValidation bool } type TemplateOpt interface{ Apply(*TemplateOpts) } @@ -1538,6 +1584,10 @@ func (st *HelmState) TemplateReleases(helm helmexec.Interface, outputDir string, flags = append(flags, "--include-crds") } + if opts.NoHooks { + flags = append(flags, "--no-hooks") + } + if opts.SkipTests { flags = append(flags, "--skip-tests") } @@ -1753,7 +1803,7 @@ type diffPrepareResult struct { // commonDiffFlags returns common flags for helm diff, not in release-specific context func (st *HelmState) commonDiffFlags(detailedExitCode bool, stripTrailingCR bool, includeTests bool, suppress []string, suppressSecrets bool, showSecrets bool, noHooks bool, opt *DiffOpts) []string { - var flags []string + var flags = []string{} if detailedExitCode { flags = append(flags, "--detailed-exitcode") @@ -1797,8 +1847,6 @@ func (st *HelmState) commonDiffFlags(detailedExitCode bool, stripTrailingCR bool flags = append(flags, "--output", opt.Output) } - flags = st.appendValuesControlModeFlag(flags, opt.ReuseValues, opt.ResetValues) - if opt.Set != nil { for _, s := range opt.Set { flags = append(flags, "--set", s) @@ -1912,6 +1960,8 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu flags = append(flags, "--values", valfile) } + flags = st.appendValuesControlModeFlag(flags, opt.ReuseValues, opt.ResetValues, release) + flags = append(flags, commonDiffFlags...) if len(errs) > 0 { @@ -1928,7 +1978,7 @@ func (st *HelmState) prepareDiffReleases(helm helmexec.Interface, additionalValu func() { for i := 0; i < numReleases; i++ { res := <-results - if res.errors != nil && len(res.errors) > 0 { + if len(res.errors) > 0 { for _, e := range res.errors { errs = append(errs, e) } @@ -1989,6 +2039,7 @@ type DiffOpts struct { PostRenderer string PostRendererArgs []string SuppressOutputLineRegex []string + SkipSchemaValidation bool } func (o *DiffOpts) Apply(opts *DiffOpts) { @@ -2138,18 +2189,24 @@ func (st *HelmState) DeleteReleases(affectedReleases *AffectedReleases, helm hel start := time.Now() if _, err := st.triggerReleaseEvent("preuninstall", nil, &release, "delete"); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, &release) + release.duration = time.Since(start) + + affectedReleases.DeleteFailed = append(affectedReleases.Failed, &release) return err } if err := helm.DeleteRelease(context, release.Name, flags...); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, &release) + release.duration = time.Since(start) + + affectedReleases.DeleteFailed = append(affectedReleases.Failed, &release) return err } if _, err := st.triggerReleaseEvent("postuninstall", nil, &release, "delete"); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, &release) + release.duration = time.Since(start) + + affectedReleases.DeleteFailed = append(affectedReleases.Failed, &release) return err } release.duration = time.Since(start) @@ -2222,16 +2279,40 @@ func (st *HelmState) GetReleasesWithOverrides() ([]ReleaseSpec, error) { return rs, nil } +func (st *HelmState) GetReleasesWithLabels() []ReleaseSpec { + var rs []ReleaseSpec + for _, r := range st.Releases { + spec := r + labels := map[string]string{} + // apply common labels + for k, v := range st.CommonLabels { + labels[k] = v + } + for k, v := range spec.Labels { + labels[k] = v + } + // Let the release name, namespace, and chart be used as a tag + labels["name"] = r.Name + labels["namespace"] = r.Namespace + // Strip off just the last portion for the name stable/newrelic would give newrelic + chartSplit := strings.Split(r.Chart, "/") + labels["chart"] = chartSplit[len(chartSplit)-1] + spec.Labels = labels + rs = append(rs, spec) + } + return rs +} + func (st *HelmState) SelectReleases(includeTransitiveNeeds bool) ([]Release, error) { values := st.Values() - rs, err := markExcludedReleases(st.Releases, st.Selectors, st.CommonLabels, values, includeTransitiveNeeds) + rs, err := markExcludedReleases(st.Releases, st.Selectors, values, includeTransitiveNeeds) if err != nil { return nil, err } return rs, nil } -func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabels map[string]string, values map[string]any, includeTransitiveNeeds bool) ([]Release, error) { +func markExcludedReleases(releases []ReleaseSpec, selectors []string, values map[string]any, includeTransitiveNeeds bool) ([]Release, error) { var filteredReleases []Release filters := []ReleaseFilter{} for _, label := range selectors { @@ -2242,27 +2323,8 @@ func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabe filters = append(filters, f) } for _, r := range releases { - // Do not add any label without any filter, see #276 - if len(filters) > 0 { - if r.Labels == nil { - r.Labels = map[string]string{} - } - // Let the release name, namespace, and chart be used as a tag - r.Labels["name"] = r.Name - r.Labels["namespace"] = r.Namespace - // Strip off just the last portion for the name stable/newrelic would give newrelic - chartSplit := strings.Split(r.Chart, "/") - r.Labels["chart"] = chartSplit[len(chartSplit)-1] - // Merge CommonLabels into release labels - for k, v := range commonLabels { - r.Labels[k] = v - } - } var filterMatch bool for _, f := range filters { - if r.Labels == nil { - r.Labels = map[string]string{} - } if f.Match(r) { filterMatch = true break @@ -2273,6 +2335,7 @@ func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabe if err != nil { return nil, fmt.Errorf("failed to parse condition in release %s: %w", r.Name, err) } + // reset the labels to the original res := Release{ ReleaseSpec: r, Filtered: (len(filters) > 0 && !filterMatch) || (!conditionMatch), @@ -2627,26 +2690,46 @@ func (st *HelmState) kubeConnectionFlags(release *ReleaseSpec) []string { } func (st *HelmState) appendChartDownloadFlags(flags []string, release *ReleaseSpec) []string { - var repoSkipTLSVerify, repoPlainHttp bool repo, _ := st.GetRepositoryAndNameFromChartName(release.Chart) - if repo != nil { - repoPlainHttp = repo.PlainHttp - repoSkipTLSVerify = repo.SkipTLSVerify - } - - if release.PlainHttp || st.HelmDefaults.PlainHttp || repoPlainHttp { + if st.needsPlainHttp(release, repo) { flags = append(flags, "--plain-http") // --insecure-skip-tls-verify nullifies --plain-http in helm, omit it if PlainHttp is specified return flags } - if release.InsecureSkipTLSVerify || st.HelmDefaults.InsecureSkipTLSVerify || repoSkipTLSVerify { + if st.needsInsecureSkipTLSVerify(release, repo) { flags = append(flags, "--insecure-skip-tls-verify") } return flags } +func (st *HelmState) needsPlainHttp(release *ReleaseSpec, repo *RepositorySpec) bool { + var repoPlainHttp, relPlainHttp bool + if repo != nil { + repoPlainHttp = repo.PlainHttp + } + + if release != nil { + relPlainHttp = release.PlainHttp + } + + return relPlainHttp || st.HelmDefaults.PlainHttp || repoPlainHttp +} + +func (st *HelmState) needsInsecureSkipTLSVerify(release *ReleaseSpec, repo *RepositorySpec) bool { + var repoSkipTLSVerify, relSkipTLSVerify bool + if repo != nil { + repoSkipTLSVerify = repo.SkipTLSVerify + } + + if release != nil { + relSkipTLSVerify = release.InsecureSkipTLSVerify + } + + return relSkipTLSVerify || st.HelmDefaults.InsecureSkipTLSVerify || repoSkipTLSVerify +} + func (st *HelmState) timeoutFlags(release *ReleaseSpec) []string { var flags []string @@ -2664,12 +2747,13 @@ func (st *HelmState) timeoutFlags(release *ReleaseSpec) []string { } func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSpec, workerIndex int, opt *SyncOpts) ([]string, []string, error) { - flags := st.chartVersionFlags(release) + var flags []string + flags = st.appendChartVersionFlags(flags, release) if release.EnableDNS != nil && *release.EnableDNS || release.EnableDNS == nil && st.HelmDefaults.EnableDNS { flags = append(flags, "--enable-dns") } - flags = st.appendWaitFlags(flags, release, opt) + flags = st.appendWaitFlags(flags, helm, release, opt) flags = st.appendWaitForJobsFlags(flags, release, opt) // non-OCI chart should be verified here @@ -2711,15 +2795,20 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp flags = append(flags, "--disable-openapi-validation") } + postRenderer := "" + syncReleaseLabels := false + if opt != nil { + postRenderer = opt.PostRenderer + syncReleaseLabels = opt.SyncReleaseLabels + } + flags = st.appendConnectionFlags(flags, release) flags = st.appendChartDownloadFlags(flags, release) flags = st.appendHelmXFlags(flags, release) - postRenderer := "" - if opt != nil { - postRenderer = opt.PostRenderer - } + flags = st.appendLabelsFlags(flags, helm, release, syncReleaseLabels) + flags = st.appendPostRenderFlags(flags, release, postRenderer) var postRendererArgs []string @@ -2728,9 +2817,19 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp } flags = st.appendPostRenderArgsFlags(flags, release, postRendererArgs) + skipSchemaValidation := false + if opt != nil { + skipSchemaValidation = opt.SkipSchemaValidation + } + + flags = st.appendSkipSchemaValidationFlags(flags, release, skipSchemaValidation) + // append hide-notes flag flags = st.appendHideNotesFlags(flags, helm, opt) + // append take-ownership flag + flags = st.appendTakeOwnershipFlags(flags, helm, opt) + flags = st.appendExtraSyncFlags(flags, opt) common, clean, err := st.namespaceAndValuesFlags(helm, release, workerIndex) @@ -2742,26 +2841,27 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseSpec, workerIndex int, opt *TemplateOpts) ([]string, []string, error) { var flags []string - - flags = st.chartVersionFlags(release) - + flags = st.appendChartVersionFlags(flags, release) flags = st.appendHelmXFlags(flags, release) - postRenderer := "" var postRendererArgs []string - kubeVersion := "" var showOnly []string + postRenderer := "" + kubeVersion := "" + skipSchemaValidation := false if opt != nil { postRenderer = opt.PostRenderer postRendererArgs = opt.PostRendererArgs kubeVersion = opt.KubeVersion showOnly = opt.ShowOnly + skipSchemaValidation = opt.SkipSchemaValidation } flags = st.appendPostRenderFlags(flags, release, postRenderer) flags = st.appendPostRenderArgsFlags(flags, release, postRendererArgs) flags = st.appendApiVersionsFlags(flags, release, kubeVersion) flags = st.appendChartDownloadFlags(flags, release) flags = st.appendShowOnlyFlags(flags, showOnly) + flags = st.appendSkipSchemaValidationFlags(flags, release, skipSchemaValidation) common, files, err := st.namespaceAndValuesFlags(helm, release, workerIndex) if err != nil { @@ -2772,7 +2872,8 @@ func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseS func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, disableValidation bool, workerIndex int, opt *DiffOpts) ([]string, []string, error) { settings := cli.New() - flags := st.chartVersionFlags(release) + var flags []string + flags = st.appendChartVersionFlags(flags, release) disableOpenAPIValidation := false if release.DisableOpenAPIValidation != nil { @@ -2800,11 +2901,21 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, // `helm template --validate` and `helm upgrade --dry-run` ignore `--kube-version` flag. // For the moment, not specifying kubeVersion. flags = st.appendApiVersionsFlags(flags, release, "") - flags = st.appendConnectionFlags(flags, release) - flags = st.appendChartDownloadFlags(flags, release) + // `helm diff` does not support the `--plain-http` flag, this needs to be removed + repo, _ := st.GetRepositoryAndNameFromChartName(release.Chart) + if st.needsPlainHttp(release, repo) { + var cleanFlags []string + for _, flag := range flags { + if flag != "--plain-http" { + cleanFlags = append(cleanFlags, flag) + } + } + flags = cleanFlags + } + for _, flag := range flags { if flag == "--insecure-skip-tls-verify" { diffVersion, err := helmexec.GetPluginVersion("diff", settings.PluginsDirectory) @@ -2835,6 +2946,12 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, } flags = st.appendPostRenderArgsFlags(flags, release, postRendererArgs) + skipSchemaValidation := false + if opt != nil { + skipSchemaValidation = opt.SkipSchemaValidation + } + flags = st.appendSkipSchemaValidationFlags(flags, release, skipSchemaValidation) + suppressOutputLineRegex := []string{} if opt != nil { suppressOutputLineRegex = opt.SuppressOutputLineRegex @@ -2860,9 +2977,7 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec, return append(flags, common...), files, nil } -func (st *HelmState) chartVersionFlags(release *ReleaseSpec) []string { - flags := []string{} - +func (st *HelmState) appendChartVersionFlags(flags []string, release *ReleaseSpec) []string { if release.Version != "" { flags = append(flags, "--version", release.Version) } @@ -2906,8 +3021,8 @@ func (st *HelmState) chartOCIFlags(r *ReleaseSpec) []string { return flags } -func (st *HelmState) appendValuesControlModeFlag(flags []string, reuseValues bool, resetValues bool) []string { - if !resetValues && (st.HelmDefaults.ReuseValues || reuseValues) { +func (st *HelmState) appendValuesControlModeFlag(flags []string, reuseValues bool, resetValues bool, release *ReleaseSpec) []string { + if !resetValues && ((release.ReuseValues != nil && *release.ReuseValues || release.ReuseValues == nil && st.HelmDefaults.ReuseValues) || reuseValues) { flags = append(flags, "--reuse-values") } else { flags = append(flags, "--reset-values") @@ -3292,6 +3407,15 @@ func (st *HelmState) namespaceAndValuesFlags(helm helmexec.Interface, release *R flags = append(flags, setFlags...) } + if len(release.SetStringValues) > 0 { + setStringFlags, err := st.setStringFlags(release.SetStringValues) + if err != nil { + return nil, files, fmt.Errorf("Failed to render set string value entry in %s for release %s: %v", st.FilePath, release.Name, err) + } + + flags = append(flags, setStringFlags...) + } + /*********** * START 'env' section for backwards compatibility ***********/ @@ -3351,6 +3475,34 @@ func (st *HelmState) setFlags(setValues []SetValue) ([]string, error) { return flags, nil } +// setStringFlags is to generate the set-string flags for helm +func (st *HelmState) setStringFlags(setValues []SetValue) ([]string, error) { + var flags []string + + for _, set := range setValues { + if set.Value != "" { + renderedValue, err := renderValsSecrets(st.valsRuntime, set.Value) + if err != nil { + return nil, err + } + flags = append(flags, "--set-string", fmt.Sprintf("%s=%s", escape(set.Name), escape(renderedValue[0]))) + } else if len(set.Values) > 0 { + renderedValues, err := renderValsSecrets(st.valsRuntime, set.Values...) + if err != nil { + return nil, err + } + items := make([]string, len(renderedValues)) + for i, raw := range renderedValues { + items[i] = escape(raw) + } + v := strings.Join(items, ",") + flags = append(flags, "--set-string", fmt.Sprintf("%s={%s}", escape(set.Name), v)) + } + } + + return flags, nil +} + // renderValsSecrets helper function which renders 'ref+.*' secrets func renderValsSecrets(e vals.Evaluator, input ...string) ([]string, error) { output := make([]string, len(input)) @@ -3386,7 +3538,7 @@ func hideChartCredentials(chartCredentials string) (string, error) { // DisplayAffectedReleases logs the upgraded, deleted and in error releases func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger) { - if ar.Upgraded != nil && len(ar.Upgraded) > 0 { + if len(ar.Upgraded) > 0 { logger.Info("\nUPDATED RELEASES:") tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"}, prettytable.Column{Header: "NAMESPACE", MinWidth: 6}, @@ -3408,7 +3560,7 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger) { } logger.Info(tbl.String()) } - if ar.Deleted != nil && len(ar.Deleted) > 0 { + if len(ar.Deleted) > 0 { logger.Info("\nDELETED RELEASES:") tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"}, prettytable.Column{Header: "NAMESPACE", MinWidth: 6}, @@ -3423,7 +3575,7 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger) { } logger.Info(tbl.String()) } - if ar.Failed != nil && len(ar.Failed) > 0 { + if len(ar.Failed) > 0 { logger.Info("\nFAILED RELEASES:") tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"}, prettytable.Column{Header: "NAMESPACE", MinWidth: 6}, @@ -3440,6 +3592,21 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger) { } logger.Info(tbl.String()) } + if len(ar.DeleteFailed) > 0 { + logger.Info("\nFAILED TO DELETE RELEASES:") + tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"}, + prettytable.Column{Header: "NAMESPACE", MinWidth: 6}, + prettytable.Column{Header: "DURATION", AlignRight: true}, + ) + tbl.Separator = " " + for _, release := range ar.DeleteFailed { + err := tbl.AddRow(release.Name, release.Namespace, release.duration.Round(time.Second)) + if err != nil { + logger.Warn("Could not add row, %v", err) + } + } + logger.Info(tbl.String()) + } } func escape(value string) string { @@ -3741,10 +3908,10 @@ func (st *HelmState) getOCIChart(release *ReleaseSpec, tempDir string, helm helm st.logger.Debugf("chart already exists at %s", chartPath) } else { flags := st.chartOCIFlags(release) - - // apprnd flags about keyring and verify flags = st.appendVerifyFlags(flags, release) flags = st.appendKeyringFlags(flags, release) + flags = st.appendChartDownloadFlags(flags, release) + flags = st.appendChartVersionFlags(flags, release) err := helm.ChartPull(qualifiedChartName, chartPath, flags...) if err != nil { @@ -3780,31 +3947,36 @@ func (st *HelmState) IsOCIChart(chart string) bool { return repo.OCI } -func (st *HelmState) getOCIQualifiedChartName(release *ReleaseSpec, helm helmexec.Interface) (qualifiedChartName, chartName, chartVersion string, err error) { - chartVersion = "latest" - if release.Version != "" { +func (st *HelmState) getOCIQualifiedChartName(release *ReleaseSpec, helm helmexec.Interface) (string, string, string, error) { + chartVersion := "latest" + if st.isDevelopment(release) && release.Version == "" { + // omit version, otherwise --devel flag is ignored by helm and helm-diff + chartVersion = "" + } else if release.Version != "" { chartVersion = release.Version } + if !st.IsOCIChart(release.Chart) { + return "", "", chartVersion, nil + } + + var qualifiedChartName, chartName string if strings.HasPrefix(release.Chart, "oci://") { - split := strings.Split(release.Chart, "/") - chartName = split[len(split)-1] + parts := strings.Split(release.Chart, "/") + chartName = parts[len(parts)-1] qualifiedChartName = strings.Replace(fmt.Sprintf("%s:%s", release.Chart, chartVersion), "oci://", "", 1) } else { var repo *RepositorySpec repo, chartName = st.GetRepositoryAndNameFromChartName(release.Chart) - if repo == nil { - return - } - if !repo.OCI { - return - } qualifiedChartName = fmt.Sprintf("%s/%s:%s", repo.URL, chartName, chartVersion) } + qualifiedChartName = strings.TrimSuffix(qualifiedChartName, ":") + if chartVersion == "latest" && helm.IsVersionAtLeast("3.8.0") { return "", "", "", fmt.Errorf("the version for OCI charts should be semver compliant, the latest tag is not supported anymore for helm >= 3.8.0") } - return + + return qualifiedChartName, chartName, chartVersion, nil } func (st *HelmState) FullFilePath() (string, error) { diff --git a/pkg/state/state_exec_tmpl.go b/pkg/state/state_exec_tmpl.go index f4ec6dce..23684d4b 100644 --- a/pkg/state/state_exec_tmpl.go +++ b/pkg/state/state_exec_tmpl.go @@ -199,6 +199,8 @@ func (st *HelmState) releaseWithInheritedTemplate(r *ReleaseSpec, inheritancePat src.SetValuesTemplate = nil case "set": src.SetValues = nil + case "setString": + src.SetStringValues = nil case "secrets": src.Secrets = nil default: diff --git a/pkg/state/state_exec_tmpl_test.go b/pkg/state/state_exec_tmpl_test.go index 91efe615..2bb57b0a 100644 --- a/pkg/state/state_exec_tmpl_test.go +++ b/pkg/state/state_exec_tmpl_test.go @@ -123,6 +123,29 @@ func TestHelmState_executeTemplates(t *testing.T) { Values: []any{map[string]any{"key": "app-val0"}}, }, }, + { + name: "Has template expressions in post renderer args", + input: ReleaseSpec{ + Chart: "test-chart", + PostRendererArgs: []string{ + "--release", + "{{ .Release.Name }}", + "--chart", + "{{ .Release.Chart }}", + }, + Name: "test-release", + }, + want: ReleaseSpec{ + Chart: "test-chart", + Name: "test-release", + PostRendererArgs: []string{ + "--release", + "test-chart-dev", + "--chart", + "test-chart", + }, + }, + }, } for i := range tests { diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index 11592c8e..4834ba1c 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -58,13 +58,9 @@ func TestHelmState_applyDefaultsTo(t *testing.T) { type fields struct { BaseChartPath string Context string - - // TODO: Remove this function once Helmfile v0.x - DeprecatedReleases []ReleaseSpec - - Namespace string - Repositories []RepositorySpec - Releases []ReleaseSpec + Namespace string + Repositories []RepositorySpec + Releases []ReleaseSpec } type args struct { spec ReleaseSpec @@ -89,12 +85,8 @@ func TestHelmState_applyDefaultsTo(t *testing.T) { fieldsWithNamespace := fields{ BaseChartPath: ".", Context: "test_context", - - // TODO: Remove this function once Helmfile v0.x - DeprecatedReleases: nil, - - Namespace: specWithNamespaceFromFields.Namespace, - Repositories: nil, + Namespace: specWithNamespaceFromFields.Namespace, + Repositories: nil, Releases: []ReleaseSpec{ specWithNamespace, }, @@ -148,10 +140,6 @@ func TestHelmState_applyDefaultsTo(t *testing.T) { state := &HelmState{ basePath: tt.fields.BaseChartPath, ReleaseSetSpec: ReleaseSetSpec{ - // TODO: Remove this function once Helmfile v0.x - DeprecatedContext: tt.fields.Context, - DeprecatedReleases: tt.fields.DeprecatedReleases, - OverrideNamespace: tt.fields.Namespace, Repositories: tt.fields.Repositories, Releases: tt.fields.Releases, @@ -740,9 +728,6 @@ func TestHelmState_flagsForUpgrade(t *testing.T) { state := &HelmState{ basePath: "./", ReleaseSetSpec: ReleaseSetSpec{ - // TODO: Remove this function once Helmfile v0.x - DeprecatedContext: "default", - Releases: []ReleaseSpec{*tt.release}, HelmDefaults: tt.defaults, }, @@ -904,9 +889,8 @@ func TestHelmState_flagsForTemplate(t *testing.T) { state := &HelmState{ basePath: "./", ReleaseSetSpec: ReleaseSetSpec{ - DeprecatedContext: "default", - Releases: []ReleaseSpec{*tt.release}, - HelmDefaults: tt.defaults, + Releases: []ReleaseSpec{*tt.release}, + HelmDefaults: tt.defaults, }, valsRuntime: valsRuntime, } @@ -1871,6 +1855,19 @@ func TestHelmState_DiffFlags(t *testing.T) { helm: &exectest.Helm{}, wantDiffFlags: []string{"--api-versions", "helmfile.test/v1", "--api-versions", "helmfile.test/v2", "--kube-version", "1.21"}, }, + { + name: "release with kubeversion and plain http which is ignored", + releases: []ReleaseSpec{ + { + Name: "releaseName", + Chart: "foo", + KubeVersion: "1.21", + PlainHttp: true, + }, + }, + helm: &exectest.Helm{}, + wantDiffFlags: []string{"--kube-version", "1.21"}, + }, } for i := range tests { tt := tests[i] @@ -2808,7 +2805,7 @@ func TestHelmState_Delete(t *testing.T) { affectedReleases := AffectedReleases{} errs := state.DeleteReleases(&affectedReleases, helm, 1, tt.purge, "") if errs != nil { - if !tt.wantErr || len(affectedReleases.Failed) != 1 || affectedReleases.Failed[0].Name != release.Name { + if !tt.wantErr || len(affectedReleases.DeleteFailed) != 1 || affectedReleases.DeleteFailed[0].Name != release.Name { t.Errorf("DeleteReleases() for %s error = %v, wantErr %v", tt.name, errs, tt.wantErr) return } @@ -3203,6 +3200,8 @@ func TestFullFilePath(t *testing.T) { } func TestGetOCIQualifiedChartName(t *testing.T) { + devel := true + tests := []struct { state HelmState expected []struct { @@ -3290,6 +3289,27 @@ func TestGetOCIQualifiedChartName(t *testing.T) { {"registry/chart-path/chart-name:0.1.2", "chart-name", "0.1.2"}, }, }, + { + state: HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + Repositories: []RepositorySpec{}, + Releases: []ReleaseSpec{ + { + Chart: "oci://registry/chart-path/chart-name", + Devel: &devel, + }, + }, + }, + }, + helmVersion: "3.13.3", + expected: []struct { + qualifiedChartName string + chartName string + chartVersion string + }{ + {"registry/chart-path/chart-name", "chart-name", ""}, + }, + }, } for _, tt := range tests { @@ -3438,14 +3458,11 @@ func TestCommonDiffFlags(t *testing.T) { stripTrailingCR: true, expected: []string{ "--strip-trailing-cr", - "--reset-values", }, }, { - name: "stripTrailingCR disenabled", - expected: []string{ - "--reset-values", - }, + name: "stripTrailingCR disenabled", + expected: []string{}, }, } for _, tt := range tests { @@ -3582,6 +3599,98 @@ func TestAppendChartDownloadFlags(t *testing.T) { } } +func TestNeedsPlainHttp(t *testing.T) { + tests := []struct { + name string + release *ReleaseSpec + repo *RepositorySpec + defaults HelmSpec + expected bool + }{ + { + name: "PlainHttp in Release", + release: &ReleaseSpec{ + PlainHttp: true, + }, + expected: true, + }, + { + name: "PlainHttp in Repository", + repo: &RepositorySpec{ + PlainHttp: true, + }, + expected: true, + }, + { + name: "PlainHttp in HelmDefaults", + defaults: HelmSpec{ + PlainHttp: true, + }, + expected: true, + }, + { + name: "PlainHttp not set", + expected: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + st := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + HelmDefaults: tt.defaults, + }, + } + require.Equal(t, tt.expected, st.needsPlainHttp(tt.release, tt.repo)) + }) + } +} + +func TestNeedsInsecureSkipTLSVerify(t *testing.T) { + tests := []struct { + name string + release *ReleaseSpec + repo *RepositorySpec + defaults HelmSpec + expected bool + }{ + { + name: "InsecureSkipTLSVerify in Release", + release: &ReleaseSpec{ + InsecureSkipTLSVerify: true, + }, + expected: true, + }, + { + name: "SkipTLSVerify in Repository", + repo: &RepositorySpec{ + SkipTLSVerify: true, + }, + expected: true, + }, + { + name: "InsecureSkipTLSVerify in HelmDefaults", + defaults: HelmSpec{ + InsecureSkipTLSVerify: true, + }, + expected: true, + }, + { + name: "InsecureSkipTLSVerify not set", + expected: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + st := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + HelmDefaults: tt.defaults, + }, + } + require.Equal(t, tt.expected, st.needsInsecureSkipTLSVerify(tt.release, tt.repo)) + }) + } +} + func TestHideChartURL(t *testing.T) { tests := []struct { input string @@ -4203,3 +4312,262 @@ func TestAppendVerifyFlags(t *testing.T) { }) } } + +// TestHelmState_setStringFlags tests the setStringFlags method +func TestHelmState_setStringFlags(t *testing.T) { + tests := []struct { + name string + setStringValues []SetValue + want []string + wantErr bool + }{ + { + name: "single value", + setStringValues: []SetValue{ + { + Name: "key", + Value: "value", + }, + }, + want: []string{"--set-string", "key=value"}, + wantErr: false, + }, + { + name: "multiple values", + setStringValues: []SetValue{ + { + Name: "key", + Values: []string{"value1", "value2"}, + }, + }, + want: []string{"--set-string", "key={value1,value2}"}, + wantErr: false, + }, + { + name: "rendered value error", + setStringValues: []SetValue{ + { + Name: "key", + Value: "ref+echo://value", + }, + }, + want: []string{"--set-string", "key=value"}, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + st := &HelmState{ + valsRuntime: valsRuntime, + } + got, err := st.setStringFlags(tt.setStringValues) + if (err != nil) != tt.wantErr { + t.Errorf("setStringFlags() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("setStringFlags() got = %v, want %v", got, tt.want) + } + }) + } +} +func TestPrepareDiffReleases_ValueControlReleaseOverride(t *testing.T) { + tests := []struct { + flags []string + diffOptions *DiffOpts + helmDefaults *HelmSpec + release *ReleaseSpec + }{ + { + flags: []string{"--reuse-values"}, + diffOptions: &DiffOpts{}, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reuse-values-from-release", + ReuseValues: boolValue(true), + }, + }, + { + flags: []string{"--reuse-values"}, + diffOptions: &DiffOpts{ + ReuseValues: true, + }, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reuse-values-from-cli", + ReuseValues: boolValue(false), + }, + }, + { + flags: []string{"--reuse-values"}, + diffOptions: &DiffOpts{ + ReuseValues: true, + }, + helmDefaults: &HelmSpec{ + ReuseValues: true, + }, + release: &ReleaseSpec{ + Name: "reuse-values-all", + ReuseValues: boolValue(true), + }, + }, + { + flags: []string{"--reset-values"}, + diffOptions: &DiffOpts{}, + helmDefaults: &HelmSpec{ + ReuseValues: true, + }, + release: &ReleaseSpec{ + Name: "reset-values-from-helm-defaults", + ReuseValues: boolValue(false), + }, + }, + { + flags: []string{"--reset-values"}, + diffOptions: &DiffOpts{}, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reset-values-from-release", + ReuseValues: boolValue(false), + }, + }, + { + flags: []string{"--reset-values"}, + diffOptions: &DiffOpts{ + ResetValues: true, + }, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reset-values-cli-overrides-release", + ReuseValues: boolValue(true), + }, + }, + } + + for _, tt := range tests { + releases := []ReleaseSpec{ + *tt.release, + } + state := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + Releases: releases, + HelmDefaults: *tt.helmDefaults, + }, + logger: logger, + valsRuntime: valsRuntime, + } + helm := &exectest.Helm{ + Lists: map[exectest.ListKey]string{}, + Helm3: true, + } + results, es := state.prepareDiffReleases(helm, []string{}, 1, false, false, false, []string{}, false, false, false, tt.diffOptions) + + require.Len(t, es, 0) + require.Len(t, results, 1) + + r := results[0] + + require.Equal(t, tt.flags, r.flags, "Wrong value control flag for release %s", r.release.Name) + } +} + +func TestPrepareSyncReleases_ValueControlReleaseOverride(t *testing.T) { + tests := []struct { + flags []string + syncOptions *SyncOpts + helmDefaults *HelmSpec + release *ReleaseSpec + }{ + { + flags: []string{"--reuse-values"}, + syncOptions: &SyncOpts{}, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reuse-values-from-release", + ReuseValues: boolValue(true), + }, + }, + { + flags: []string{"--reuse-values"}, + syncOptions: &SyncOpts{ + ReuseValues: true, + }, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reuse-values-from-cli", + ReuseValues: boolValue(false), + }, + }, + { + flags: []string{"--reuse-values"}, + syncOptions: &SyncOpts{ + ReuseValues: true, + }, + helmDefaults: &HelmSpec{ + ReuseValues: true, + }, + release: &ReleaseSpec{ + Name: "reuse-values-all", + ReuseValues: boolValue(true), + }, + }, + { + flags: []string{"--reset-values"}, + syncOptions: &SyncOpts{}, + helmDefaults: &HelmSpec{ + ReuseValues: true, + }, + release: &ReleaseSpec{ + Name: "reset-values-from-helm-defaults", + ReuseValues: boolValue(false), + }, + }, + { + flags: []string{"--reset-values"}, + syncOptions: &SyncOpts{}, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reset-values-from-release", + ReuseValues: boolValue(false), + }, + }, + { + flags: []string{"--reset-values"}, + syncOptions: &SyncOpts{ + ResetValues: true, + }, + helmDefaults: &HelmSpec{}, + release: &ReleaseSpec{ + Name: "reset-values-cli-overrides-release", + ReuseValues: boolValue(true), + }, + }, + } + + for _, tt := range tests { + releases := []ReleaseSpec{ + *tt.release, + } + state := &HelmState{ + ReleaseSetSpec: ReleaseSetSpec{ + Releases: releases, + HelmDefaults: *tt.helmDefaults, + }, + logger: logger, + valsRuntime: valsRuntime, + } + helm := &exectest.Helm{ + Lists: map[exectest.ListKey]string{}, + Helm3: true, + } + results, es := state.prepareSyncReleases(helm, []string{}, 1, tt.syncOptions) + + require.Len(t, es, 0) + require.Len(t, results, 1) + + r := results[0] + + require.Equal(t, tt.flags, r.flags, "Wrong value control flag for release %s", r.release.Name) + } +} diff --git a/pkg/state/temp_test.go b/pkg/state/temp_test.go index 258033e3..f0eed882 100644 --- a/pkg/state/temp_test.go +++ b/pkg/state/temp_test.go @@ -24,7 +24,7 @@ func TestGenerateID(t *testing.T) { got, err := generateValuesID(&tc.release, tc.data) if err != nil { - t.Fatalf("uenxpected error: %v", err) + t.Fatalf("unexpected error: %v", err) } if d := cmp.Diff(tc.want, got); d != "" { @@ -38,39 +38,39 @@ func TestGenerateID(t *testing.T) { run(testcase{ subject: "baseline", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, - want: "foo-values-867bdd68d", + want: "foo-values-54f5f6cdb5", }) run(testcase{ subject: "different bytes content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: []byte(`{"k":"v"}`), - want: "foo-values-55d7dc5f87", + want: "foo-values-6bc8f7944b", }) run(testcase{ subject: "different map content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: map[string]any{"k": "v"}, - want: "foo-values-58bdcf44f7", + want: "foo-values-dcffdcb8", }) run(testcase{ subject: "different chart", release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, - want: "foo-values-67dcddd85", + want: "foo-values-6d4c6fd548", }) run(testcase{ subject: "different name", release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, - want: "bar-values-6dd4989f97", + want: "bar-values-76974767c8", }) run(testcase{ subject: "specific ns", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, - want: "myns-foo-values-755d4487dc", + want: "myns-foo-values-77bd9cc6fb", }) for id, n := range ids { diff --git a/pkg/state/testdata/values.9.yaml.gotmpl b/pkg/state/testdata/values.9.yaml.gotmpl new file mode 100644 index 00000000..09f8749f --- /dev/null +++ b/pkg/state/testdata/values.9.yaml.gotmpl @@ -0,0 +1 @@ +foo: {{ .Values.foo }} diff --git a/pkg/tmpl/context_funcs.go b/pkg/tmpl/context_funcs.go index 82f8bf0e..c0f1111d 100644 --- a/pkg/tmpl/context_funcs.go +++ b/pkg/tmpl/context_funcs.go @@ -19,7 +19,6 @@ import ( "github.com/helmfile/helmfile/pkg/envvar" "github.com/helmfile/helmfile/pkg/helmexec" "github.com/helmfile/helmfile/pkg/maputil" - "github.com/helmfile/helmfile/pkg/runtime" "github.com/helmfile/helmfile/pkg/yaml" ) @@ -37,23 +36,10 @@ func (e DisableInsecureFeaturesError) Error() string { var ( disableInsecureFeatures bool - - // TODO: Remove this function once Helmfile v0.x - skipInsecureTemplateFunctions bool ) func init() { disableInsecureFeatures, _ = strconv.ParseBool(os.Getenv(envvar.DisableInsecureFeatures)) - - // TODO: Remove this function once Helmfile v0.x - skipInsecureTemplateFunctions, _ = strconv.ParseBool(os.Getenv(envvar.SkipInsecureTemplateFunctions)) - skipInsecureTemplateFunctions = func() bool { - if runtime.V1Mode { - return false - } - b, _ := strconv.ParseBool(os.Getenv(envvar.SkipInsecureTemplateFunctions)) - return b - }() } func (c *Context) createFuncMap() template.FuncMap { @@ -76,7 +62,7 @@ func (c *Context) createFuncMap() template.FuncMap { "fetchSecretValue": fetchSecretValue, "expandSecretRefs": fetchSecretValues, } - if c.preRender || skipInsecureTemplateFunctions { + if c.preRender { // disable potential side-effect template calls funcMap["exec"] = func(string, []any, ...string) (string, error) { return "", nil @@ -321,14 +307,14 @@ func ToYaml(v any) (string, error) { return string(data), nil } -func FromYaml(str string) (Values, error) { - m := map[string]any{} +func FromYaml(str string) (any, error) { + var m any if err := yaml.Unmarshal([]byte(str), &m); err != nil { return nil, fmt.Errorf("%s, offending yaml: %s", err, str) } - m, err := maputil.CastKeysToStrings(m) + m, err := maputil.RecursivelyStringifyMapKey(m) if err != nil { return nil, fmt.Errorf("%s, offending yaml: %s", err, str) } @@ -391,10 +377,10 @@ func RequiredEnv(name string) (string, error) { func Required(warn string, val any) (any, error) { if val == nil { - return nil, fmt.Errorf(warn) + return nil, fmt.Errorf("%s", warn) } else if _, ok := val.(string); ok { if val == "" { - return nil, fmt.Errorf(warn) + return nil, fmt.Errorf("%s", warn) } } diff --git a/pkg/tmpl/context_funcs_test.go b/pkg/tmpl/context_funcs_test.go index e9e67e04..58ac5bd0 100644 --- a/pkg/tmpl/context_funcs_test.go +++ b/pkg/tmpl/context_funcs_test.go @@ -46,30 +46,6 @@ func TestCreateFuncMap_DisabledInsecureFeatures(t *testing.T) { disableInsecureFeatures = currentVal } -// TODO: Remove this function once Helmfile v0.x -func TestCreateFuncMap_SkipInsecureTemplateFunctions(t *testing.T) { - if runtime.V1Mode { - t.Logf("SkipInsecureTemplateFunctions is not supported in V1 mode") - return - } - currentVal := skipInsecureTemplateFunctions - - { - skipInsecureTemplateFunctions = true - ctx := &Context{basePath: "."} - funcMaps := ctx.createFuncMap() - args := make([]any, 0) - actual1, err1 := funcMaps["exec"].(func(command string, args []any, inputs ...string) (string, error))("ls", args) - require.Equal(t, "", actual1) - require.ErrorIs(t, err1, nil) - actual2, err2 := funcMaps["readFile"].(func(filename string) (string, error))("context_funcs_test.go") - require.Equal(t, "", actual2) - require.ErrorIs(t, err2, nil) - } - - skipInsecureTemplateFunctions = currentVal -} - func newFSExpecting(expectedFilename string, expected string) *filesystem.FileSystem { return filesystem.FromFileSystem(filesystem.FileSystem{ ReadFile: func(filename string) ([]byte, error) { @@ -224,7 +200,88 @@ func TestToYaml(t *testing.T) { require.Equal(t, expected, actual) } -func testFromYaml(t *testing.T, goccyGoYaml bool, expected Values) { +func testFromYamlObject(t *testing.T) { + raw := `foo: + bar: BAR +` + + actual, err := FromYaml(raw) + require.NoError(t, err) + require.Equal( + t, + map[string]any{ + "foo": map[string]any{ + "bar": "BAR", + }, + }, + actual, + ) +} + +func testFromYamlArray(t *testing.T) { + raw := `- foo +- bar: BAR +` + + actual, err := FromYaml(raw) + require.NoError(t, err) + require.Equal( + t, + []any{ + "foo", + map[string]any{ + "bar": "BAR", + }, + }, + actual, + ) +} + +func testFromYamlString(t *testing.T) { + raw := `foo +` + + actual, err := FromYaml(raw) + require.NoError(t, err) + require.Equal(t, "foo", actual) +} + +func testFromYamlNumber(t *testing.T) { + raw := `1234 +` + + actual, err := FromYaml(raw) + require.NoError(t, err) + + switch a := actual.(type) { + case int: + require.Equal(t, 1234, a) + case uint64: + require.Equal(t, uint64(1234), a) + default: + t.Errorf("unexpected type: %T", a) + } +} + +func testFromYamlBoolean(t *testing.T) { + raw := `true +` + + actual, err := FromYaml(raw) + require.NoError(t, err) + require.Equal(t, true, actual) +} + +func testFromYamlNull(t *testing.T) { + raw := `null +` + + actual, err := FromYaml(raw) + require.NoError(t, err) + require.Equal(t, nil, actual) +} + +func testFromYaml(t *testing.T, goccyGoYaml bool) { t.Helper() v := runtime.GoccyGoYaml @@ -233,39 +290,26 @@ func testFromYaml(t *testing.T, goccyGoYaml bool, expected Values) { runtime.GoccyGoYaml = v }) - raw := `foo: - bar: BAR -` - actual, err := FromYaml(raw) - require.NoError(t, err) - require.Equal(t, expected, actual) + t.Run("test unmarshalling object", testFromYamlObject) + + t.Run("test unmarshalling array", testFromYamlArray) + + t.Run("test unmarshalling string", testFromYamlString) + + t.Run("test unmarshalling number", testFromYamlNumber) + + t.Run("test unmarshalling boolean", testFromYamlBoolean) + + t.Run("test unmarshalling null", testFromYamlNull) } func TestFromYaml(t *testing.T) { t.Run("with goccy/go-yaml", func(t *testing.T) { - testFromYaml( - t, - true, - // nolint: unconvert - Values(map[string]any{ - "foo": map[string]any{ - "bar": "BAR", - }, - }), - ) + testFromYaml(t, true) }) t.Run("with gopkg.in/yaml.v2", func(t *testing.T) { - testFromYaml( - t, - false, - // nolint: unconvert - Values(map[string]any{ - "foo": map[string]any{ - "bar": "BAR", - }, - }), - ) + testFromYaml(t, false) }) } diff --git a/pkg/yaml/yaml.go b/pkg/yaml/yaml.go index 08a5eb72..06054261 100644 --- a/pkg/yaml/yaml.go +++ b/pkg/yaml/yaml.go @@ -42,6 +42,8 @@ func NewDecoder(data []byte, strict bool) func(any) error { if strict { opts = append(opts, yaml.DisallowUnknownField()) } + // allow duplicate keys + opts = append(opts, yaml.AllowDuplicateMapKey()) decoder := yaml.NewDecoder( bytes.NewReader(data), diff --git a/test/advanced/helmfile.yaml b/test/advanced/helmfile.yaml index 675e1a85..01a4e2d5 100644 --- a/test/advanced/helmfile.yaml +++ b/test/advanced/helmfile.yaml @@ -1,6 +1,6 @@ repositories: - name: incubator - url: https://kubernetes-charts-incubator.storage.googleapis.com + url: https://charts.helm.sh/incubator releases: - name: kustomapp diff --git a/test/e2e/template/helmfile/snapshot_test.go b/test/e2e/template/helmfile/snapshot_test.go index 672598f1..68f62be5 100644 --- a/test/e2e/template/helmfile/snapshot_test.go +++ b/test/e2e/template/helmfile/snapshot_test.go @@ -223,7 +223,7 @@ func testHelmfileTemplateWithBuildCommand(t *testing.T, goccyGoYaml bool) { helmConfigHome := filepath.Join(tmpDir, "helm_config") t.Logf("Using HELM_CACHE_HOME=%s, HELMFILE_CACHE_HOME=%s, HELM_CONFIG_HOME=%s", helmCacheHome, helmfileCacheHome, helmConfigHome) - inputFile := filepath.Join(testdataDir, name, "input.yaml") + inputFile := filepath.Join(testdataDir, name, "input.yaml.gotmpl") outputFile := filepath.Join(testdataDir, name, "output.yaml") ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) diff --git a/test/e2e/template/helmfile/testdata/snapshot/chart_need/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/chart_need/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/chart_need/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/chart_need/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/chart_need_enable_live_output/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/chart_need_enable_live_output/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/chart_need_enable_live_output/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/chart_need_enable_live_output/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-envs.yaml b/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-envs.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-envs.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-envs.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-values.yaml b/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-values.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-values.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/no-values.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/prod.yaml b/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/prod.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/prod.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/prod.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/test.yaml b/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/test.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/test.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/helmfiles/test.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/input.yaml.gotmpl similarity index 58% rename from test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/input.yaml.gotmpl index 6b312364..05b9688c 100644 --- a/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/input.yaml +++ b/test/e2e/template/helmfile/testdata/snapshot/environment_missing_in_subhelmfile/input.yaml.gotmpl @@ -4,13 +4,13 @@ environments: - test.yaml.gotmpl --- helmfiles: -- path: helmfiles/test.yaml +- path: helmfiles/test.yaml.gotmpl values: - envName: {{ .Values.envName }} -- path: helmfiles/prod.yaml +- path: helmfiles/prod.yaml.gotmpl values: - envName: {{ .Values.envName }} -- path: helmfiles/no-envs.yaml +- path: helmfiles/no-envs.yaml.gotmpl values: - envName: {{ .Values.envName }} -- path: helmfiles/no-values.yaml \ No newline at end of file +- path: helmfiles/no-values.yaml.gotmpl \ No newline at end of file diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/config.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/config.yaml deleted file mode 100644 index 71fee0cb..00000000 --- a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -chartifyTempDir: envs_releases_within_same_yaml_part -helmfileArgs: -- --environment -- prod -- template diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/config.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/config.yaml new file mode 100644 index 00000000..690947ac --- /dev/null +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/config.yaml @@ -0,0 +1,5 @@ +chartifyTempDir: envs_releases_without_same_yaml_part +helmfileArgs: +- --environment +- prod +- template diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/input.yaml.gotmpl similarity index 97% rename from test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/input.yaml.gotmpl index 276a4d93..4fc99ecb 100644 --- a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/input.yaml +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/input.yaml.gotmpl @@ -1,7 +1,7 @@ environments: prod: staging: - +--- releases: - name: raw chart: ../../charts/raw-0.0.1 diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/output.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/output.yaml similarity index 56% rename from test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/output.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/output.yaml index 2e9471ac..7f723eaa 100644 --- a/test/e2e/template/helmfile/testdata/snapshot/environments_releases_within_same_yaml_part/output.yaml +++ b/test/e2e/template/helmfile/testdata/snapshot/environments_releases_without_same_yaml_part/output.yaml @@ -1,4 +1,3 @@ -WARNING: environments and releases cannot be defined within the same YAML part. Use --- to extract the environments into a dedicated part Building dependency release=raw, chart=../../charts/raw-0.0.1 Templating release=raw, chart=../../charts/raw-0.0.1 --- diff --git a/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/environments_values_gotmpl_with_environment_name/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/hcl_mix/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/hcl_mix/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/hcl_mix/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/hcl_mix/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/issue_1229_template_strategic_merge_with_lockfile/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/issue_1229_template_strategic_merge_with_lockfile/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/issue_1229_template_strategic_merge_with_lockfile/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/issue_1229_template_strategic_merge_with_lockfile/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/output.yaml b/test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/output.yaml index 9e3dec93..c7d30230 100644 --- a/test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/output.yaml +++ b/test/e2e/template/helmfile/testdata/snapshot/issue_2098_release_template_needs/output.yaml @@ -1,7 +1,7 @@ --- -# Source: __workingdir__/testdata/snapshot/issue_2098_release_template_needs/input.yaml +# Source: __workingdir__/testdata/snapshot/issue_2098_release_template_needs/input.yaml.gotmpl -filepath: input.yaml +filepath: input.yaml.gotmpl helmBinary: helm kustomizeBinary: kustomize environments: @@ -15,7 +15,11 @@ releases: name: default-shared-resources namespace: default labels: + chart: util + name: default-shared-resources + namespace: default service: shared-resources + syncReleaseLabels: false - chart: aservo/util version: 0.0.1 needs: @@ -23,9 +27,14 @@ releases: name: default-release-resources namespace: default labels: + chart: util + name: default-release-resources + namespace: default service: release-resources + syncReleaseLabels: false templates: defaults: name: default-{{ .Release.Labels.service }} namespace: default + syncReleaseLabels: false renderedvalues: {} diff --git a/test/e2e/template/helmfile/testdata/snapshot/issue_473_oci_chart_url_fetch/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/issue_473_oci_chart_url_fetch/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/issue_473_oci_chart_url_fetch/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/issue_473_oci_chart_url_fetch/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/output.yaml b/test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/output.yaml index d799a9aa..9c7b08f7 100644 --- a/test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/output.yaml +++ b/test/e2e/template/helmfile/testdata/snapshot/issue_493_template_yaml_anchors_merge/output.yaml @@ -1,3 +1,3 @@ -NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION -release1 myNamespace true true app:myapp,group:myGroup,project:myProject test -release2 myNamespace true true app:myapp,group:myGroup,project:myProject test +NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION +release1 myNamespace true true app:myapp,chart:test,group:myGroup,name:release1,namespace:myNamespace,project:myProject test +release2 myNamespace true true app:myapp,chart:test,group:myGroup,name:release2,namespace:myNamespace,project:myProject test diff --git a/test/e2e/template/helmfile/testdata/snapshot/issue_498_template_go_getter_with_selector/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/issue_498_template_go_getter_with_selector/input.yaml.gotmpl similarity index 75% rename from test/e2e/template/helmfile/testdata/snapshot/issue_498_template_go_getter_with_selector/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/issue_498_template_go_getter_with_selector/input.yaml.gotmpl index 75323838..63133c54 100644 --- a/test/e2e/template/helmfile/testdata/snapshot/issue_498_template_go_getter_with_selector/input.yaml +++ b/test/e2e/template/helmfile/testdata/snapshot/issue_498_template_go_getter_with_selector/input.yaml.gotmpl @@ -4,7 +4,7 @@ repositories: - name: istio url: https://istio-release.storage.googleapis.com/charts releases: -- chart: git::https://github.com/joshuasimon-taulia/acme.git@charts/acme?ref=master +- chart: git::https://github.com/jenkins-x/acme.git@charts/acme?ref=main name: acme-jx labels: values.jenkins-x.io: lock diff --git a/test/e2e/template/helmfile/testdata/snapshot/oci_chart_pull/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/oci_chart_pull/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/oci_chart_pull/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/oci_chart_pull/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/oci_need/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/oci_need/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/oci_need/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/oci_need/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/postrenderer/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/postrenderer/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/postrenderer/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/postrenderer/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/pr_560/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/pr_560/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/pr_560/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/pr_560/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/release_template_inheritance/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/release_template_inheritance/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/release_template_inheritance/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/release_template_inheritance/input.yaml.gotmpl diff --git a/test/e2e/template/helmfile/testdata/snapshot/templated_lockfile/input.yaml b/test/e2e/template/helmfile/testdata/snapshot/templated_lockfile/input.yaml.gotmpl similarity index 100% rename from test/e2e/template/helmfile/testdata/snapshot/templated_lockfile/input.yaml rename to test/e2e/template/helmfile/testdata/snapshot/templated_lockfile/input.yaml.gotmpl diff --git a/test/integration/lib/ensure.sh b/test/integration/lib/ensure.sh index c2942b3f..fb9b137b 100644 --- a/test/integration/lib/ensure.sh +++ b/test/integration/lib/ensure.sh @@ -5,10 +5,10 @@ if ! hash minikube 2>/dev/null; then fail "Minikube needs to be installed." fi -if [ ! $(minikube status --format '{{.MinikubeStatus}}') == "Running" ]; then +if [ ! "$(minikube status --format '{{.Host}}')" == "Running" ]; then fail "Minikube is not running." fi -if [ ! $(minikube status --format '{{.ClusterStatus}}') == "Running" ]; then +if [ ! "$(minikube status --format '{{.APIServer}}')" == "Running" ]; then fail "Minikube Cluster is not running." fi if ! kubectl version 1> /dev/null; then diff --git a/test/integration/run.sh b/test/integration/run.sh index 1b163a31..a2bc2708 100755 --- a/test/integration/run.sh +++ b/test/integration/run.sh @@ -27,7 +27,8 @@ export HELM_DATA_HOME="${helm_dir}/data" export HELM_HOME="${HELM_DATA_HOME}" export HELM_PLUGINS="${HELM_DATA_HOME}/plugins" export HELM_CONFIG_HOME="${helm_dir}/config" -HELM_DIFF_VERSION="${HELM_DIFF_VERSION:-3.9.11}" +HELM_DIFF_VERSION="${HELM_DIFF_VERSION:-3.11.0}" +HELM_GIT_VERSION="${HELM_GIT_VERSION:-1.3.0}" HELM_SECRETS_VERSION="${HELM_SECRETS_VERSION:-3.15.0}" export GNUPGHOME="${PWD}/${dir}/.gnupg" export SOPS_PGP_FP="B2D6D7BBEC03B2E66571C8C00AD18E16CFDEF700" @@ -69,7 +70,9 @@ function cleanup() { set -e trap cleanup EXIT info "Using namespace: ${test_ns}" -${helm} plugin ls | grep diff || ${helm} plugin install https://github.com/databus23/helm-diff --version v${HELM_DIFF_VERSION} +info "Using Helm version:" $(${helm} version --short | grep -o 'v[0-9.]\+') +${helm} plugin ls | grep "^diff" || ${helm} plugin install https://github.com/databus23/helm-diff --version v${HELM_DIFF_VERSION} +${helm} plugin ls | grep "^helm-git" || ${helm} plugin install https://github.com/aslafy-z/helm-git --version v${HELM_GIT_VERSION} info "Using Kustomize version: $(kustomize version --short | grep -o 'v[0-9.]\+')" ${kubectl} get namespace ${test_ns} &> /dev/null && warn "Namespace ${test_ns} exists, from a previous test run?" ${kubectl} create namespace ${test_ns} || fail "Could not create namespace ${test_ns}" @@ -96,6 +99,9 @@ ${kubectl} create namespace ${test_ns} || fail "Could not create namespace ${tes . ${dir}/test-cases/deps-mr-1011.sh . ${dir}/test-cases/deps-kustomization-i-1402.sh . ${dir}/test-cases/hcl-secrets.sh +. ${dir}/test-cases/issue-1749.sh +. ${dir}/test-cases/issue-1893.sh +. ${dir}/test-cases/state-values-set-cli-args-in-environments.sh # ALL DONE ----------------------------------------------------------------------------------------------------------- diff --git a/test/integration/test-cases/chart-needs.sh b/test/integration/test-cases/chart-needs.sh index 76cc3814..2ce8e63d 100644 --- a/test/integration/test-cases/chart-needs.sh +++ b/test/integration/test-cases/chart-needs.sh @@ -1,14 +1,7 @@ chart_need_case_input_dir="${cases_dir}/chart-needs/input" chart_need_case_output_dir="${cases_dir}/chart-needs/output" -config_file="helmfile.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${chart_need_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi - +config_file="helmfile.yaml.gotmpl" chart_needs_tmp=$(mktemp -d) chart_needs_template_reverse=${chart_needs_tmp}/chart.needs.template.log chart_needs_lint_reverse=${chart_needs_tmp}/chart.needs.lint.log diff --git a/test/integration/test-cases/chart-needs/input/helmfile.yaml b/test/integration/test-cases/chart-needs/input/helmfile.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/chart-needs/input/helmfile.yaml rename to test/integration/test-cases/chart-needs/input/helmfile.yaml.gotmpl diff --git a/test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches.sh b/test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches.sh index 2fd4e5d3..ea5d4a22 100644 --- a/test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches.sh +++ b/test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches.sh @@ -1,14 +1,7 @@ chartify_jsonPatches_and_strategicMergePatches_case_input_dir="${cases_dir}/chartify-jsonPatches-and-strategicMergePatches/input" chartify_jsonPatches_and_strategicMergePatches_case_output_dir="${cases_dir}/chartify-jsonPatches-and-strategicMergePatches/output" -config_file="helmfile.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${chartify_jsonPatches_and_strategicMergePatches_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi - +config_file="helmfile.yaml.gotmpl" chartify_jsonPatches_and_strategicMergePatches_tmp=$(mktemp -d) chartify_jsonPatches_and_strategicMergePatches_template_reverse=${chartify_jsonPatches_and_strategicMergePatches_tmp}/chartify_jsonPatches_and_strategicMergePatches.template.log diff --git a/test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches/input/helmfile.yaml b/test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches/input/helmfile.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches/input/helmfile.yaml rename to test/integration/test-cases/chartify-jsonPatches-and-strategicMergePatches/input/helmfile.yaml.gotmpl diff --git a/test/integration/test-cases/chartify.sh b/test/integration/test-cases/chartify.sh index 581e2d00..8c6e2d3a 100644 --- a/test/integration/test-cases/chartify.sh +++ b/test/integration/test-cases/chartify.sh @@ -1,27 +1,22 @@ chartify_case_input_dir="${cases_dir}/chartify/input" chartify_case_output_dir="${cases_dir}/chartify/output" -config_file="helmfile.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${chartify_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi - +config_file="helmfile.yaml.gotmpl" chartify_tmp=$(mktemp -d) chartify_template_reverse=${chartify_tmp}/chartify.template.log - test_start "helmfile template with chartify" info "Comparing template/chartify" -${helmfile} -f ${chartify_case_input_dir}/${config_file} template > ${chartify_template_reverse} || fail "\"helmfile template\" shouldn't fail" +${helmfile} -f ${chartify_case_input_dir}/${config_file} template >${chartify_template_reverse} || fail "\"helmfile template\" shouldn't fail" ./dyff between -bs ${chartify_case_output_dir}/template ${chartify_template_reverse} || fail "\"helmfile template\" should be consistent" info "Comparing template/chartify with set" -${helmfile} -f ${chartify_case_input_dir}/${config_file} template --set image.tag=v2 > ${chartify_template_reverse} || fail "\"helmfile template\" shouldn't fail" +${helmfile} -f ${chartify_case_input_dir}/${config_file} template --set image.tag=v2 >${chartify_template_reverse} || fail "\"helmfile template\" shouldn't fail" ./dyff between -bs ${chartify_case_output_dir}/template-set ${chartify_template_reverse} || fail "\"helmfile template\" should be consistent" +info "Comparing template/chartify with values" +${helmfile} -f ${chartify_case_input_dir}/${config_file} template --values "./extra-values.yaml" >${chartify_template_reverse} || fail "\"helmfile template\" shouldn't fail" +./dyff between -bs ${chartify_case_output_dir}/template-values ${chartify_template_reverse} || fail "\"helmfile template\" should be consistent" -test_pass "helmfile template with chartify" \ No newline at end of file +test_pass "helmfile template with chartify" diff --git a/test/integration/test-cases/chartify/input/extra-values.yaml b/test/integration/test-cases/chartify/input/extra-values.yaml new file mode 100644 index 00000000..6c94f108 --- /dev/null +++ b/test/integration/test-cases/chartify/input/extra-values.yaml @@ -0,0 +1,3 @@ +--- +image: + tag: v3 diff --git a/test/integration/test-cases/chartify/input/helmfile.yaml b/test/integration/test-cases/chartify/input/helmfile.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/chartify/input/helmfile.yaml rename to test/integration/test-cases/chartify/input/helmfile.yaml.gotmpl diff --git a/test/integration/test-cases/chartify/output/template-values b/test/integration/test-cases/chartify/output/template-values new file mode 100644 index 00000000..f34afa09 --- /dev/null +++ b/test/integration/test-cases/chartify/output/template-values @@ -0,0 +1,61 @@ +--- +# Source: httpbin/templates/patched_resources.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app: httpbin + chart: httpbin-0.1.0 + heritage: Helm + release: httpbin + name: httpbin-httpbin +spec: + ports: + - name: httpbin + port: 8000 + protocol: TCP + targetPort: 8000 + selector: + app: httpbin + release: httpbin + type: LoadBalancer +--- +# Source: httpbin/templates/patched_resources.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: httpbin + chart: httpbin-0.1.0 + heritage: Helm + release: httpbin + name: httpbin-httpbin +spec: + replicas: 1 + selector: + matchLabels: + app: httpbin + strategy: + type: Recreate + template: + metadata: + labels: + app: httpbin + release: httpbin + spec: + containers: + - image: docker.io/citizenstig/httpbin:v3 + imagePullPolicy: Always + livenessProbe: + httpGet: + path: / + port: 8000 + name: httpbin + ports: + - containerPort: 8000 + readinessProbe: + httpGet: + path: / + port: 8000 + resources: {} +status: {} diff --git a/test/integration/test-cases/cli-overwrite-environment-values.sh b/test/integration/test-cases/cli-overwrite-environment-values.sh index 2835b849..8e51e159 100644 --- a/test/integration/test-cases/cli-overwrite-environment-values.sh +++ b/test/integration/test-cases/cli-overwrite-environment-values.sh @@ -6,24 +6,12 @@ cli_overwrite_environment_values_reverse=${cli_overwrite_environment_values_tmp} case_title="cli overwrite environment values" -if [[ ${HELMFILE_V1MODE} = true ]]; then - test_start "$case_title for v1" - info "Comparing ${case_title} for v1 output ${cli_overwrite_environment_values_reverse} with ${cli_overwrite_environment_values_output_dir}/overwritten.yaml" - for i in $(seq 10); do - info "Comparing build/cli-overwrite-environment-values #$i" - ${helmfile} -f ${cli_overwrite_environment_values_input_dir}/input_v1.yaml.gotmpl template --state-values-set ns=test3 > ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" shouldn't fail" - diff -u ${cli_overwrite_environment_values_output_dir}/output_v1.yaml ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" should be consistent" - echo code=$? - done - test_pass "cli overwrite environment values for v1" -else - test_start "${case_title}" - info "Comparing ${case_title} output ${cli_overwrite_environment_values_reverse} with ${cli_overwrite_environment_values_output_dir}/overwritten.yaml" - for i in $(seq 10); do - info "Comparing build/cli-overwrite-environment-values #$i" - ${helmfile} -f ${cli_overwrite_environment_values_input_dir}/input_v1.yaml.gotmpl template --state-values-set ns=test3 > ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" shouldn't fail" - diff -u ${cli_overwrite_environment_values_output_dir}/output_v1.yaml ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" should be consistent" - echo code=$? - done - test_pass "${case_title}" -fi \ No newline at end of file +test_start "$case_title" +info "Comparing ${case_title} for output ${cli_overwrite_environment_values_reverse} with ${cli_overwrite_environment_values_output_dir}/overwritten.yaml" +for i in $(seq 10); do + info "Comparing build/cli-overwrite-environment-values #$i" + ${helmfile} -f ${cli_overwrite_environment_values_input_dir}/input.yaml.gotmpl template --state-values-set ns=test3 --state-values-set-string imageTag=1.23.3,zone="zone1,zone2" > ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" shouldn't fail" + diff -u ${cli_overwrite_environment_values_output_dir}/output.yaml ${cli_overwrite_environment_values_reverse} || fail "\"helmfile template\" should be consistent" + echo code=$? +done +test_pass "cli overwrite environment values for v1" \ No newline at end of file diff --git a/test/integration/test-cases/cli-overwrite-environment-values/input/input.yaml b/test/integration/test-cases/cli-overwrite-environment-values/input/input.yaml deleted file mode 100644 index 28706d92..00000000 --- a/test/integration/test-cases/cli-overwrite-environment-values/input/input.yaml +++ /dev/null @@ -1,17 +0,0 @@ -environments: - default: - values: - - base.yaml - - override.yaml - -repositories: - - name: bitnami - url: https://charts.bitnami.com/bitnami - -releases: - - name: test - chart: bitnami/nginx - namespace: {{ .Values.ns }} - version: 13.2.27 - values: - - values.yaml.gotmpl diff --git a/test/integration/test-cases/cli-overwrite-environment-values/input/input_v1.yaml.gotmpl b/test/integration/test-cases/cli-overwrite-environment-values/input/input.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/cli-overwrite-environment-values/input/input_v1.yaml.gotmpl rename to test/integration/test-cases/cli-overwrite-environment-values/input/input.yaml.gotmpl diff --git a/test/integration/test-cases/cli-overwrite-environment-values/input/values.yaml.gotmpl b/test/integration/test-cases/cli-overwrite-environment-values/input/values.yaml.gotmpl index afc1af27..a1635c7b 100644 --- a/test/integration/test-cases/cli-overwrite-environment-values/input/values.yaml.gotmpl +++ b/test/integration/test-cases/cli-overwrite-environment-values/input/values.yaml.gotmpl @@ -1,2 +1,5 @@ image: - tag: {{ .Values.ns }} \ No newline at end of file + tag: {{ .Values.imageTag }} + +podAnnotations: + zone: {{ .Values.zone }} diff --git a/test/integration/test-cases/cli-overwrite-environment-values/output/output.yaml b/test/integration/test-cases/cli-overwrite-environment-values/output/output.yaml index ae8f779c..ba0f5cd7 100644 --- a/test/integration/test-cases/cli-overwrite-environment-values/output/output.yaml +++ b/test/integration/test-cases/cli-overwrite-environment-values/output/output.yaml @@ -1,9 +1,3 @@ -Warning: environments and releases cannot be defined within the same YAML part. Use --- to extract the environments into a dedicated part -Warning: environments and releases cannot be defined within the same YAML part. Use --- to extract the environments into a dedicated part -Adding repo bitnami https://charts.bitnami.com/bitnami -"bitnami" has been added to your repositories - -Templating release=test, chart=bitnami/nginx --- # Source: nginx/templates/svc.yaml apiVersion: v1 @@ -57,6 +51,7 @@ spec: app.kubernetes.io/instance: test app.kubernetes.io/managed-by: Helm annotations: + zone: "zone1,zone2" spec: automountServiceAccountToken: false @@ -81,7 +76,7 @@ spec: initContainers: containers: - name: nginx - image: docker.io/bitnami/nginx:test3 + image: docker.io/bitnami/nginx:1.23.3 imagePullPolicy: "IfNotPresent" env: - name: BITNAMI_DEBUG diff --git a/test/integration/test-cases/cli-overwrite-environment-values/output/output_v1.yaml b/test/integration/test-cases/cli-overwrite-environment-values/output/output_v1.yaml deleted file mode 100644 index 04eafff0..00000000 --- a/test/integration/test-cases/cli-overwrite-environment-values/output/output_v1.yaml +++ /dev/null @@ -1,110 +0,0 @@ ---- -# Source: nginx/templates/svc.yaml -apiVersion: v1 -kind: Service -metadata: - name: test-nginx - namespace: "test3" - labels: - app.kubernetes.io/name: nginx - helm.sh/chart: nginx-13.2.27 - app.kubernetes.io/instance: test - app.kubernetes.io/managed-by: Helm - annotations: -spec: - type: LoadBalancer - sessionAffinity: None - externalTrafficPolicy: "Cluster" - ports: - - name: http - port: 80 - targetPort: http - selector: - app.kubernetes.io/name: nginx - app.kubernetes.io/instance: test ---- -# Source: nginx/templates/deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: test-nginx - namespace: "test3" - labels: - app.kubernetes.io/name: nginx - helm.sh/chart: nginx-13.2.27 - app.kubernetes.io/instance: test - app.kubernetes.io/managed-by: Helm -spec: - replicas: 1 - strategy: - rollingUpdate: {} - type: RollingUpdate - selector: - matchLabels: - app.kubernetes.io/name: nginx - app.kubernetes.io/instance: test - template: - metadata: - labels: - app.kubernetes.io/name: nginx - helm.sh/chart: nginx-13.2.27 - app.kubernetes.io/instance: test - app.kubernetes.io/managed-by: Helm - annotations: - spec: - - automountServiceAccountToken: false - shareProcessNamespace: false - serviceAccountName: default - affinity: - podAffinity: - - podAntiAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - podAffinityTerm: - labelSelector: - matchLabels: - app.kubernetes.io/name: nginx - app.kubernetes.io/instance: test - topologyKey: kubernetes.io/hostname - weight: 1 - nodeAffinity: - - hostNetwork: false - hostIPC: false - initContainers: - containers: - - name: nginx - image: docker.io/bitnami/nginx:test3 - imagePullPolicy: "IfNotPresent" - env: - - name: BITNAMI_DEBUG - value: "false" - - name: NGINX_HTTP_PORT_NUMBER - value: "8080" - envFrom: - ports: - - name: http - containerPort: 8080 - livenessProbe: - failureThreshold: 6 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - tcpSocket: - port: http - readinessProbe: - failureThreshold: 3 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 3 - tcpSocket: - port: http - resources: - limits: {} - requests: {} - volumeMounts: - volumes: - diff --git a/test/integration/test-cases/happypath.sh b/test/integration/test-cases/happypath.sh index a9778a1d..2968a554 100644 --- a/test/integration/test-cases/happypath.sh +++ b/test/integration/test-cases/happypath.sh @@ -2,14 +2,7 @@ test_start "happypath - simple rollout of httpbin chart" happypath_case_input_dir="${cases_dir}/happypath/input" happypath_case_output_dir="${cases_dir}/happypath/output" -config_file="happypath.yaml" - -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${happypath_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi +config_file="happypath.yaml.gotmpl" info "Diffing ${happypath_case_input_dir}/${config_file}" bash -c "${helmfile} -f ${happypath_case_input_dir}/${config_file} diff --detailed-exitcode; code="'$?'"; [ "'${code}'" -eq 2 ]" || fail "unexpected exit code returned by helmfile diff" diff --git a/test/integration/test-cases/happypath/input/happypath.yaml b/test/integration/test-cases/happypath/input/happypath.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/happypath/input/happypath.yaml rename to test/integration/test-cases/happypath/input/happypath.yaml.gotmpl diff --git a/test/integration/test-cases/issue-1749.sh b/test/integration/test-cases/issue-1749.sh new file mode 100644 index 00000000..22344957 --- /dev/null +++ b/test/integration/test-cases/issue-1749.sh @@ -0,0 +1,12 @@ +issue_1749_input_dir="${cases_dir}/issue-1749/input" +helmfile_real="$(pwd)/${helmfile}" + +test_start "issue 1749 helmfile.d template --args --dry-run=server" +cd "${issue_1749_input_dir}" +${helmfile_real} template --args --dry-run=server || fail "\"issue 1749 helmfile.d template --args --dry-run=server\" shouldn't fail" +cd - +test_pass "issue 1749 helmfile.d template --args --dry-run=server" + +test_start "issue 1749 helmfile.yaml template --args --dry-run=server" +${helmfile_real} template -f "${issue_1749_input_dir}/helmfile-2in1.yaml.gotmpl" --args --dry-run=server || fail "\"issue 1749 helmfile.yaml template --args --dry-run=server\" shouldn't fail" +test_pass "issue 1749 helmfile.yaml template --args --dry-run=server" diff --git a/test/integration/test-cases/issue-1749/input/helmfile-2in1.yaml.gotmpl b/test/integration/test-cases/issue-1749/input/helmfile-2in1.yaml.gotmpl new file mode 100644 index 00000000..6f699a06 --- /dev/null +++ b/test/integration/test-cases/issue-1749/input/helmfile-2in1.yaml.gotmpl @@ -0,0 +1,23 @@ +releases: + - name: test1 + chart: ../../../charts/raw + values: + - templates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{`{{ .Release.Name }}`}} + data: + foo: {{`{{ (first (lookup "v1" "Namespace" "" "").items).metadata.name }}`}} + - name: test2 + chart: ../../../charts/raw + values: + - templates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{`{{ .Release.Name }}`}} + data: + foo: {{`{{ (first (lookup "v1" "Namespace" "" "").items).metadata.name }}`}} diff --git a/test/integration/test-cases/issue-1749/input/helmfile.d/helmfile1.yaml.gotmpl b/test/integration/test-cases/issue-1749/input/helmfile.d/helmfile1.yaml.gotmpl new file mode 100644 index 00000000..d2ec3c45 --- /dev/null +++ b/test/integration/test-cases/issue-1749/input/helmfile.d/helmfile1.yaml.gotmpl @@ -0,0 +1,16 @@ +repositories: +- name: bitnami + url: https://charts.bitnami.com/bitnami + +releases: + - name: test1 + chart: ../../../../charts/raw + values: + - templates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{`{{ .Release.Name }}`}} + data: + foo: {{`{{ (first (lookup "v1" "Namespace" "" "").items).metadata.name }}`}} diff --git a/test/integration/test-cases/issue-1749/input/helmfile.d/helmfile2.yaml.gotmpl b/test/integration/test-cases/issue-1749/input/helmfile.d/helmfile2.yaml.gotmpl new file mode 100644 index 00000000..17e616e6 --- /dev/null +++ b/test/integration/test-cases/issue-1749/input/helmfile.d/helmfile2.yaml.gotmpl @@ -0,0 +1,16 @@ +repositories: +- name: prometheus-community + url: https://prometheus-community.github.io/helm-charts + +releases: + - name: test2 + chart: ../../../../charts/raw + values: + - templates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: {{`{{ .Release.Name }}`}} + data: + foo: {{`{{ (first (lookup "v1" "Namespace" "" "").items).metadata.name }}`}} diff --git a/test/integration/test-cases/issue-1893.sh b/test/integration/test-cases/issue-1893.sh new file mode 100644 index 00000000..0306275b --- /dev/null +++ b/test/integration/test-cases/issue-1893.sh @@ -0,0 +1,8 @@ +issue_1893_input_dir="${cases_dir}/issue-1893/input" +helmfile_real="$(pwd)/${helmfile}" + +test_start "issue 1893 helmfile template" +cd "${issue_1893_input_dir}" +${helmfile_real} template || fail "\"issue 1893 helmfile template shouldn't fail" +cd - +test_pass "issue 1893 helmfile template" \ No newline at end of file diff --git a/test/integration/test-cases/issue-1893/input/helmfile.yaml b/test/integration/test-cases/issue-1893/input/helmfile.yaml new file mode 100644 index 00000000..f52eaef8 --- /dev/null +++ b/test/integration/test-cases/issue-1893/input/helmfile.yaml @@ -0,0 +1,20 @@ +--- +repositories: +- name: chartify-testdata + url: git+https://github.com/helmfile/chartify@testdata/charts/importvalues?ref=master + +releases: +- name: importvalues + chart: chartify-testdata/importvalues + version: 0.1.0 + transformers: + - apiVersion: builtin + kind: ValueAddTransformer + metadata: + name: add-annotation-issue + targets: + - fieldPath: metadata/annotations/issue + selector: + kind: ConfigMap + name: importvalues-imported-values + value: "1893" \ No newline at end of file diff --git a/test/integration/test-cases/postrender.sh b/test/integration/test-cases/postrender.sh index 5a1a2aee..dfeab508 100644 --- a/test/integration/test-cases/postrender.sh +++ b/test/integration/test-cases/postrender.sh @@ -1,14 +1,7 @@ postrender_case_input_dir="${cases_dir}/postrender/input" postrender_case_output_dir="${cases_dir}/postrender/output" -config_file="helmfile.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${postrender_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi - +config_file="helmfile.yaml.gotmpl" postrender_diff_out_file=${postrender_case_output_dir}/diff-result if [[ $EXTRA_HELMFILE_FLAGS == *--enable-live-output* ]]; then postrender_diff_out_file=${postrender_case_output_dir}/diff-result-live diff --git a/test/integration/test-cases/postrender/input/helmfile.yaml b/test/integration/test-cases/postrender/input/helmfile.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/postrender/input/helmfile.yaml rename to test/integration/test-cases/postrender/input/helmfile.yaml.gotmpl diff --git a/test/integration/test-cases/regression.sh b/test/integration/test-cases/regression.sh index 8a68d491..bc2ea412 100644 --- a/test/integration/test-cases/regression.sh +++ b/test/integration/test-cases/regression.sh @@ -4,44 +4,20 @@ test_start "regression tests" regression_case_input_dir="${cases_dir}/regression/input" info "https://github.com/roboll/helmfile/issues/1857" -config_file="issue.1857.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${regression_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi +config_file="issue.1857.yaml.gotmpl" (${helmfile} -f ${regression_case_input_dir}/${config_file} --state-values-set grafanaEnabled=true template | grep grafana 1>/dev/null) || fail "\"helmfile template\" shouldn't include grafana" ! (${helmfile} -f ${regression_case_input_dir}/${config_file} --state-values-set grafanaEnabled=false template | grep grafana) || fail "\"helmfile template\" shouldn't include grafana" info "https://github.com/roboll/helmfile/issues/1867" -config_file="issue.1867.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${regression_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi +config_file="issue.1867.yaml.gotmpl" (${helmfile} -f ${regression_case_input_dir}/${config_file} template 1>/dev/null) || fail "\"helmfile template\" shouldn't fail" info "https://github.com/roboll/helmfile/issues/2118" -config_file="issue.2118.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${regression_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi +config_file="issue.2118.yaml.gotmpl" (${helmfile} -f ${regression_case_input_dir}/${config_file} template 1>/dev/null) || fail "\"helmfile template\" shouldn't fail" info "https://github.com/helmfile/helmfile/issues/1682" -config_file="issue.1682.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${regression_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi +config_file="issue.1682.yaml.gotmpl" (${helmfile} -f ${regression_case_input_dir}/${config_file} deps 1>/dev/null) || fail "\"helmfile deps\" shouldn't fail" test_pass "regression tests" \ No newline at end of file diff --git a/test/integration/test-cases/regression/input/issue.1682.yaml b/test/integration/test-cases/regression/input/issue.1682.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/regression/input/issue.1682.yaml rename to test/integration/test-cases/regression/input/issue.1682.yaml.gotmpl diff --git a/test/integration/test-cases/regression/input/issue.1857.yaml b/test/integration/test-cases/regression/input/issue.1857.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/regression/input/issue.1857.yaml rename to test/integration/test-cases/regression/input/issue.1857.yaml.gotmpl diff --git a/test/integration/test-cases/regression/input/issue.1867.yaml b/test/integration/test-cases/regression/input/issue.1867.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/regression/input/issue.1867.yaml rename to test/integration/test-cases/regression/input/issue.1867.yaml.gotmpl diff --git a/test/integration/test-cases/regression/input/issue.2118.yaml b/test/integration/test-cases/regression/input/issue.2118.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/regression/input/issue.2118.yaml rename to test/integration/test-cases/regression/input/issue.2118.yaml.gotmpl diff --git a/test/integration/test-cases/secretssops.sh b/test/integration/test-cases/secretssops.sh index b4c53f79..b5085275 100644 --- a/test/integration/test-cases/secretssops.sh +++ b/test/integration/test-cases/secretssops.sh @@ -4,13 +4,7 @@ sops="sops --hc-vault-transit $VAULT_ADDR/v1/sops/keys/key" secretssops_case_input_dir="${cases_dir}/secretssops/input" secretssops_case_output_dir="${cases_dir}/secretssops/output" -config_file="secretssops.yaml" -if [[ ${HELMFILE_V1MODE} = true ]]; then - pushd "${secretssops_case_input_dir}" - mv "${config_file}" "${config_file}.gotmpl" - config_file="${config_file}.gotmpl" - popd -fi +config_file="secretssops.yaml.gotmpl" mkdir -p ${secretssops_case_input_dir}/tmp diff --git a/test/integration/test-cases/secretssops/input/secretssops.yaml b/test/integration/test-cases/secretssops/input/secretssops.yaml.gotmpl similarity index 100% rename from test/integration/test-cases/secretssops/input/secretssops.yaml rename to test/integration/test-cases/secretssops/input/secretssops.yaml.gotmpl diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments.sh b/test/integration/test-cases/state-values-set-cli-args-in-environments.sh new file mode 100644 index 00000000..e9de8f8d --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments.sh @@ -0,0 +1,14 @@ +state_values_set_cli_args_in_environments_input_dir="${cases_dir}/state-values-set-cli-args-in-environments/input" +state_values_set_cli_args_in_environments_output_dir="${cases_dir}/state-values-set-cli-args-in-environments/output" + +state_values_set_cli_args_in_environments_tmp=$(mktemp -d) +state_values_set_cli_args_in_environments_reverse=${state_values_set_cli_args_in_environments_tmp}/state.values.set.cli.args.build.yaml + +test_start "state values set cli args in environments" +info "Comparing state values set cli args environments output ${state_values_set_cli_args_in_environments_reverse} with ${state_values_set_cli_args_in_environments_output_dir}/output.yaml" + +${helmfile} -f ${state_values_set_cli_args_in_environments_input_dir}/helmfile.yaml.gotmpl template $(cat "$state_values_set_cli_args_in_environments_input_dir/helmfile-extra-args") --skip-deps > "${state_values_set_cli_args_in_environments_reverse}" || fail "\"helmfile template\" shouldn't fail" +./dyff between -bs "${state_values_set_cli_args_in_environments_output_dir}/output.yaml" "${state_values_set_cli_args_in_environments_reverse}" || fail "\"helmfile template\" should be consistent" +echo code=$? + +test_pass "state values set cli args in environments" diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/input/environments.yaml.gotmpl b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/environments.yaml.gotmpl new file mode 100644 index 00000000..e822c582 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/environments.yaml.gotmpl @@ -0,0 +1,2 @@ +--- +foo: {{ .Values.foo }} diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile-extra-args b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile-extra-args new file mode 100644 index 00000000..aed11348 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile-extra-args @@ -0,0 +1 @@ +--state-values-set foo=bar diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile.yaml.gotmpl b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile.yaml.gotmpl new file mode 100644 index 00000000..e7cefc94 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/input/helmfile.yaml.gotmpl @@ -0,0 +1,17 @@ +environments: + default: + values: + - environments.yaml.gotmpl +--- +releases: +- name: state-value-set-args-environments + chart: ../../../charts/raw + values: + - templates: + - | + apiVersion: v1 + kind: ConfigMap + metadata: + name: test + data: + foo: {{ .Values.foo }} diff --git a/test/integration/test-cases/state-values-set-cli-args-in-environments/output/output.yaml b/test/integration/test-cases/state-values-set-cli-args-in-environments/output/output.yaml new file mode 100644 index 00000000..e0451d01 --- /dev/null +++ b/test/integration/test-cases/state-values-set-cli-args-in-environments/output/output.yaml @@ -0,0 +1,8 @@ +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: test +data: + foo: bar diff --git a/test/integration/test-cases/v1-subhelmfile-multi-bases-with-array-values.sh b/test/integration/test-cases/v1-subhelmfile-multi-bases-with-array-values.sh index a234fb19..113f45fa 100644 --- a/test/integration/test-cases/v1-subhelmfile-multi-bases-with-array-values.sh +++ b/test/integration/test-cases/v1-subhelmfile-multi-bases-with-array-values.sh @@ -1,19 +1,20 @@ -if [[ ${HELMFILE_V1MODE} = true ]]; then - v1_subhelmfile_multi_bases_with_array_values_input_dir="${cases_dir}/v1-subhelmfile-multi-bases-with-array-values/input" - v1_subhelmfile_multi_bases_with_array_values_output_dir="${cases_dir}/v1-subhelmfile-multi-bases-with-array-values/output" +v1_subhelmfile_multi_bases_with_array_values_input_dir="${cases_dir}/v1-subhelmfile-multi-bases-with-array-values/input" +v1_subhelmfile_multi_bases_with_array_values_output_dir="${cases_dir}/v1-subhelmfile-multi-bases-with-array-values/output" - yaml_overwrite_tmp=$(mktemp -d) - yaml_overwrite_reverse=${yaml_overwrite_tmp}/helmfile_template_result +yaml_overwrite_tmp=$(mktemp -d) +yaml_overwrite_reverse=${yaml_overwrite_tmp}/helmfile_template_result - test_start "v1 subhelmfile multi bases with array values" - info "Comparing v1 subhelmfile multi bases with array values output ${yaml_overwrite_reverse} with ${v1_subhelmfile_multi_bases_with_array_values_output_dir}/result" - for i in $(seq 10); do - info "Comparing build/v1-subhelmfile-multi-bases-with-array-values #$i" - ${helmfile} -f ${v1_subhelmfile_multi_bases_with_array_values_input_dir}/helmfile.yaml.gotmpl template -e dev &> ${yaml_overwrite_reverse} || fail "\"helmfile template\" shouldn't fail" - diff -u ${v1_subhelmfile_multi_bases_with_array_values_output_dir}/result ${yaml_overwrite_reverse} || fail "\"helmfile template\" should be consistent" - echo code=$? - done - test_pass "v1 subhelmfile multi bases with array values" -else - test_pass "[skipped] v1 subhelmfile multi bases with array values" -fi \ No newline at end of file +v1_subhelmfile_multi_bases_with_array_values_output_file=${v1_subhelmfile_multi_bases_with_array_values_output_dir}/result +if [[ $EXTRA_HELMFILE_FLAGS == *--enable-live-output* ]]; then + v1_subhelmfile_multi_bases_with_array_values_output_file=${v1_subhelmfile_multi_bases_with_array_values_output_dir}/result-live +fi + +test_start "v1 subhelmfile multi bases with array values" +info "Comparing v1 subhelmfile multi bases with array values output ${yaml_overwrite_reverse} with ${v1_subhelmfile_multi_bases_with_array_values_output_file}" +for i in $(seq 10); do + info "Comparing build/v1-subhelmfile-multi-bases-with-array-values #$i" + ${helmfile} -f ${v1_subhelmfile_multi_bases_with_array_values_input_dir}/helmfile.yaml.gotmpl template -e dev &> ${yaml_overwrite_reverse} || fail "\"helmfile template\" shouldn't fail" + diff -u ${v1_subhelmfile_multi_bases_with_array_values_output_file} ${yaml_overwrite_reverse} || fail "\"helmfile template\" should be consistent" + echo code=$? +done +test_pass "v1 subhelmfile multi bases with array values" \ No newline at end of file diff --git a/test/integration/test-cases/v1-subhelmfile-multi-bases-with-array-values/output/result-live b/test/integration/test-cases/v1-subhelmfile-multi-bases-with-array-values/output/result-live new file mode 100644 index 00000000..ba42d6c6 --- /dev/null +++ b/test/integration/test-cases/v1-subhelmfile-multi-bases-with-array-values/output/result-live @@ -0,0 +1,25 @@ +Live output is enabled +Adding repo incubator https://charts.helm.sh/incubator/ +"incubator" has been added to your repositories + +Templating release=helmfile-test, chart=incubator/raw +--- +# Source: raw/templates/resources.yaml +apiVersion: v1 +kind: Pod +metadata: + labels: + app: raw + chart: raw-0.1.0 + heritage: Helm + release: helmfile-test + name: test +spec: + containers: + - command: + - /bin/sh + - -c + - env + image: registry.k8s.io/busybox + name: test-container + diff --git a/test/integration/test-cases/yaml-overwrite.sh b/test/integration/test-cases/yaml-overwrite.sh index a4a45825..617d8f97 100644 --- a/test/integration/test-cases/yaml-overwrite.sh +++ b/test/integration/test-cases/yaml-overwrite.sh @@ -1,19 +1,15 @@ -if [[ ${HELMFILE_V1MODE} = true ]]; then - yaml_overwrite_case_input_dir="${cases_dir}/yaml-overwrite/input" - yaml_overwrite_case_output_dir="${cases_dir}/yaml-overwrite/output" +yaml_overwrite_case_input_dir="${cases_dir}/yaml-overwrite/input" +yaml_overwrite_case_output_dir="${cases_dir}/yaml-overwrite/output" - yaml_overwrite_tmp=$(mktemp -d) - yaml_overwrite_reverse=${yaml_overwrite_tmp}/yaml.override.build.yaml +yaml_overwrite_tmp=$(mktemp -d) +yaml_overwrite_reverse=${yaml_overwrite_tmp}/yaml.override.build.yaml - test_start "yaml overwrite feature" - info "Comparing yaml overwrite feature output ${yaml_overwrite_reverse} with ${yaml_overwrite_case_output_dir}/overwritten.yaml" - for i in $(seq 10); do - info "Comparing build/yaml-overwrite #$i" - ${helmfile} -f ${yaml_overwrite_case_input_dir}/issue.657.yaml.gotmpl template --skip-deps > ${yaml_overwrite_reverse} || fail "\"helmfile template\" shouldn't fail" - ./dyff between -bs ${yaml_overwrite_case_output_dir}/overwritten.yaml ${yaml_overwrite_reverse} || fail "\"helmfile template\" should be consistent" - echo code=$? - done - test_pass "yaml overwrite feature" -else - test_pass "[skipped] yaml overwrite feature" -fi \ No newline at end of file +test_start "yaml overwrite feature" +info "Comparing yaml overwrite feature output ${yaml_overwrite_reverse} with ${yaml_overwrite_case_output_dir}/overwritten.yaml" +for i in $(seq 10); do + info "Comparing build/yaml-overwrite #$i" + ${helmfile} -f ${yaml_overwrite_case_input_dir}/issue.657.yaml.gotmpl template --skip-deps > ${yaml_overwrite_reverse} || fail "\"helmfile template\" shouldn't fail" + ./dyff between -bs ${yaml_overwrite_case_output_dir}/overwritten.yaml ${yaml_overwrite_reverse} || fail "\"helmfile template\" should be consistent" + echo code=$? +done +test_pass "yaml overwrite feature" \ No newline at end of file