diff --git a/.github/actions/notify-slack/action.yaml b/.github/actions/notify-slack/action.yaml deleted file mode 100644 index 7ce383f8d8..0000000000 --- a/.github/actions/notify-slack/action.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: "Notify slack" -description: "Send a message by webhook" -inputs: - webhook-url: - description: "Webhook URL to send the message to" - required: true - message: - description: "Message text" - required: true - channel: - description: "Slack channel" - required: true -outputs: {} -runs: - using: "composite" - steps: - - name: Notify slack - shell: bash - env: - msg: | - { - "channel": "${{ inputs.channel }}", - "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "${{ inputs.message }}" - } - }, - { - "type": "actions", - "elements": [ - { - "type": "button", - "text": { - "type": "plain_text", - "text": "View run" - }, - "url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - } - ] - } - ] - } - # Using curl here is just hard to read (and - # https://github.com/curl/curl/issues/1978) - run: printenv msg | http --body --check-status "${{ inputs.webhook-url }}" diff --git a/.github/aws-nuke-config.yaml b/.github/aws-nuke-config.yaml deleted file mode 100644 index c85279c907..0000000000 --- a/.github/aws-nuke-config.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -regions: - - "us-west-2" - -account-blocklist: - - "we-dont-have-a-prod-account-to-blacklist-but-this-field-is-mandatory" - -accounts: - AWS_ACCOUNT_ID_REPLACE_ME: - filters: - CloudFormationStack: - - "EC2RoleWatchDog" - - "Create-PatchBaseline" - - "PVRE-ComplianceReporting" - - "aws-sam-cli-managed-default" diff --git a/.github/workflows/aws-cleanup.yaml b/.github/workflows/aws-cleanup.yaml deleted file mode 100644 index 0c66512366..0000000000 --- a/.github/workflows/aws-cleanup.yaml +++ /dev/null @@ -1,34 +0,0 @@ -name: AWS cleanup - -on: - schedule: - - cron: '0 0 * * 0' - workflow_dispatch: {} - -jobs: - cleanup: - name: Cleanup AWS resources - environment: "Integration tests" - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Run AWS nuke - timeout-minutes: 1200 - env: - AWS_ACCESS_KEY_ID: "${{ secrets.AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.AWS_SECRET_ACCESS_KEY }}" - AWS_ACCOUNT_ID: "${{ secrets.AWS_ACCOUNT_ID }}" - working-directory: .github - # Cloudformation deletes are slow and not in parallel, so your better off deleting all EKS resources first as they - # run in parallel. - run: | - sed -i "s/AWS_ACCOUNT_ID_REPLACE_ME/$AWS_ACCOUNT_ID/" aws-nuke-config.yaml - wget https://github.com/rebuy-de/aws-nuke/releases/download/v2.15.0-rc.3/aws-nuke-v2.15.0.rc.3-linux-amd64.tar.gz - tar -xvf aws-nuke-v2.15.0.rc.3-linux-amd64.tar.gz - mv aws-nuke-v2.15.0.rc.3-linux-amd64 aws-nuke - chmod +x aws-nuke - ./aws-nuke -c aws-nuke-config.yaml --force --no-dry-run --target=EKSNodegroups,EKSFargateProfiles,EKSCluster - ./aws-nuke -c aws-nuke-config.yaml --force --no-dry-run --target=CloudFormationStack - ./aws-nuke -c aws-nuke-config.yaml --force --no-dry-run --target=EC2VPC - diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a274a42e21..c47f415353 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -10,7 +10,7 @@ jobs: lint: name: Lint runs-on: ubuntu-latest - container: weaveworks/eksctl-build:a6c29f81a85a7f438c60686b01d74bec7b0dfb82 + container: weaveworks/eksctl-build:83999a3391d78ed18a2e6093328d1122c927956f steps: - name: Checkout uses: actions/checkout@v2 diff --git a/.github/workflows/integration-tests.yaml b/.github/workflows/integration-tests.yaml deleted file mode 100644 index 805b5787bb..0000000000 --- a/.github/workflows/integration-tests.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: Integration tests - -on: - schedule: - - cron: '0 */12 * * 1,2,3,4,5,6' - workflow_dispatch: {} - -jobs: - it: - name: Run integration tests - environment: "Integration tests" - runs-on: ubuntu-latest - container: weaveworks/eksctl-build:a6c29f81a85a7f438c60686b01d74bec7b0dfb82 - env: - SSH: "/root/.ssh" - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Cache go-build and mod - uses: actions/cache@v2 - with: - path: | - ~/.cache/go-build/ - ~/go/pkg/mod/ - key: ${{ hashFiles('go.sum') }} - - name: Setup SSH known hosts - shell: bash - run: | - mkdir -p ${SSH} && chmod 700 ${SSH} - ssh-keyscan github.com >> ${SSH}/known_hosts - - name: Setup SSH key - shell: bash - env: - SSH_AUTH_SOCK: /tmp/ssh_agent.sock - run: | - ssh-agent -a $SSH_AUTH_SOCK > /dev/null - ssh-add - <<< "${{ secrets.EKSCTLBOT_SSH_KEY }}" - - name: Run integration tests - env: - SSH_AUTH_SOCK: /tmp/ssh_agent.sock - AWS_ACCESS_KEY_ID: "${{ secrets.AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.AWS_SECRET_ACCESS_KEY }}" - TEST_V: "1" - GITHUB_TOKEN: "${{ secrets.EKSCTLBOT_TOKEN }}" - run: make integration-test - - name: Notify slack on success - if: success() && github.event_name == 'schedule' - uses: ./.github/actions/notify-slack - with: - webhook-url: "${{ secrets.SLACK_WEBHOOK }}" - message: ":deal-with-it-parrot: An integration test run succeeded!" - channel: team-pitch-black - - name: Notify slack on failure - if: failure() && github.event_name == 'schedule' - uses: ./.github/actions/notify-slack - with: - webhook-url: "${{ secrets.SLACK_WEBHOOK }}" - message: ":ahhhhhhhhh: An integration test run failed!" - channel: team-pitch-black diff --git a/.github/workflows/release-candidate.yaml b/.github/workflows/release-candidate.yaml index 46d142803c..762e2fc4a9 100644 --- a/.github/workflows/release-candidate.yaml +++ b/.github/workflows/release-candidate.yaml @@ -1,39 +1,14 @@ name: Release candidate on: - workflow_dispatch: - inputs: - skipIntegrationTests: - description: 'Skip check for successful integration tests:' - default: 'false' + workflow_dispatch: {} jobs: rc: name: Trigger release candidate build runs-on: ubuntu-latest - container: weaveworks/eksctl-build:a6c29f81a85a7f438c60686b01d74bec7b0dfb82 + container: weaveworks/eksctl-build:83999a3391d78ed18a2e6093328d1122c927956f steps: - - uses: actions/github-script@v3 - name: Get integration tests status - id: it-status - with: - github-token: ${{ secrets.WEAVEWORKSBOT_TOKEN }} - script: | - // There's no other way to identify the integration test job - // GH branch protections are also just a string - // must be in sync with integration-tests.yaml - const integrationTestsCheckName = "Run integration tests"; - const { data } = await github.checks.listForRef({ - ...context.repo, - ref: "${{ github.sha }}", - check_name: integrationTestsCheckName, - }); - return data.check_runs.some(cr => - cr.status === "completed" && cr.conclusion === "success" - ); - - name: Fail if integration tests not passed - if: "!fromJson(steps.it-status.outputs.result) && !fromJson(github.event.inputs.skipIntegrationTests)" - run: echo "Integration tests haven't passed yet!" && exit 1 - name: Checkout uses: actions/checkout@v2 with: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6074f9ecda..b334ecf2eb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -7,7 +7,7 @@ jobs: rc: name: Trigger release build runs-on: ubuntu-latest - container: weaveworks/eksctl-build:a6c29f81a85a7f438c60686b01d74bec7b0dfb82 + container: weaveworks/eksctl-build:83999a3391d78ed18a2e6093328d1122c927956f steps: - name: Checkout uses: actions/checkout@v2 diff --git a/.github/workflows/tag-release.yaml b/.github/workflows/tag-release.yaml index dbac9c9231..5f77d3ed0b 100644 --- a/.github/workflows/tag-release.yaml +++ b/.github/workflows/tag-release.yaml @@ -18,7 +18,7 @@ jobs: name: Tag release from version environment: release runs-on: ubuntu-latest - container: weaveworks/eksctl-build:a6c29f81a85a7f438c60686b01d74bec7b0dfb82 + container: weaveworks/eksctl-build:83999a3391d78ed18a2e6093328d1122c927956f steps: - name: Checkout uses: actions/checkout@v2 diff --git a/.github/workflows/update-generated.yaml b/.github/workflows/update-generated.yaml index b1afd2acbf..fa9bbaaacb 100644 --- a/.github/workflows/update-generated.yaml +++ b/.github/workflows/update-generated.yaml @@ -55,7 +55,7 @@ jobs: update_aws_node: name: Update aws-node and open PR runs-on: ubuntu-latest - container: weaveworks/eksctl-build:a6c29f81a85a7f438c60686b01d74bec7b0dfb82 + container: weaveworks/eksctl-build:83999a3391d78ed18a2e6093328d1122c927956f env: UPDATE_BRANCH: update-aws-node GOPRIVATE: "" diff --git a/.requirements b/.requirements index e02e5f2ad4..5683496f7e 100644 --- a/.requirements +++ b/.requirements @@ -3,7 +3,6 @@ github.com/cloudflare/cfssl/cmd/cfssl@v1.5.0 github.com/cloudflare/cfssl/cmd/cfssljson@v1.5.0 github.com/golangci/golangci-lint/cmd/golangci-lint github.com/goreleaser/goreleaser -github.com/kevinburke/go-bindata/go-bindata github.com/onsi/ginkgo/ginkgo@v1.16.4 github.com/vektra/mockery/cmd/mockery github.com/github-release/github-release diff --git a/Dockerfile b/Dockerfile index ca446e6777..60427db242 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG BUILD_IMAGE=/weaveworks/eksctl-build:a6c29f81a85a7f438c60686b01d74bec7b0dfb82 +ARG BUILD_IMAGE=/weaveworks/eksctl-build:83999a3391d78ed18a2e6093328d1122c927956f FROM $BUILD_IMAGE as build WORKDIR /src diff --git a/Makefile b/Makefile index 2d0379382c..c916fca40c 100644 --- a/Makefile +++ b/Makefile @@ -16,16 +16,8 @@ generated_code_deep_copy_helper := pkg/apis/eksctl.io/v1alpha5/zz_generated.deep generated_code_aws_sdk_mocks := $(wildcard pkg/eks/mocks/*API.go) conditionally_generated_files := \ - userdocs/src/usage/schema.json \ $(generated_code_deep_copy_helper) $(generated_code_aws_sdk_mocks) -all_generated_files := \ - pkg/nodebootstrap/bindata/assets.go \ - pkg/addons/default/assets.go \ - pkg/addons/assets.go \ - pkg/apis/eksctl.io/v1alpha5 \ - $(conditionally_generated_files) - .DEFAULT_GOAL := help ##@ Utility @@ -168,17 +160,10 @@ delete-integration-test-dev-cluster: build ## Delete the test cluster for use wh ##@ Code Generation -## Important: pkg/addons/default/generate.go depends on pkg/addons/default/assets/aws-node.yaml If this file is -## not present, the generation of assets will not fail but will not contain it. .PHONY: generate-always generate-always: pkg/addons/default/assets/aws-node.yaml ## Generate code (required for every build) - @# go-bindata targets must run every time, as dependencies are too complex to declare in make: - @# - deleting an asset is breaks the dependencies - @# - different version of go-bindata generate different code - @go-bindata -v go generate ./pkg/apis/eksctl.io/v1alpha5/generate.go go generate ./pkg/nodebootstrap - go generate ./pkg/addons/default/generate.go go generate ./pkg/addons go generate ./pkg/authconfigmap go generate ./pkg/eks @@ -193,7 +178,7 @@ generate-all: generate-always $(conditionally_generated_files) ## Re-generate al .PHONY: check-all-generated-files-up-to-date check-all-generated-files-up-to-date: generate-all ## Run the generate all command and verify there is no new diff - git diff --quiet -- $(all_generated_files) || (git --no-pager diff $(all_generated_files); echo "HINT: to fix this, run 'git commit $(all_generated_files) --message \"Update generated files\"'"; exit 1) + git diff --quiet -- $(conditionally_generated_files) || (git --no-pager diff $(conditionally_generated_files); echo "HINT: to fix this, run 'git commit $(conditionally_generated_files) --message \"Update generated files\"'"; exit 1) ### Update maxpods.go from AWS .PHONY: update-maxpods @@ -207,7 +192,6 @@ pkg/addons/default/assets/aws-node.yaml: .PHONY: update-aws-node update-aws-node: ## Re-download the aws-node manifests from AWS go generate ./pkg/addons/default/aws_node_generate.go - go generate ./pkg/addons/default/generate.go deep_copy_helper_input = $(shell $(call godeps_cmd,./pkg/apis/...) | sed 's|$(generated_code_deep_copy_helper)||' ) $(generated_code_deep_copy_helper): $(deep_copy_helper_input) ## Generate Kubernetes API helpers diff --git a/build/docker/build_image_manifest b/build/docker/build_image_manifest index a6c29f81a8..83999a3391 100644 --- a/build/docker/build_image_manifest +++ b/build/docker/build_image_manifest @@ -2,8 +2,7 @@ "github.com/cloudflare/cfssl v1.6.1" "github.com/cloudflare/cfssl v1.6.1" "github.com/golangci/golangci-lint v1.42.0" -"github.com/goreleaser/goreleaser v0.177.0" -"github.com/kevinburke/go-bindata v3.22.0+incompatible" +"github.com/goreleaser/goreleaser v0.182.1" "github.com/onsi/ginkgo v1.16.4" "github.com/vektra/mockery v1.1.2" "github.com/github-release/github-release v0.10.0" @@ -15,5 +14,5 @@ "k8s.io/code-generator v0.21.2" "sigs.k8s.io/mdtoc v1.0.1" 100644 blob a73dcb54fd6215c023ffea7f781e313b41841135 build/docker/Dockerfile -100644 blob e02e5f2ad4516bd586dd870006e14a8a5a168093 .requirements +100644 blob 5683496f7ee0443658a663785d87e404096459d6 .requirements 100755 blob c1129ff1ff85ac2c53f908a577675ea59a9325a7 build/scripts/install-build-deps.sh diff --git a/build/docker/image_tag b/build/docker/image_tag index 6b26cce9de..387232386a 100644 --- a/build/docker/image_tag +++ b/build/docker/image_tag @@ -1 +1 @@ -a6c29f81a85a7f438c60686b01d74bec7b0dfb82 +83999a3391d78ed18a2e6093328d1122c927956f diff --git a/cmd/schema/generate.go b/cmd/schema/generate.go index 1a6af2066a..828ac6a707 100644 --- a/cmd/schema/generate.go +++ b/cmd/schema/generate.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "io/ioutil" "os" "path/filepath" @@ -48,7 +47,7 @@ func main() { panic(err) } fmt.Println("Writing docs schema to " + outputFile) - if err := ioutil.WriteFile(outputFile, bytes, 0755); err != nil { + if err := os.WriteFile(outputFile, bytes, 0755); err != nil { panic(err) } } diff --git a/docs/release_notes/0.70.0.md b/docs/release_notes/0.70.0.md new file mode 100644 index 0000000000..7fda7caea0 --- /dev/null +++ b/docs/release_notes/0.70.0.md @@ -0,0 +1,9 @@ +# Release 0.70.0 + +## Features + +- Parse task log to be more human readable (#4290) + +## Improvements + +- Add support for specifying latest version in cluster config (#4258) diff --git a/docs/release_notes/0.71.0.md b/docs/release_notes/0.71.0.md new file mode 100644 index 0000000000..d5b65cc2ea --- /dev/null +++ b/docs/release_notes/0.71.0.md @@ -0,0 +1,21 @@ +# Release 0.71.0 + +## Breaking Changes +- [Breaking] Remove incomplete support for GPU instance types in Bottlerocket and Windows nodegroups ([#4238](https://github.com/weaveworks/eksctl/issues/4238)) + +## Features + +- Add iamidentitymapping delete and get commands (#4346) + +## Improvements + +- Move from io/ioutil to io and os packages (#4333) + +## Bug Fixes + +- Validate support for GPU instance types (#4243) +- Wait for addons to be healthy only if there are nodegroups when creating a cluster (#4332) + +## Acknowledgments +Weaveworks would like to sincerely thank: + @Juneezee diff --git a/docs/release_notes/0.72.0.md b/docs/release_notes/0.72.0.md new file mode 100644 index 0000000000..f0c40ec118 --- /dev/null +++ b/docs/release_notes/0.72.0.md @@ -0,0 +1,9 @@ +# Release 0.72.0 + +## Features + +- Native Bottlerocket support in managed nodegroups (#4381) + +## Bug Fixes + +- Add ARM support and fix AMI resolution for Ubuntu (#4367) diff --git a/docs/release_notes/0.73.0.md b/docs/release_notes/0.73.0.md new file mode 100644 index 0000000000..a78c0b771e --- /dev/null +++ b/docs/release_notes/0.73.0.md @@ -0,0 +1,20 @@ +# Release 0.73.0 + +## Features + +- Support CloudWatch log retention (#4295) +- Add support for Windows Server 20H2 (#4390) + +## Improvements + +- Make kubernetes 1.21 default (#4394) +- Reduce API calls in upgrade cluster (#4366) + +## Bug Fixes + +- Fix wait for managed nodegroups (#4401) +- Scale managed nodegroup with --name flag (#4383) + +## Acknowledgments +Weaveworks would like to sincerely thank: + @abhipth and @adammw diff --git a/examples/11-cloudwatch-cluster-logging.yaml b/examples/11-cloudwatch-cluster-logging.yaml index 78e07f0f2a..b2747ac9d2 100644 --- a/examples/11-cloudwatch-cluster-logging.yaml +++ b/examples/11-cloudwatch-cluster-logging.yaml @@ -18,3 +18,7 @@ cloudWatch: enableTypes: ["audit", "authenticator", "controllerManager"] # all supported types: "api", "audit", "authenticator", "controllerManager", "scheduler" # supported special values: "*" and "all" + + # Sets the number of days to retain the logs for (see [CloudWatch docs](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutRetentionPolicy.html#API_PutRetentionPolicy_RequestSyntax)). + # By default, log data is stored in CloudWatch Logs indefinitely. + logRetentionInDays: 60 diff --git a/go.mod b/go.mod index 0744b4680c..d291293630 100644 --- a/go.mod +++ b/go.mod @@ -7,19 +7,19 @@ go 1.17 require ( 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a // indirect - cloud.google.com/go v0.81.0 // indirect - cloud.google.com/go/storage v1.15.0 // indirect + cloud.google.com/go v0.94.0 // indirect + cloud.google.com/go/storage v1.16.1 // indirect code.gitea.io/sdk/gitea v0.15.0 // indirect github.com/AlekSi/pointer v1.1.0 // indirect github.com/Antonboom/errname v0.1.3 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go v54.0.0+incompatible // indirect - github.com/Azure/azure-storage-blob-go v0.13.0 // indirect + github.com/Azure/azure-sdk-for-go v57.0.0+incompatible // indirect + github.com/Azure/azure-storage-blob-go v0.14.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.18 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.13 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.7 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 // indirect + github.com/Azure/go-autorest/autorest v0.11.20 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.15 // indirect + github.com/Azure/go-autorest/autorest/azure/auth v0.5.8 // indirect + github.com/Azure/go-autorest/autorest/azure/cli v0.4.3 // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect @@ -41,10 +41,8 @@ require ( github.com/ashanbrown/forbidigo v1.2.0 // indirect github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde // indirect github.com/aws/amazon-ec2-instance-selector/v2 v2.0.3-0.20210303155736-3e43512d88f8 - github.com/aws/aws-sdk-go v1.41.10 + github.com/aws/aws-sdk-go v1.41.19 github.com/awslabs/goformation/v4 v4.15.5 // indirect - github.com/bazelbuild/bazel-gazelle v0.19.1 // indirect - github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 // indirect github.com/benjamintf1/unmarshalledmatchers v0.0.0-20190408201839-bb1c1f34eaea github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect @@ -63,7 +61,6 @@ require ( github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/charithe/durationcheck v0.0.8 // indirect github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af // indirect - github.com/client9/misspell v0.3.4 // indirect github.com/cloudflare/cfssl v1.6.1 github.com/coreos/go-semver v0.3.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect @@ -71,7 +68,7 @@ require ( github.com/dave/jennifer v1.4.1 github.com/davecgh/go-spew v1.1.1 // indirect github.com/denis-tingajkin/go-header v0.4.2 // indirect - github.com/denverdino/aliyungo v0.0.0-20191128015008-acd8035bbb1d // indirect + github.com/denverdino/aliyungo v0.0.0-20210425065611-55bee4942cba // indirect github.com/dghubble/go-twitter v0.0.0-20210609183100-2fdbf421508e // indirect github.com/dghubble/oauth1 v0.7.0 // indirect github.com/dghubble/sling v1.3.0 // indirect @@ -89,17 +86,16 @@ require ( github.com/fluxcd/go-git-providers v0.2.0 github.com/fluxcd/helm-operator/pkg/install v0.0.0-20200729150005-1467489f7ee4 // helm-operator 1.2.0 github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/fzipp/gocyclo v0.3.1 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/github-release/github-release v0.10.0 - github.com/go-bindata/go-bindata v3.1.2+incompatible // indirect github.com/go-critic/go-critic v0.5.6 // indirect github.com/go-errors/errors v1.0.1 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.1.0 // indirect github.com/go-git/go-git/v5 v5.3.0 // indirect - github.com/go-ini/ini v1.51.0 // indirect + github.com/go-ini/ini v1.62.0 // indirect github.com/go-logr/logr v0.4.0 // indirect github.com/go-openapi/jsonpointer v0.19.3 // indirect github.com/go-openapi/jsonreference v0.19.3 // indirect @@ -113,12 +109,11 @@ require ( github.com/go-toolsmith/strparse v1.0.0 // indirect github.com/go-toolsmith/typep v1.0.2 // indirect github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect - github.com/gobuffalo/flect v0.2.0 // indirect github.com/gobwas/glob v0.2.3 github.com/gofrs/flock v0.8.1 github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.5.0 // indirect + github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.3 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect @@ -138,18 +133,18 @@ require ( github.com/google/go-github/v32 v32.1.0 // indirect github.com/google/go-github/v35 v35.3.0 // indirect github.com/google/go-querystring v1.0.0 // indirect - github.com/google/gofuzz v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/rpmpack v0.0.0-20210410105602-e20c988a6f5a // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.2.0 + github.com/google/uuid v1.3.0 github.com/google/wire v0.5.0 // indirect - github.com/googleapis/gax-go/v2 v2.0.5 // indirect - github.com/googleapis/gnostic v0.4.1 // indirect - github.com/gophercloud/gophercloud v0.11.1-0.20200518183226-7aec46f32c19 // indirect + github.com/googleapis/gax-go/v2 v2.1.0 // indirect + github.com/googleapis/gnostic v0.5.4 // indirect + github.com/gophercloud/gophercloud v0.18.0 // indirect github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 // indirect github.com/goreleaser/chglog v0.1.2 // indirect github.com/goreleaser/fileglob v1.2.0 // indirect - github.com/goreleaser/goreleaser v0.177.0 + github.com/goreleaser/goreleaser v0.182.1 github.com/goreleaser/nfpm/v2 v2.6.0 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/gostaticanalysis/analysisutil v0.4.1 // indirect @@ -164,13 +159,13 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.6.8 // indirect - github.com/hashicorp/go-rootcerts v1.0.1 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/go-version v1.3.0 github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/vault/api v1.0.4 // indirect - github.com/hashicorp/vault/sdk v0.1.13 // indirect + github.com/hashicorp/vault/api v1.1.0 // indirect + github.com/hashicorp/vault/sdk v0.1.14-0.20200519221838-e0cfd64bc267 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect @@ -182,11 +177,9 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect github.com/json-iterator/go v1.1.11 // indirect - github.com/jstemmer/go-junit-report v0.9.1 // indirect github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d // indirect github.com/justinbarrick/go-k8s-portforward v1.0.4-0.20200904152830-b575325c1855 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 - github.com/kevinburke/go-bindata v3.22.0+incompatible github.com/kevinburke/rest v0.0.0-20210106114233-22cd0577e450 // indirect github.com/kevinburke/ssh_config v1.1.0 // indirect github.com/kisielk/errcheck v1.6.0 // indirect @@ -239,7 +232,7 @@ require ( github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d // indirect github.com/pierrec/lz4 v2.0.5+incompatible // indirect github.com/pkg/errors v0.9.1 - github.com/pkg/sftp v1.10.1 // indirect + github.com/pkg/sftp v1.13.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v0.0.0-20210510181950-ab96adb96fea // indirect github.com/prometheus/client_golang v1.10.0 // indirect @@ -271,16 +264,16 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 // indirect - github.com/spotinst/spotinst-sdk-go v1.58.0 // indirect + github.com/spotinst/spotinst-sdk-go v1.85.0 // indirect github.com/ssgreg/nlreturn/v2 v2.1.0 // indirect github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.7.0 github.com/subosito/gotenv v1.2.0 // indirect github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b // indirect github.com/tetafro/godot v1.4.8 // indirect - github.com/tidwall/gjson v1.8.1 - github.com/tidwall/match v1.0.3 // indirect - github.com/tidwall/pretty v1.1.0 // indirect + github.com/tidwall/gjson v1.11.0 + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/sjson v1.1.7 github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 // indirect github.com/tj/assert v0.0.3 @@ -303,8 +296,7 @@ require ( github.com/xanzy/ssh-agent v0.3.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56 // indirect - github.com/xgfone/netaddr v0.5.1 + github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect github.com/yeya24/promlinter v0.1.0 // indirect @@ -312,32 +304,31 @@ require ( go.hein.dev/go-version v0.1.0 // indirect go.opencensus.io v0.23.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - go.uber.org/atomic v1.7.0 // indirect + go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.7.0 // indirect - go.uber.org/zap v1.17.0 // indirect - gocloud.dev v0.23.0 // indirect - golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect - golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.4.2 // indirect - golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect - golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 // indirect + go.uber.org/zap v1.19.0 // indirect + gocloud.dev v0.24.0 // indirect + golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect + golang.org/x/mod v0.5.0 // indirect + golang.org/x/net v0.0.0-20210825183410-e898025ed96a // indirect + golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e // indirect golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect - golang.org/x/text v0.3.6 // indirect - golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect golang.org/x/tools v0.1.5 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - google.golang.org/api v0.46.0 // indirect + google.golang.org/api v0.56.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect - google.golang.org/grpc v1.38.0 // indirect - google.golang.org/protobuf v1.26.0 // indirect + google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2 // indirect + google.golang.org/grpc v1.40.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect gopkg.in/gcfg.v1 v1.2.3 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.62.0 // indirect - gopkg.in/square/go-jose.v2 v2.3.1 // indirect + gopkg.in/square/go-jose.v2 v2.5.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 @@ -352,20 +343,19 @@ require ( k8s.io/code-generator v0.21.2 k8s.io/component-base v0.21.2 // indirect k8s.io/csi-translation-lib v0.21.2 // indirect - k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 // indirect + k8s.io/gengo v0.0.0-20210203185629-de9496dff47b // indirect k8s.io/klog/v2 v2.8.0 // indirect - k8s.io/kops v1.19.0 + k8s.io/kops v1.21.2 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect k8s.io/kubelet v0.21.2 k8s.io/legacy-cloud-providers v0.21.2 k8s.io/sample-controller v0.16.8 // indirect - k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect + k8s.io/utils v0.0.0-20210305010621-2afb4311ab10 // indirect mvdan.cc/gofumpt v0.1.1 // indirect mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 // indirect sigs.k8s.io/aws-iam-authenticator v0.5.2 - sigs.k8s.io/controller-tools v0.2.8 // indirect sigs.k8s.io/kustomize/api v0.8.8 // indirect sigs.k8s.io/kustomize/kyaml v0.10.17 // indirect sigs.k8s.io/mdtoc v1.0.1 @@ -373,17 +363,39 @@ require ( sigs.k8s.io/yaml v1.2.0 ) +require github.com/xgfone/netaddr v0.5.1 + require ( + cloud.google.com/go/kms v0.1.0 // indirect + github.com/DisgoOrg/disgohook v1.4.3 // indirect + github.com/DisgoOrg/log v1.1.0 // indirect + github.com/DisgoOrg/restclient v1.2.7 // indirect + github.com/atc0005/go-teams-notify/v2 v2.6.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.9.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.5.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.7.0 // indirect + github.com/aws/smithy-go v1.8.0 // indirect github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect + github.com/cespare/xxhash v1.1.0 // indirect github.com/cncf/udpa/go v0.0.0-20210322005330-6414d713912e // indirect + github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect - github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d // indirect + github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0 // indirect github.com/envoyproxy/protoc-gen-validate v0.6.1 // indirect github.com/fullstorydev/grpcurl v1.8.1 // indirect + github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect + github.com/golang-jwt/jwt/v4 v4.0.0 // indirect github.com/jhump/protoreflect v1.8.2 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/slack-go/slack v0.9.4 // indirect - github.com/vartanbeno/go-reddit/v2 v2.0.1 // indirect + github.com/technoweenie/multipartstreamer v1.0.1 // indirect + github.com/vartanbeno/go-reddit/v2 v2.0.0 // indirect go.etcd.io/etcd/api/v3 v3.5.0 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.0 // indirect go.etcd.io/etcd/client/v2 v2.305.0 // indirect @@ -394,11 +406,13 @@ require ( go.etcd.io/etcd/server/v3 v3.5.0-alpha.0 // indirect go.etcd.io/etcd/tests/v3 v3.5.0-alpha.0 // indirect go.etcd.io/etcd/v3 v3.5.0-alpha.0 // indirect + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect + gopkg.in/mail.v2 v2.3.1 // indirect ) replace ( // TODO: once aws-sdk-go is updated with ipv6 code remove the below line - github.com/aws/aws-sdk-go => github.com/weaveworks/aws-sdk-go v0.0.0-20211026093156-d6e6822f58db + github.com/aws/aws-sdk-go => github.com/weaveworks/aws-sdk-go v0.0.0-20211108161704-7850f7f8da38 // Used to pin the k8s library versions regardless of what other dependencies enforce k8s.io/api => k8s.io/api v0.21.2 k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.21.2 diff --git a/go.sum b/go.sum index 33fdfd78d0..21094705e6 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,6 @@ 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a h1:wFEQiK85fRsEVF0CRrPAos5LoAryUsIX1kPW/WrIqFw= 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= @@ -28,8 +29,19 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW 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 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= +cloud.google.com/go v0.89.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.92.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.0 h1:QDB2MZHqjTt0hGKnoEWyG/iWykue/lvkLdogLgrg10U= +cloud.google.com/go v0.94.0/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= 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= @@ -40,12 +52,16 @@ cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.5.0/go.mod h1:c4nNYR1qdq7eaZ+jSc5fonrQN2k3M7sWATcYTiakjEo= +cloud.google.com/go/kms v0.1.0 h1:VXAb5OzejDcyhFzIDeZ5n5AUdlsFnCyexuascIwWMj0= +cloud.google.com/go/kms v0.1.0/go.mod h1:8Qp8PCAypHg4FdmlyW1QRAv09BGQ9Uzh7JnmIZxPk+c= +cloud.google.com/go/monitoring v0.1.0/go.mod h1:Hpm3XfzJv+UTiXzCG5Ffp0wijzHTC7Cv4eR7o3x/fEE= 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.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/pubsub v1.10.3/go.mod h1:FUcc28GpGxxACoklPsE1sCtbkY4Ix+ro7yvw+h82Jn4= +cloud.google.com/go/pubsub v1.16.0/go.mod h1:6A8EfoWZ/lUvCWStKGwAWauJZSiuV0Mkmu6WilK/TxQ= +cloud.google.com/go/secretmanager v0.1.0/go.mod h1:3nGKHvnzDUVit7U0S9KAKJ4aOsO1xtwRG+7ey5LK1bM= cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/spanner v1.17.0/go.mod h1:+17t2ixFwRG4lWRwE+5kipDR9Ef07Jkmc8z0IbMDKUs= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= @@ -53,8 +69,9 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo 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.15.0 h1:Ljj+ZXVEhCr/1+4ZhvtteN1ND7UUsNTlduGclLh8GO0= -cloud.google.com/go/storage v1.15.0/go.mod h1:mjjQMoxxyGH7Jr8K5qrx6N2O0AHsczI61sMNn03GIZI= +cloud.google.com/go/storage v1.16.1 h1:sMEIc4wxvoY3NXG7Rn9iP7jb/2buJgWR1vNXCR/UPfs= +cloud.google.com/go/storage v1.16.1/go.mod h1:LaNorbty3ehnU3rEjXSNV/NRgQA0O8Y+uh6bPe5UOk4= +cloud.google.com/go/trace v0.1.0/go.mod h1:wxEwsoeRVPbeSkt7ZC9nWCgmoKQRAoySN7XHW2AmI7g= code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE= code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= code.gitea.io/sdk/gitea v0.15.0 h1:tsNhxDM/2N1Ohv1Xq5UWrht/esg0WmtRj4wsHVHriTg= @@ -65,6 +82,7 @@ contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrL contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/exporter/stackdriver v0.13.8/go.mod h1:huNtlWx75MwO7qMs0KrMxPZXzNNWebav1Sq/pm02JdQ= contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= @@ -75,24 +93,30 @@ github.com/Antonboom/errname v0.1.3 h1:qKV8gSzPzBqrG/q0dgraZXJCymWt6KuD9+Y7K7xtz github.com/Antonboom/errname v0.1.3/go.mod h1:jRXo3m0E0EuCnK3wbsSVH3X55Z4iTDLl6ZfCxwFj4TM= github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= github.com/Azure/azure-amqp-common-go/v3 v3.1.0/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0= +github.com/Azure/azure-amqp-common-go/v3 v3.1.1/go.mod h1:YsDaPfaO9Ub2XeSKdIy2DfwuiQlHQCauHJwSqtrkECI= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v46.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v54.0.0+incompatible h1:Bq3L9LF0DHCexlT0fccwxgrOMfjHx8LGz+d+L7gGQv4= -github.com/Azure/azure-sdk-for-go v54.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v53.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v57.0.0+incompatible h1:isVki3PbIFrwKvKdVP1byxo73/pt+Nn174YxW1k4PNw= +github.com/Azure/azure-sdk-for-go v57.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= -github.com/Azure/azure-service-bus-go v0.10.11/go.mod h1:AWw9eTTWZVZyvgpPahD1ybz3a8/vT3GsJDS8KYex55U= +github.com/Azure/azure-service-bus-go v0.10.16/go.mod h1:MlkLwGGf1ewcx5jZadn0gUEty+tTg0RaElr6bPf+QhI= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= -github.com/Azure/azure-storage-blob-go v0.13.0 h1:lgWHvFh+UYBNVQLFHXkvul2f6yOPA9PIH82RTG2cSwc= github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nUdBD+e64lEuc4sVnuOfNs= +github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs= -github.com/Azure/go-amqp v0.13.4/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI= -github.com/Azure/go-amqp v0.13.7/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI= +github.com/Azure/go-amqp v0.13.11/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= +github.com/Azure/go-amqp v0.13.12/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -100,22 +124,29 @@ github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+B github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest v0.11.3/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.4/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.6/go.mod h1:V6p3pKZx1KKkJubbxnDWrzNhEIfOy/pTGasLqzHIPHs= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.20 h1:s8H1PbCZSqg/DH7JMlOz6YMig6htWLNPsjDdlLqCx3M= +github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= +github.com/Azure/go-autorest/autorest/adal v0.9.4/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= -github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.7 h1:8DQB8yl7aLQuP+nuR5e2RO6454OvFlSTXXaNHshc16s= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.15 h1:X+p2GF0GWyOiSmqohIaEeuNFNDY4I4EOlVuUQvFdWMk= +github.com/Azure/go-autorest/autorest/adal v0.9.15/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= github.com/Azure/go-autorest/autorest/azure/auth v0.5.7/go.mod h1:AkzUsqkrdmNhfP2i54HqINVQopw0CLDnvHpJ88Zz1eI= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.8 h1:TzPg6B6fTZ0G1zBf3T54aI7p3cAT6u//TOXGPmFMOXg= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.3 h1:DOhB+nXkF7LN0JfBGB5YtCF6QLK8mLe4psaHF7ZQEKM= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.3/go.mod h1:yAQ2b6eP/CmLPnmLvxtT1ALIY3OR1oFcCqVBi8vHiTc= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= @@ -130,6 +161,7 @@ github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocm github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.3.0/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= @@ -143,22 +175,31 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DisgoOrg/disgohook v1.4.3 h1:JtZiV0jAku9NZRYD6wVH7tWY1617rh4tRqn4ihTUJRc= +github.com/DisgoOrg/disgohook v1.4.3/go.mod h1:aHNyBHq1pBbdWrkCq3ZCSBeavUoGWZAAT4+609EcrvU= +github.com/DisgoOrg/log v1.1.0 h1:a6hLfVSDuTFJc5AKQ8FDYQ5TASnwk3tciUyXThm1CR4= +github.com/DisgoOrg/log v1.1.0/go.mod h1:Qihgz6fax3JCfuO7vxVavL0LyHS0sUdQ9OmykQ2fiQs= +github.com/DisgoOrg/restclient v1.2.7 h1:A8ltFP+8O2q9ZTk/vRmlQRvH2cbcnaacUV2uXWFcONQ= +github.com/DisgoOrg/restclient v1.2.7/go.mod h1:2pc/htya/5kjxvWNYya98sb8B4mexobxmWvhTiWPt94= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.22.0/go.mod h1:mAm5O/zik2RFmcpigNjg6nMotDL8ZXJaxKzgGVcSMFA= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.24.0/go.mod h1:3tx938GhY4FC+E1KT/jNjDw7Z5qxAEtIiERJ2sXjnII= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317 h1:JhyuWIqYrstW7KHMjk/fTqU0xtMpBOHuiTA2FVc7L4E= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/MakeNowJust/heredoc/v2 v2.0.1 h1:rlCHh70XXXv7toz95ajQWOWQnN4WNLt0TdpZYIR/J6A= +github.com/MakeNowJust/heredoc/v2 v2.0.1/go.mod h1:6/2Abh5s+hc3g9nbWLe9ObDIOhaRrqsyY9MWy+4JdRM= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= 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 v1.3.1/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -167,17 +208,23 @@ github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0 github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.17.1+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI= +github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/MichaelTJones/walk v0.0.0-20161122175330-4748e29d5718/go.mod h1:VVwKsx9Dc8rNG55BWqogoJzGubjKnRoXdUvpGbWqeCc= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990/go.mod h1:ay/0dTb7NsG8QMDfsRfLHgZo/6xAJShLe1+ePPflihk= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= @@ -194,9 +241,11 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/Venafi/vcert/v4 v4.13.1/go.mod h1:Z3sJFoAurFNXPpoSUSHq46aIeHLiGQEMDhprfxlpofQ= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= @@ -214,7 +263,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/aliyun/alibaba-cloud-sdk-go v1.61.264/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= +github.com/aliyun/alibaba-cloud-sdk-go v1.61.1059/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= @@ -234,37 +283,60 @@ github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= +github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/ashanbrown/forbidigo v1.2.0 h1:RMlEFupPCxQ1IogYOQUnIQwGEUGK8g5vAPMRyJoSxbc= github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde h1:YOsoVXsZQPA9aOTy1g0lAJv5VzZUvwQuZqug8XPeqfM= github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= +github.com/atc0005/go-teams-notify/v2 v2.6.0 h1:YegKDWbjlatR0fP2yHsQYXzTcUGNJXhm1/OiCgbyysc= +github.com/atc0005/go-teams-notify/v2 v2.6.0/go.mod h1:xo6GejLDHn3tWBA181F8LrllIL0xC1uRsRxq7YNXaaY= github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= -github.com/aws/amazon-ec2-instance-selector/v2 v2.0.1/go.mod h1:juzWzDAyOHbufrohZ77l2VW+CEgtXIm2SzrTVMmfJy8= +github.com/aws/amazon-ec2-instance-selector/v2 v2.0.2/go.mod h1:qot+32DWumAuTogNcselkYbAXK4UUbQz3OhM97PIff8= github.com/aws/amazon-ec2-instance-selector/v2 v2.0.3-0.20210303155736-3e43512d88f8 h1:qR505xKnVxbA/jNh61AoQRnbWlL0b5a58ZgU79AX+VM= github.com/aws/amazon-ec2-instance-selector/v2 v2.0.3-0.20210303155736-3e43512d88f8/go.mod h1:L7sFBlPt6UhH1KrAwvPinQzyVddTu4CGNd19gp6k1xg= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.9.0 h1:+S+dSqQCN3MSU5vJRu1HqHrq00cJn6heIMU7X9hcsoo= +github.com/aws/aws-sdk-go-v2 v1.9.0/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.7.0 h1:J2cZ7qe+3IpqBEXnHUrFrOjoB9BlsXg7j53vxcl5IVg= +github.com/aws/aws-sdk-go-v2/config v1.7.0/go.mod h1:w9+nMZ7soXCe5nT46Ri354SNhXDQ6v+V5wqDjnZE+GY= +github.com/aws/aws-sdk-go-v2/credentials v1.4.0 h1:kmvesfjY861FzlCU9mvAfe01D9aeXcG2ZuC+k9F2YLM= +github.com/aws/aws-sdk-go-v2/credentials v1.4.0/go.mod h1:dgGR+Qq7Wjcd4AOAW5Rf5Tnv3+x7ed6kETXyS9WCuAY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0 h1:OxTAgH8Y4BXHD6PGCJ8DHx2kaZPCQfSTqmDsdRZFezE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0/go.mod h1:CpNzHK9VEFUCknu50kkB8z58AH2B5DvPP7ea1LHve/Y= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2 h1:d95cddM3yTm4qffj3P6EnP+TzX1SSkWaQypXSgT/hpA= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2/go.mod h1:BQV0agm+JEhqR+2RT5e1XTFIDcAAV0eW6z2trp+iduw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0 h1:VNJ5NLBteVXEwE2F1zEXVmyIH58mZ6kIQGJoC7C+vkg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0/go.mod h1:R1KK+vY8AfalhG1AOu5e35pOD2SdoPKQCFLTvnxiohk= +github.com/aws/aws-sdk-go-v2/service/kms v1.5.0 h1:10e9mzaaYIIePEuxUzW5YJ8LKHNG/NX63evcvS3ux9U= +github.com/aws/aws-sdk-go-v2/service/kms v1.5.0/go.mod h1:w7JuP9Oq1IKMFQPkNe3V6s9rOssXzOVEMNEqK1L1bao= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.6.0/go.mod h1:B+7C5UKdVq1ylkI/A6O8wcurFtaux0R1njePNPtKwoA= +github.com/aws/aws-sdk-go-v2/service/ssm v1.10.0/go.mod h1:4dXS5YNqI3SNbetQ7X7vfsMlX6ZnboJA2dulBwJx7+g= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.0 h1:sHXMIKYS6YiLPzmKSvDpPmOpJDHxmAUgbiF49YNVztg= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.0/go.mod h1:+1fpWnL96DL23aXPpMGbsmKe8jLTEfbjuQoA4WS1VaA= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.0 h1:1at4e5P+lvHNl2nUktdM2/v+rpICg/QSEr9TO/uW9vU= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.0/go.mod h1:0qcSMCyASQPN2sk/1KQLQ2Fh6yq8wm0HSDAimPhzCoM= +github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/awslabs/goformation/v4 v4.15.5 h1:q3lm7oj4yqqJ76ZcaFThUACT3MQLD6yBcJRKuZ6g87w= github.com/awslabs/goformation/v4 v4.15.5/go.mod h1:wB5lKZf1J0MYH1Lt4B9w3opqz0uIjP7MMCAcib3QkwA= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= -github.com/bazelbuild/bazel-gazelle v0.19.1 h1:TSCGVqpHStCj1MTszuDfZt6Z2Ca8ekq2oWiqcHKVEAE= -github.com/bazelbuild/bazel-gazelle v0.19.1/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A= -github.com/bazelbuild/buildtools v0.0.0-20190731111112-f720930ceb60/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= -github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 h1:3B/ZE1a6eEJ/4Jf/M6RM2KBouN8yKCUcMmXzSyWqa3g= -github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= -github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab h1:wzbawlkLtl2ze9w/312NHZ84c7kpUCtlkD8HgFY27sw= -github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benjamintf1/unmarshalledmatchers v0.0.0-20190408201839-bb1c1f34eaea h1:NhnqtoeNnEBu36bfeP2CZq/d5bJxzJBtChscvM7v5Cg= github.com/benjamintf1/unmarshalledmatchers v0.0.0-20190408201839-bb1c1f34eaea/go.mod h1:jfBxQAPihPj5l6sipcapjHruLizHrt3RKuppDE97K+g= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -272,6 +344,7 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= @@ -284,9 +357,14 @@ 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/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM= github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= github.com/caarlos0/ctrlc v1.0.0 h1:2DtF8GSIcajgffDFJzyG15vO+1PuBWOMUdFut7NnXhw= @@ -319,7 +397,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/chai2010/gettext-go v0.0.0-20170215093142-bf70f2a70fb1/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/charithe/durationcheck v0.0.8 h1:cnZrThioNW9gSV5JsRIXmkyHUbcDH7Y9hkzFDVc9/j0= github.com/charithe/durationcheck v0.0.8/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af h1:spmv8nSH9h5oCQf40jt/ufBCt9j0/58u4G+rkeMqXGI= @@ -333,12 +410,14 @@ github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmE github.com/cilium/ebpf v0.0.0-20200507155900-a9f01edf17e3/go.mod h1:XT+cAw5wfvsodedcijoh1l9cf7v1x9FlFB/3VmF/O8s= github.com/cilium/ebpf v0.0.0-20200601085316-9f1617e5c574/go.mod h1:XT+cAw5wfvsodedcijoh1l9cf7v1x9FlFB/3VmF/O8s= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/backoff v0.0.0-20161212185259-647f3cdfc87a/go.mod h1:rzgs2ZOiguV6/NpiDgADjRLPNyZlApIWxKpkT+X8SdY= github.com/cloudflare/cfssl v1.6.1 h1:aIOUjpeuDJOpWjVJFP2ByplF53OgqG8I1S40Ggdlk3g= github.com/cloudflare/cfssl v1.6.1/go.mod h1:ENhCj4Z17+bY2XikpxVmTHDg/C2IsG2Q0ZBeXpAqhCk= +github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlKDg4bd8LWlu7oKeZvM= github.com/cloudflare/redoctober v0.0.0-20201013214028-99c99a8e7544/go.mod h1:6Se34jNoqrd8bTxrmJB2Bg2aoZ2CdSXonils9NsiNgo= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -346,6 +425,8 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210322005330-6414d713912e h1:xjKi0OrdbKVCLWRoF2SGNnv9todhp+zQlvRHhsb14R4= github.com/cncf/udpa/go v0.0.0-20210322005330-6414d713912e/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed h1:OZmjad4L3H8ncOIR8rnb5MREYqG8ixi5+WbeUsquF0c= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= @@ -356,12 +437,17 @@ github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u9 github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/container-storage-interface/spec v1.3.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= @@ -373,7 +459,6 @@ github.com/coredns/corefile-migration v1.0.10/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2h github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -385,11 +470,11 @@ github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a h1:W8b4lQ4tFF21a github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.1/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpu/goacmedns v0.0.3/go.mod h1:4MipLkI+qScwqtVxcNO6okBhbgRrr7/tKXUSgSL0teQ= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -410,11 +495,14 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As= github.com/denis-tingajkin/go-header v0.4.2 h1:jEeSF4sdv8/3cT/WY8AgDHUoItNSoEZ7qg9dX7pc218= github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= +github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20191128015008-acd8035bbb1d h1:Rw/qE0ALLN27jXBKR9xTR+RFAA9s1yIZCKhfT1GgCGA= -github.com/denverdino/aliyungo v0.0.0-20191128015008-acd8035bbb1d/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/denverdino/aliyungo v0.0.0-20210425065611-55bee4942cba h1:3g+YC/AyMKyPBDTKKMxTHekNFhBZPSxa/ckOPjOJPuU= +github.com/denverdino/aliyungo v0.0.0-20210425065611-55bee4942cba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dghubble/go-twitter v0.0.0-20210609183100-2fdbf421508e h1:o0sI/cfhAXdtAbiIVeTd4hmwtwgs4cQFwRBhmbx8AKY= github.com/dghubble/go-twitter v0.0.0-20210609183100-2fdbf421508e/go.mod h1:xfg4uS5LEzOj8PgZV7SQYRHbG7jPUnelEiaAVJxmhJE= @@ -422,23 +510,31 @@ github.com/dghubble/oauth1 v0.7.0 h1:AlpZdbRiJM4XGHIlQ8BuJ/wlpGwFEJNnB4Mc+78tA/w github.com/dghubble/oauth1 v0.7.0/go.mod h1:8pFdfPkv/jr8mkChVbNVuJ0suiHe278BtWI4Tk1ujxk= github.com/dghubble/sling v1.3.0 h1:pZHjCJq4zJvc6qVQ5wN1jo5oNZlNE0+8T/h0XeXBUKU= github.com/dghubble/sling v1.3.0/go.mod h1:XXShWaBWKzNLhu2OxikSNFrlsvowtz4kyRuXUG7oQKY= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.54.0/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU= +github.com/digitalocean/godo v1.44.0/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU= +github.com/digitalocean/godo v1.60.0/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= 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/dlespiau/kube-test-harness v0.0.0-20200915102055-a03579200ae8 h1:pxDCsB4pEs/4FG8pEnNHG7rzr8RvDEdLyDGL653gnB0= github.com/dlespiau/kube-test-harness v0.0.0-20200915102055-a03579200ae8/go.mod h1:DPS/2w0SxCgLfTwNw+/806eccMQ1WjgHb1B70w75wSk= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20200309214505-aa6a9891b09c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20170912183627-bc6354cbbc29/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -462,8 +558,9 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d h1:QyzYnTnPE15SQyUeqU6qLbWxMkwyAyu+vGksa0b7j00= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0 h1:dulLQAYQFYtG5MTplgNGHWuV2D+OBD+Z8lmDBmbLg+s= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -506,9 +603,9 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fullsailor/pkcs7 v0.0.0-20180422025557-ae226422660e/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= github.com/fullstorydev/grpcurl v1.8.0/go.mod h1:Mn2jWbdMrQGJQ8UD62uNyMumT2acsZUCkZIqFxsQf1o= github.com/fullstorydev/grpcurl v1.8.1 h1:Pp648wlTTg3OKySeqxM5pzh8XF6vLqrm8wRq66+5Xo0= @@ -516,6 +613,7 @@ github.com/fullstorydev/grpcurl v1.8.1/go.mod h1:3BWhvHZwNO7iLXaQlojdg5NA6SxUDeP github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc= github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -530,9 +628,8 @@ github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= +github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= -github.com/go-bindata/go-bindata v3.1.2+incompatible h1:5vjJMVhowQdPzjE1LdxyFF7YFTXg5IgGVW4gBr5IbvE= -github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= github.com/go-critic/go-critic v0.5.6 h1:siUR1+322iVikWXoV75I1YRfNaC/yaLzhdF9Zwd8Tus= github.com/go-critic/go-critic v0.5.6/go.mod h1:cVjj0DfqewQVIlIAGexPCaGaZDAqGE29PYDDADIVNEo= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= @@ -551,12 +648,13 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 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-ini/ini v1.9.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-ini/ini v1.51.0 h1:VPJKXGzbKlyExUE8f41aV57yxkYx5R49yR6n7flp0M0= -github.com/go-ini/ini v1.51.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.62.0 h1:7VJT/ZXjzqSrvtraFp4ONq80hTcRQth1c9ZnQ3uNQvU= +github.com/go-ini/ini v1.62.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -566,6 +664,8 @@ github.com/go-logr/logr v0.2.1-0.20200730175230-ee2de8da5be6/go.mod h1:z6/tIYblk github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -630,7 +730,10 @@ github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU= +github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -654,17 +757,24 @@ github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYw github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= +github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= 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/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg= github.com/gofrs/flock v0.7.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -677,6 +787,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= 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= @@ -695,8 +807,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -777,21 +890,23 @@ github.com/google/go-licenses v0.0.0-20210329231322-ce1d9163b77d/go.mod h1:+TYOm github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= -github.com/google/go-replayers/grpcreplay v1.0.0 h1:B5kVOzJ1hBgnevTgIWhSTatQ3608yu/2NnU0Ta1d0kY= -github.com/google/go-replayers/grpcreplay v1.0.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE= +github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= -github.com/google/go-replayers/httpreplay v0.1.2 h1:HCfx+dQzwN9XbGTHF8qJ+67WN8glL9FTWV5rraCJ/jU= -github.com/google/go-replayers/httpreplay v0.1.2/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/go-replayers/httpreplay v1.0.0 h1:8SmT8fUYM4nueF+UnXIX8LJxNTb1vpPuknXz+yTWzL4= +github.com/google/go-replayers/httpreplay v1.0.0/go.mod h1:LJhKoTwS5Wy5Ld/peq8dFFG5OfJyHEz7ft+DsTUv25M= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/licenseclassifier v0.0.0-20210325184830-bb04aff29e72/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -805,6 +920,11 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe 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-20210506205249-923b5ab0fc1a/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-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= github.com/google/rpmpack v0.0.0-20210410105602-e20c988a6f5a h1:XC048Fc/OB2rUl/BxruopEl2u/EP6cJNFveVxI1cvdk= @@ -819,24 +939,28 @@ github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4Mgqvf github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8= github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0 h1:6DWmvNpomjL1+3liNSZbVns3zsYzzCjm6pRBO1tLeso= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.4 h1:ynbQIWjLw7iv6HAFdixb30U7Uvcmx+f4KlLJpmhkTK0= +github.com/googleapis/gnostic v0.5.4/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.6.1-0.20191122030953-d8ac278c1c9d/go.mod h1:ozGNgr9KYOVATV5jsgHl/ceCDXGuguqOZAzoQ/2vcNM= -github.com/gophercloud/gophercloud v0.11.1-0.20200518183226-7aec46f32c19 h1:Amaxs7PsvtzbahUHadno+OZI0IrMqwbPhoGUVLdM1NA= -github.com/gophercloud/gophercloud v0.11.1-0.20200518183226-7aec46f32c19/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= +github.com/gophercloud/gophercloud v0.15.1-0.20210105012856-e34a44dc6580/go.mod h1:VX0Ibx85B60B5XOrZr6kaNwrmPUzcmMpwxvQ1WQIIWM= +github.com/gophercloud/gophercloud v0.18.0 h1:V6hcuMPmjXg+js9flU8T3RIHDCjV7F5CG5GD0MRhP/w= +github.com/gophercloud/gophercloud v0.18.0/go.mod h1:wRtmUelyIIv3CSSDI47aUwbs075O6i+LY+pXsKCBsb4= github.com/gophercloud/utils v0.0.0-20200423144003-7c72efc7435d/go.mod h1:ehWUbLQJPqS0Ep+CxeD559hsm9pthPXadJNKwZkp43w= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -848,15 +972,17 @@ github.com/goreleaser/chglog v0.1.2/go.mod h1:tTZsFuSZK4epDXfjMkxzcGbrIOXprf0JFp github.com/goreleaser/fileglob v1.2.0 h1:OErqbdzeg/eibfDGPHDQDN8jL5u1jNyxA5IQzNPLLoU= github.com/goreleaser/fileglob v1.2.0/go.mod h1:rFyb2pXaK3YdnYnSjn6lifw0h2Q6s8OfOsx6I6bXkKE= github.com/goreleaser/goreleaser v0.134.0/go.mod h1:ZT6Y2rSYa6NxQzIsdfWWNWAlYGXGbreo66NmE+3X3WQ= -github.com/goreleaser/goreleaser v0.177.0 h1:pPjL2NGfrLY5mqEK+3Nk6IgZtPyU9zB9mFxKeF3MU8w= -github.com/goreleaser/goreleaser v0.177.0/go.mod h1:9RAcbZOoMQIfDgvTORBho/LBN4aRU4NGaZBLTaoIcbs= +github.com/goreleaser/goreleaser v0.182.1 h1:cKRlHfbMxejiyMCNACsl82slFXEW+k9RggADv6/Akqg= +github.com/goreleaser/goreleaser v0.182.1/go.mod h1:DDAKfIsyz8N8HTGYxGT9OvLW2XMLaS5Gr8/O3fSasKw= github.com/goreleaser/nfpm v1.2.1 h1:AEnu9XVmupRDTR930Z2rAs31Mj6sLIPxFcR9ESYvgDA= github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= github.com/goreleaser/nfpm/v2 v2.6.0 h1:bwDU9o4/CVTSpqASJA7+r+rkqpTGamQKYHMRH3wDlRE= github.com/goreleaser/nfpm/v2 v2.6.0/go.mod h1:qaMnjBaZz/2vInOIWx0IbuKuaZpaVB6O8oLG0u4qH1Y= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -876,6 +1002,7 @@ github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 h github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= 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= @@ -898,6 +1025,7 @@ github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBt github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -906,28 +1034,36 @@ github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVo github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v0.0.0-20180717150148-3d5d8f294aa0/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.6.8 h1:92lWxgpa+fF3FozM4B3UZtHZMJX8T5XT+TFdCxsPyWs= github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.1 h1:DMo4fmknnz0E0evoNYnV48RjWndOsmd6OW+09R3cEP8= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -943,23 +1079,27 @@ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= 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.3.0/go.mod h1:d+FwDBbOLvpAM3Z6J7gPj/VoAGkNe/gm352ZhjJ/Zv8= +github.com/hashicorp/hcl/v2 v2.10.0/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/vault/api v1.0.4 h1:j08Or/wryXT4AcHj1oCbMd7IijXcKzYUGw59LGu9onU= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= -github.com/hashicorp/vault/sdk v0.1.13 h1:mOEPeOhT7jl0J4AMl1E705+BcmeRs1VmKNb9F0sMLy8= +github.com/hashicorp/vault/api v1.1.0 h1:QcxC7FuqEl0sZaIjcXB/kNEeBa0DH5z57qbWBvZwLC4= +github.com/hashicorp/vault/api v1.1.0/go.mod h1:R3Umvhlxi2TN7Ex2hzOowyeNb+SfbVWI973N+ctaFMk= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/vault/sdk v0.1.14-0.20200519221838-e0cfd64bc267 h1:e1ok06zGrWJW91rzRroyl5nRNqraaBe4d5hiKcVZuHM= +github.com/hashicorp/vault/sdk v0.1.14-0.20200519221838-e0cfd64bc267/go.mod h1:WX57W2PwkrOPQ6rVQk+dy5/htHIaB4aBM70EwKThu10= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= +github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= @@ -989,6 +1129,7 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jetstack/cert-manager v1.3.1/go.mod h1:Hfe4GE3QuRzbrsuReQD5R3PXZqrdfJ2kZ42K67V/V0w= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= @@ -1000,6 +1141,7 @@ github.com/jingyugao/rowserrcheck v1.1.0/go.mod h1:TOQpc2SLx6huPfoFGK3UOnEG+u02D github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -1013,7 +1155,6 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jpillora/backoff v0.0.0-20170918002102-8eab2debe79d/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -1025,7 +1166,6 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -1042,8 +1182,6 @@ github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3t github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= 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/kevinburke/go-bindata v3.22.0+incompatible h1:/JmqEhIWQ7GRScV0WjX/0tqBrC5D21ALg0H0U/KZ/ts= -github.com/kevinburke/go-bindata v3.22.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= github.com/kevinburke/rest v0.0.0-20210106114233-22cd0577e450 h1:Lr2sEj5wWzk82b/L8LsLzsCxywQaOpcr0ti/qcfzCOk= github.com/kevinburke/rest v0.0.0-20210106114233-22cd0577e450/go.mod h1:pD+iEcdAGVXld5foVN4e24zb/6fnb60tgZPZ3P/3T/I= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= @@ -1062,7 +1200,7 @@ github.com/kisom/goutils v1.4.3/go.mod h1:Lp5qrquG7yhYnWzZCI/68Pa/GpFynw//od6EkG github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1101,6 +1239,8 @@ github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LE github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/ldez/gomoddirectives v0.2.2 h1:p9/sXuNFArS2RLc+UpYZSI4KQwGMEDWC/LbtF5OPFVg= github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.2.0 h1:693V8Bf1NdShJ8eu/s84QySA0J2VWBanVBa2WwXD/Wk= @@ -1112,7 +1252,6 @@ github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= @@ -1145,11 +1284,13 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1168,6 +1309,7 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -1177,6 +1319,7 @@ github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxm github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= @@ -1193,11 +1336,12 @@ github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfp github.com/mgechev/revive v1.1.0 h1:TvabpsolbtlzZTyJcgMRN38MHrgi8C0DhmGE5dhscGY= github.com/mgechev/revive v1.1.0/go.mod h1:PKqk4L74K6wVNwY2b6fr+9Qqr/3hIsHVfZCJdbvozrY= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mgutz/str v1.2.0/go.mod h1:w1v0ofgLaJdoD0HpQ3fycxKD1WtxpjSo151pK/31q6w= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= -github.com/miekg/coredns v0.0.0-20161111164017-20e25559d5ea/go.mod h1:ulj34RFTnjlzXt4MMq5AcKBIiXNiru0D2fe3enowwU4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= @@ -1221,9 +1365,11 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20180715050151-f15292f7a699/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -1252,6 +1398,7 @@ github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1: github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/munnerz/crd-schema-fuzz v1.0.0/go.mod h1:4z/rcm37JxUkSsExFcLL6ZIT1SgDRdLiu7qq1evdVS0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= @@ -1273,6 +1420,7 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/exhaustive v0.2.3 h1:+ANTMqRNrqwInnP9aszg/0jDo+zbXa4x66U19Bx/oTk= github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= @@ -1294,6 +1442,7 @@ github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FW github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1304,17 +1453,21 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= @@ -1322,15 +1475,20 @@ github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc90.0.20200616040943-82d2fa4eb069/go.mod h1:3Sm6Dt7OT8z88EbdQqqcRN2oCT54jbi72tT/HqgflT8= github.com/opencontainers/runc v1.0.0-rc91.0.20200707015106-819fcc687efb/go.mod h1:ZuXhqlr4EiRYgDrBDNfSbE4+n9JX4+V107NwAmF7sZA= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200520003142-237cc4f519e2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.5.1/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g= github.com/opencontainers/selinux v1.5.2/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= @@ -1349,29 +1507,34 @@ github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pavel-v-chernykh/keystore-go v2.1.0+incompatible/go.mod h1:xlUlxe/2ItGlQyMTstqeDv9r3U4obH7xYd26TbDQutY= +github.com/pavel-v-chernykh/keystore-go/v4 v4.1.0/go.mod h1:2ejgys4qY+iNVW1IittZhyRYA6MNv8TgM6VHqojbB9g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v0.0.0-20180724185102-c2dbbc24a979/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/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/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v0.0.0-20160930220758-4d0e916071f6/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= -github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.0 h1:Riw6pgOKK41foc1I1Uu03CjvbLZDXeGpInycM4shXoI= +github.com/pkg/sftp v1.13.0/go.mod h1:41g+FIPlQUTDCveupEmEA65IoiQFrtgCeDopC4ajGIM= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1379,6 +1542,7 @@ github.com/polyfloyd/go-errorlint v0.0.0-20210510181950-ab96adb96fea h1:Sk6Xawg5 github.com/polyfloyd/go-errorlint v0.0.0-20210510181950-ab96adb96fea/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -1388,8 +1552,10 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1397,6 +1563,7 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1406,6 +1573,7 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.24.0 h1:aIycr3wRFxPUq8XlLQlGQ9aNXV3dFi5y62pe/SB262k= github.com/prometheus/common v0.24.0/go.mod h1:H6QK/N6XVT42whUeIdI3dp36w49c+/iMDk7UAI2qm7Q= @@ -1416,6 +1584,7 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -1448,9 +1617,13 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= @@ -1489,6 +1662,7 @@ github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil/v3 v3.21.7/go.mod h1:RGl11Y7XMTQPmHh8F0ayC6haKNBgH4PXMJuTAcMOlz4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= @@ -1496,6 +1670,7 @@ github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= @@ -1507,8 +1682,9 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/slack-go/slack v0.9.4 h1:C+FC3zLxLxUTQjDy2RZeMHYon005zsCROiZNWVo+opQ= github.com/slack-go/slack v0.9.4/go.mod h1:wWL//kk0ho+FcQXcBTmEafUI5dz4qz5f4mMk8oIkioQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -1523,6 +1699,7 @@ github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4l github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ= github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -1537,6 +1714,7 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.0-20180820174524-ff0d02e85550/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= @@ -1551,6 +1729,7 @@ github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmq github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v0.0.0-20180821114517-d929dcbb1086/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1563,11 +1742,12 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spotinst/spotinst-sdk-go v1.58.0 h1:h7617CMlfHL3W+CMlhs883kVy3MPdGML/Z4+mW+ddgc= -github.com/spotinst/spotinst-sdk-go v1.58.0/go.mod h1:nWi2DyjUi1WUZclpsqZFXvImsU0T39ppqqHwC4/T5mw= +github.com/spotinst/spotinst-sdk-go v1.85.0 h1:tMXKhxfmU7BnqTnUpR2s/hEyTASfrxkgPb/3Tqn6tmM= +github.com/spotinst/spotinst-sdk-go v1.85.0/go.mod h1:RuKksd1/RyQogMCxKFI5B75NeFRcgl3W+26DVX6S4m0= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA= github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1588,20 +1768,25 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b h1:HxLVTlqcHhFAz3nWUcuvpH7WuOMv8LQoCWmruLfFH2U= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= +github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= github.com/tetafro/godot v1.4.8 h1:rhuUH+tBrx24yVAr6Ox3/UxcsiUPPJcGhinfLdbdew0= github.com/tetafro/godot v1.4.8/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= -github.com/tidwall/gjson v1.8.1 h1:8j5EE9Hrh3l9Od1OIEDAb7IpezNA20UdRngNAj5N0WU= -github.com/tidwall/gjson v1.8.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= -github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= +github.com/tidwall/gjson v1.11.0 h1:C16pk7tQNiH6VlCrtIXL1w8GaOsi1X3W8KDkE1BuYd4= +github.com/tidwall/gjson v1.11.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +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.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.1.7 h1:sgVPwu/yygHJ2m1pJDLgGM/h+1F5odx5Q9ljG3imRm8= github.com/tidwall/sjson v1.1.7/go.mod h1:w/yG+ezBeTdUxiKs5NcPicO9diP38nk96QBAbIIGeFs= github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 h1:ig99OeTyDwQWhPe2iw9lwfQVF1KB3Q4fpP3X7/2VBG8= @@ -1627,6 +1812,7 @@ github.com/tommy-muehle/go-mnd/v2 v2.4.0 h1:1t0f8Uiaq+fqKteUR4N9Umr6E99R+lDnLnq7 github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -1640,12 +1826,14 @@ github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iL github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/uudashr/gocognit v1.0.5 h1:rrSex7oHr3/pPLQ0xoWq108XMU8s678FJcQ+aSfOHa4= github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= @@ -1654,8 +1842,8 @@ github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vartanbeno/go-reddit/v2 v2.0.1 h1:P6ITpf5YHjdy7DHZIbUIDn/iNAoGcEoDQnMa+L4vutw= -github.com/vartanbeno/go-reddit/v2 v2.0.1/go.mod h1:758/S10hwZSLm43NPtwoNQdZFSg3sjB5745Mwjb0ANI= +github.com/vartanbeno/go-reddit/v2 v2.0.0 h1:fxYMqx5lhbmJ3yYRN1nnQC/gecRB3xpUS2BbG7GLpsk= +github.com/vartanbeno/go-reddit/v2 v2.0.0/go.mod h1:758/S10hwZSLm43NPtwoNQdZFSg3sjB5745Mwjb0ANI= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vektra/mockery v1.1.2 h1:uc0Yn67rJpjt8U/mAZimdCKn9AeA97BOkjpmtBSlfP4= github.com/vektra/mockery v1.1.2/go.mod h1:VcfZjKaFOPO+MpN4ZvwPjs4c48lkq1o3Ym8yHZJu0jU= @@ -1664,18 +1852,18 @@ github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYp github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200520041808-52d707b772fe/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= +github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/voxelbrain/goptions v0.0.0-20180630082107-58cddc247ea2 h1:txplJASvd6b/hrE0s/Ixfpp2cuwH9IO9oZBAN9iYa4A= github.com/voxelbrain/goptions v0.0.0-20180630082107-58cddc247ea2/go.mod h1:DGCIhurYgnLz8J9ga1fMV/fbLDyUvTyrWXVWUIyJon4= -github.com/weaveworks/aws-sdk-go v0.0.0-20211026093156-d6e6822f58db h1:K6lacvb3qzF/bHvx2RsPDw8cYA8VccOecn9e6xDEBY0= -github.com/weaveworks/aws-sdk-go v0.0.0-20211026093156-d6e6822f58db/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/weaveworks/goformation/v4 v4.10.2-0.20211012141859-cd360fb1f843 h1:9v19OzMM+kFcm0r2yZeoMMAvT71H/apnNWeoMKMxUz0= -github.com/weaveworks/goformation/v4 v4.10.2-0.20211012141859-cd360fb1f843/go.mod h1:x92o12+Azh6DQ4yoXT5oEuE7dhQHR5V2vy/fmZ6pO7k= +github.com/weaveworks/aws-sdk-go v0.0.0-20211108161704-7850f7f8da38 h1:E4QrBztoyiNDSU9T8KGIngffuvwWmb2mToILbUMWsis= +github.com/weaveworks/aws-sdk-go v0.0.0-20211108161704-7850f7f8da38/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/weaveworks/goformation/v4 v4.10.2-0.20211018090247-36559b6b4f71 h1:r0uEFnXNXamKxelHxLL7quo7R70JznL2WMyENyUHAZw= github.com/weaveworks/goformation/v4 v4.10.2-0.20211018090247-36559b6b4f71/go.mod h1:x92o12+Azh6DQ4yoXT5oEuE7dhQHR5V2vy/fmZ6pO7k= github.com/weaveworks/launcher v0.0.2-0.20200715141516-1ca323f1de15 h1:i/RhLevywqC6cuUWtGdoaNrsJd+/zWh3PXbkXZIyZsU= github.com/weaveworks/launcher v0.0.2-0.20200715141516-1ca323f1de15/go.mod h1:w9Z1vnQmPobkEZ0F3oyiqRYP+62qDqTGnK6t5uhe1kg= -github.com/weaveworks/mesh v0.0.0-20170419100114-1f158d31de55/go.mod h1:mcON9Ws1aW0crSErpXWp7U1ErCDEKliDX2OhVlbWRKk= +github.com/weaveworks/mesh v0.0.0-20191105120815-58dbcc3e8e63/go.mod h1:RZebXKv56dax5zXcLIJZm1Awk28sx0XODXF94Z8WssY= github.com/weaveworks/schemer v0.0.0-20210802122110-338b258ad2ca h1:2P7ELY25OkuvkzAkLrIAXwYCZZEaEEHUshssVKslz8k= github.com/weaveworks/schemer v0.0.0-20210802122110-338b258ad2ca/go.mod h1:y8Luzq6JDsYVoIV0QAlnvIiq8bSaap0myMjWKyzVFTY= github.com/weppos/publicsuffix-go v0.13.1-0.20210123135404-5fd73613514e/go.mod h1:HYux0V0Zi04bHNwOHy4cXJVz/TQjYonnF6aoYhj+3QE= @@ -1694,9 +1882,11 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMc github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v0.0.0-20180816142147-da425ebb7609/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56 h1:yhqBHs09SmmUoNOHc9jgK4a60T3XFRtPAkYxVnqgY50= github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xgfone/netaddr v0.5.1 h1:87DhCyyR6XUr0p63JHTDT5juGDhH49Ak2ePZNBmSL5I= github.com/xgfone/netaddr v0.5.1/go.mod h1:QDEYI/4nQfAtNj7TB4RhYQY1B4U31Edj+SOoDEuIfsQ= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= @@ -1717,8 +1907,13 @@ 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/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +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/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= -github.com/zclconf/go-cty v1.3.1/go.mod h1:YO23e2L18AG+ZYQfSobnY4G65nvwvprPCxBHkufUH1k= +github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zclconf/go-cty v1.8.2/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is= @@ -1772,16 +1967,21 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -1793,12 +1993,15 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= -gocloud.dev v0.23.0 h1:u/6F8slWwaZPgGpjpNp0jzH+1P/M2ri7qEP3lFgbqBE= -gocloud.dev v0.23.0/go.mod h1:zklCCIIo1N9ELkU2S2E7tW8P8eeMU7oGLeQCXdDwx9Q= +gocloud.dev v0.24.0 h1:cNtHD07zQQiv02OiwwDyVMuHmR7iQt2RLkzoAgz7wBs= +gocloud.dev v0.24.0/go.mod h1:uA+als++iBX5ShuG4upQo/3Zoz49iIPlYUWHV5mM8w8= golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1810,11 +2013,13 @@ golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1822,7 +2027,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1832,8 +2039,9 @@ golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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= @@ -1879,8 +2087,10 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/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 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1915,7 +2125,6 @@ golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1948,13 +2157,14 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210420210106-798c2154c571/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a h1:bRuuGXV8wwSdGTB+CtJf+FjgO1APK1CoO39T4BN/XBw= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1966,14 +2176,18 @@ golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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= @@ -1987,6 +2201,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180821044426-4ea2f632f6e9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1998,7 +2213,6 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190122071731-054c452bb702/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2014,6 +2228,9 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2063,7 +2280,6 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2076,12 +2292,14 @@ golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2090,16 +2308,21 @@ golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e h1:XMgFehsDnnLGtjvjOfqWSUzt0alpTR1RSEuznObga2c= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= @@ -2107,22 +2330,25 @@ golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20180810153555-6e3c4e7365dd/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.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2131,7 +2357,6 @@ golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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-20190122202912-9c309ee22fab/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/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= @@ -2160,6 +2385,7 @@ golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2172,7 +2398,6 @@ golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -2195,7 +2420,6 @@ golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWc golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2240,6 +2464,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f 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= @@ -2251,12 +2476,14 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -2281,13 +2508,22 @@ google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSr google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= -google.golang.org/api v0.46.0 h1:jkDWHOBIoNSD0OQpq4rtBVu+Rh325MPjXG1rakAp8JU= google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.52.0/go.mod h1:Him/adpjt0sxtkWViy0b6xyKW/SD71CwdJ7HqJo7SrU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0 h1:08F9XVYTLOGeSQb3xI9C0gXMuQanhdGed0cWFhDozbI= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2300,6 +2536,7 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -2342,12 +2579,14 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 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-20210126160654-44e461bb6506/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-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2355,13 +2594,27 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210331142528-b7513248f0ba/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210423144448-3a41ef94ed2b/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210510173355-fb37daa5cd7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2 h1:NHN4wOCScVzKhPenJ2dt+BTs3X/XkBVI/Rh4iDt55T8= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -2393,8 +2646,12 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2408,11 +2665,16 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2427,20 +2689,27 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/godo.v2 v2.0.9/go.mod h1:wgvPPKLsWN0hPIJ4JyxvFGGbIW3fJMSrXhdvSuZ1z/8= +gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk= +gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= @@ -2450,6 +2719,7 @@ gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.0.0/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2464,11 +2734,13 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +helm.sh/helm/v3 v3.5.1/go.mod h1:bjwXfmGAF+SEuJZ2AtN1xmTuz4FqaNYOJrXP+vtj6Tw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= @@ -2477,7 +2749,6 @@ 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= -honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= honnef.co/go/tools v0.1.4/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= honnef.co/go/tools v0.2.1 h1:/EPr//+UMMXwMTkXvCCoaJDq8cpjMO80Ou+L4PDo2mY= honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= @@ -2494,7 +2765,7 @@ k8s.io/client-go v0.21.2 h1:Q1j4L/iMN4pTw6Y4DWppBoUxgKO8LbffEMVEV00MUp0= k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA= k8s.io/cloud-provider v0.21.2 h1:zF74hZLfKq9lw+MT5DSUUNk57M84+WcEcpdwjIrPE94= k8s.io/cloud-provider v0.21.2/go.mod h1:2mYI/l+eJESZ0Ye0fRHKMJ55t/j/TZ+gj3NUQkgIcBI= -k8s.io/cloud-provider-openstack v1.19.3/go.mod h1:J/X/tgKwUDtsrfdJ4aL0iEQLi/8chdbs4rAiYznYwPQ= +k8s.io/cloud-provider-openstack v1.21.0/go.mod h1:N0Tnl9sMDSuW8CXJqT0XK8f/KSuQ1I0ClhOBgTAv3fc= k8s.io/cluster-bootstrap v0.21.2/go.mod h1:OEm/gajtWz/ohbS4NGxkyTp/6f1fW3TBThgCQ1ljhHo= k8s.io/code-generator v0.21.2 h1:EyHysEtLHTsNMoace0b3Yec9feD0qkV+5RZRoeSh+sc= k8s.io/code-generator v0.21.2/go.mod h1:8mXJDCB7HcRo1xiEQstcguZkbxZaqeUOrO9SsicWs3U= @@ -2507,21 +2778,21 @@ k8s.io/csi-translation-lib v0.21.2 h1:TflEX56q+TpE17bELMoZNRtFuVZNFmzG6aBxNXSqPf k8s.io/csi-translation-lib v0.21.2/go.mod h1:LgswOMSIdOntgqxcHsspcG61R34t954N//9jiSD/TTM= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200710205751-c0d492a0f3ca/go.mod h1:aG2eeomYfcUw8sE3fa7YdkjgnGtyY56TjZlaJJ0ZoWo= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 h1:Uusb3oh8XcdzDF/ndlI4ToKTYVlkCSJP39SRY2mfRAw= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210203185629-de9496dff47b h1:bAU8IlrMA6KbP0dIg/sVSJn95pDCUHDZx0DpTGrf2v4= +k8s.io/gengo v0.0.0-20210203185629-de9496dff47b/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= -k8s.io/helm v2.9.0+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kops v1.19.0 h1:g6rrfzy5+E3Q9I+6EWrwyjqr+JRfUORf+1/AmfzNfJg= -k8s.io/kops v1.19.0/go.mod h1:io9PpBPuALwy5DBFLabx3w6VrfWyTL731xbjVy4eY0U= +k8s.io/kops v1.21.2 h1:1M5644J4/JBrnh0YLuOtJ5xG8nPjzmcrYmhv+Lk4GEg= +k8s.io/kops v1.21.2/go.mod h1:dFhAKdCzIHgTIN/YtyR4PNQ90cPe7DHbMkPM9QqWv3s= k8s.io/kube-aggregator v0.21.2/go.mod h1:7NgmUXJziySAJ7GxMRBBwcJay7MLUoxms31fw/ICpYk= k8s.io/kube-controller-manager v0.21.2/go.mod h1:gu0rV2UWy1k05E3kZxJFQE1F7RR1PZlq83+9J+lWlno= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= @@ -2536,6 +2807,7 @@ k8s.io/kubernetes v1.19.5/go.mod h1:C5hGC62q7CF0806SpBOSf11RyBaM1oQpl01BWRPK81o= k8s.io/legacy-cloud-providers v0.21.2 h1:W8KdwSbc764/mB4ltFWVRLouv6O0U7T/ji6OvZxVDAk= k8s.io/legacy-cloud-providers v0.21.2/go.mod h1:9dFEf/WGCqPhOIGQiAwcPfgAYWRot6txrCshWCg225c= k8s.io/metrics v0.21.2/go.mod h1:wzlOINZMCtWq8dR9gHlyaOemmYlOpAoldEIXE82gAhI= +k8s.io/mount-utils v0.21.0/go.mod h1:dwXbIPxKtTjrBEaX1aK/CMEf1KZ8GzMHpe3NEBfdFXI= k8s.io/sample-apiserver v0.21.2/go.mod h1:NXFq8jUrB3UyYhoGstFMXdHFSxfHZSHX6cUdVBVZKFM= k8s.io/sample-controller v0.16.8 h1:8+vMrwOl2SytJcB4u0EwYsyf1NaFvYD5nab7fo6Qt4U= k8s.io/sample-controller v0.16.8/go.mod h1:aXlORS1ekU77qhGybB5t3JORDurzDpWgvMYxmCsiuos= @@ -2543,8 +2815,10 @@ k8s.io/system-validators v1.1.2/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6g k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210305010621-2afb4311ab10 h1:u5rPykqiCpL+LBfjRkXvnK71gOgIdmq3eHUEkPrbeTI= +k8s.io/utils v0.0.0-20210305010621-2afb4311ab10/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= @@ -2562,15 +2836,16 @@ nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0 nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= 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/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/aws-iam-authenticator v0.5.2 h1:eGCtm6lLVpVVpsIBC1y4OwyQRhmg+A/OPXVMTlDKONc= sigs.k8s.io/aws-iam-authenticator v0.5.2/go.mod h1:yPDLi58MDx1UtCrRMOykLm1IyKKPGHgcGCafcbn2s3E= -sigs.k8s.io/controller-runtime v0.6.1/go.mod h1:XRYBPdbf5XJu9kpS84VJiZ7h/u1hF3gEORz0efEja7A= -sigs.k8s.io/controller-tools v0.2.8 h1:UmYsnu89dn8/wBhjKL3lkGyaDGRnPDYUx2+iwXRnylA= -sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE= +sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= +sigs.k8s.io/controller-runtime v0.9.0-beta.0/go.mod h1:ufPDuvefw2Y1KnBgHQrLdOjueYlj+XJV2AszbT+WTxs= +sigs.k8s.io/controller-tools v0.2.9-0.20200414181213-645d44dca7c0/go.mod h1:YKE/iHvcKITCljdnlqHYe+kAt7ZldvtAwUzQff0k1T0= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/kustomize/api v0.8.8 h1:G2z6JPSSjtWWgMeWSoHdXqyftJNmMmyxXpwENGoOtGE= @@ -2585,8 +2860,11 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +software.sslmate.com/src/go-pkcs12 v0.0.0-20180114231543-2291e8f0f237/go.mod h1:/xvNRWUqm0+/ZMiF4EX00vrSCMsE4/NHb+Pt3freEeQ= software.sslmate.com/src/go-pkcs12 v0.0.0-20190209200317-47dd539968c4/go.mod h1:/xvNRWUqm0+/ZMiF4EX00vrSCMsE4/NHb+Pt3freEeQ= +software.sslmate.com/src/go-pkcs12 v0.0.0-20200830195227-52f69702a001/go.mod h1:/xvNRWUqm0+/ZMiF4EX00vrSCMsE4/NHb+Pt3freEeQ= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/integration/main.go b/integration/main.go index 730f99d764..98b0ce2477 100644 --- a/integration/main.go +++ b/integration/main.go @@ -8,7 +8,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "log" "os" "os/exec" @@ -92,7 +91,7 @@ func listModules() []string { return moduleDirs } - files, err := ioutil.ReadDir(testsDir) + files, err := os.ReadDir(testsDir) if err != nil { log.Fatalf("failed to gather test suites: %v", err) } diff --git a/integration/matchers/flux.go b/integration/matchers/flux.go index 434c4ccab7..ca9a9a7f06 100644 --- a/integration/matchers/flux.go +++ b/integration/matchers/flux.go @@ -5,7 +5,6 @@ package matchers import ( "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -61,7 +60,7 @@ func assertDoesNotContainFluxDir(dir string) { } func dirExists(dir string) (bool, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return false, err } @@ -80,7 +79,7 @@ func assertContainsFluxManifests(dir string) { // API server. Hence, for now, we simply ensure that all files & objects // are present, and that the main fields of these objects match expected // values. - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) Expect(err).ShouldNot(HaveOccurred()) for _, f := range files { if f.IsDir() { @@ -115,7 +114,7 @@ func assertContainsFluxManifests(dir string) { } func assertValidFluxAccountManifest(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -148,7 +147,7 @@ func assertValidFluxAccountManifest(fileName string) { } func assertValidFluxDeploymentManifest(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -175,7 +174,7 @@ func assertValidFluxDeploymentManifest(fileName string) { } func assertValidFluxSecretManifest(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -196,7 +195,7 @@ func assertValidFluxSecretManifest(fileName string) { } func assertValidFluxMemcacheDeploymentManifest(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -224,7 +223,7 @@ func assertValidFluxMemcacheDeploymentManifest(fileName string) { } func assertValidFluxMemcacheServiceManifest(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -250,7 +249,7 @@ func assertValidFluxMemcacheServiceManifest(fileName string) { } func assertValidFluxNamespaceManifest(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -269,7 +268,7 @@ func assertValidFluxNamespaceManifest(fileName string) { } func assertValidFluxHelmOperatorAccount(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -302,7 +301,7 @@ func assertValidFluxHelmOperatorAccount(fileName string) { } func assertValidFluxHelmReleaseCRD(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) @@ -323,7 +322,7 @@ func assertValidFluxHelmReleaseCRD(fileName string) { } func assertValidHelmOperatorDeployment(fileName string) { - bytes, err := ioutil.ReadFile(fileName) + bytes, err := os.ReadFile(fileName) Expect(err).ShouldNot(HaveOccurred()) list, err := kubernetes.NewRawExtensions(bytes) Expect(err).ShouldNot(HaveOccurred()) diff --git a/integration/matchers/git.go b/integration/matchers/git.go index 9d0d557d43..73812ed605 100644 --- a/integration/matchers/git.go +++ b/integration/matchers/git.go @@ -28,6 +28,6 @@ func AssertQuickStartComponentsPresentInGit(branch string) { allFiles = append(allFiles, path) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) fmt.Fprintf(ginkgo.GinkgoWriter, "\n all files:\n%v", allFiles) } diff --git a/integration/runner/runner_test.go b/integration/runner/runner_test.go index 55fe9153e5..613a57536d 100644 --- a/integration/runner/runner_test.go +++ b/integration/runner/runner_test.go @@ -76,13 +76,13 @@ var _ = Describe("command runner", func() { NewCmd("true"), NewCmd("false"), } - Expect(willFail).ToNot(RunSuccessfully()) + Expect(willFail).NotTo(RunSuccessfully()) }) It("can start a command and interrupt it", func() { session := NewCmd("sleep").WithArgs("20").Start() - Expect(session.Command.Process).ToNot(BeNil()) + Expect(session.Command.Process).NotTo(BeNil()) session.Interrupt().Wait() - Expect(session.ExitCode()).ToNot(BeZero()) + Expect(session.ExitCode()).NotTo(BeZero()) }) }) diff --git a/integration/tests/addons/addons_test.go b/integration/tests/addons/addons_test.go index e38363a5da..f053c68e28 100644 --- a/integration/tests/addons/addons_test.go +++ b/integration/tests/addons/addons_test.go @@ -64,7 +64,7 @@ var _ = Describe("(Integration) [EKS Addons test]", func() { clusterConfig.ManagedNodeGroups = []*api.ManagedNodeGroup{ng} data, err := json.Marshal(clusterConfig) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cmd := params.EksctlCreateCmd. WithArgs( @@ -78,7 +78,7 @@ var _ = Describe("(Integration) [EKS Addons test]", func() { rawClient = getRawClient(clusterName) serverVersion, err := rawClient.ServerVersion() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(serverVersion).To(HavePrefix(api.LatestVersion)) }) @@ -196,6 +196,6 @@ func getRawClient(clusterName string) *kubewrapper.RawClient { err = ctl.RefreshClusterStatus(cfg) Expect(err).ShouldNot(HaveOccurred()) rawClient, err := ctl.NewRawClient(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return rawClient } diff --git a/integration/tests/anywhere/anywhere_run_test.go b/integration/tests/anywhere/anywhere_run_test.go index 70b9f3878b..fb908a1f37 100644 --- a/integration/tests/anywhere/anywhere_run_test.go +++ b/integration/tests/anywhere/anywhere_run_test.go @@ -5,7 +5,6 @@ package anywhere import ( "fmt" - "io/ioutil" "os" "path/filepath" "testing" @@ -51,7 +50,7 @@ var _ = Describe("(Integration) [EKS Anywhere]", func() { BeforeEach(func() { var err error - tmpDir, err = ioutil.TempDir("", "anywhere-command") + tmpDir, err = os.MkdirTemp("", "anywhere-command") Expect(err).NotTo(HaveOccurred()) }) @@ -63,7 +62,7 @@ var _ = Describe("(Integration) [EKS Anywhere]", func() { var originalPath string BeforeEach(func() { - err := ioutil.WriteFile(filepath.Join(tmpDir, anywhere.BinaryFileName), []byte(`#!/usr/bin/env sh + err := os.WriteFile(filepath.Join(tmpDir, anywhere.BinaryFileName), []byte(`#!/usr/bin/env sh echo "you called?" exit 0`), 0777) Expect(err).NotTo(HaveOccurred()) diff --git a/integration/tests/assertions.go b/integration/tests/assertions.go index d8dc4b1f85..81b892a38c 100644 --- a/integration/tests/assertions.go +++ b/integration/tests/assertions.go @@ -30,6 +30,6 @@ func ListNodes(clientset kubernetes.Interface, nodeGroupName string) *corev1.Nod nodeList, err := clientset.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{ LabelSelector: fmt.Sprintf("%s=%s", api.NodeGroupNameLabel, nodeGroupName), }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return nodeList } diff --git a/integration/tests/backwards_compat/backwards_compatibility_test.go b/integration/tests/backwards_compat/backwards_compatibility_test.go index d9ce67da52..1ef76876e1 100644 --- a/integration/tests/backwards_compat/backwards_compatibility_test.go +++ b/integration/tests/backwards_compat/backwards_compatibility_test.go @@ -6,7 +6,6 @@ package backwards_compat import ( "errors" "fmt" - "io/ioutil" "os" "path" "runtime" @@ -54,11 +53,11 @@ var _ = Describe("(Integration) [Backwards compatibility test]", func() { } By("downloading a previous release") - eksctlDir, err := ioutil.TempDir(os.TempDir(), "eksctl") - Expect(err).ToNot(HaveOccurred()) + eksctlDir, err := os.MkdirTemp(os.TempDir(), "eksctl") + Expect(err).NotTo(HaveOccurred()) defer func() { - Expect(os.RemoveAll(eksctlDir)).ToNot(HaveOccurred()) + Expect(os.RemoveAll(eksctlDir)).NotTo(HaveOccurred()) }() downloadRelease(eksctlDir) @@ -66,7 +65,7 @@ var _ = Describe("(Integration) [Backwards compatibility test]", func() { eksctlPath := path.Join(eksctlDir, "eksctl") version, err := getVersion(eksctlPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) By(fmt.Sprintf("creating a cluster with release %q", version)) cmd := runner.NewCmd(eksctlPath). diff --git a/integration/tests/before_active/createdeletebeforeactive_test.go b/integration/tests/before_active/createdeletebeforeactive_test.go index 3c5bec2de3..b6a3296860 100644 --- a/integration/tests/before_active/createdeletebeforeactive_test.go +++ b/integration/tests/before_active/createdeletebeforeactive_test.go @@ -81,7 +81,7 @@ var _ = Describe("(Integration) Create & Delete before Active", func() { cmd := params.EksctlDeleteClusterCmd.WithArgs( "--name", params.ClusterName, ) - Expect(cmd).ToNot(RunSuccessfully()) + Expect(cmd).NotTo(RunSuccessfully()) }) }) }) diff --git a/integration/tests/caching/credential_caching_test.go b/integration/tests/caching/credential_caching_test.go index d73491e3a2..e04f348658 100644 --- a/integration/tests/caching/credential_caching_test.go +++ b/integration/tests/caching/credential_caching_test.go @@ -4,7 +4,6 @@ package caching import ( - "io/ioutil" "os" "path/filepath" "testing" @@ -35,7 +34,7 @@ var _ = Describe("", func() { When("credential caching is disabled", func() { var tmp string BeforeEach(func() { - tmp, err := ioutil.TempDir("", "caching_creds") + tmp, err := os.MkdirTemp("", "caching_creds") Expect(err).NotTo(HaveOccurred()) _ = os.Setenv(credentials.EksctlCacheFilenameEnvName, filepath.Join(tmp, "credentials.yaml")) // Make sure the environment property is not set on the running environment. @@ -60,7 +59,7 @@ var _ = Describe("", func() { XWhen("credential caching is enabled", func() { var tmp string BeforeEach(func() { - tmp, err := ioutil.TempDir("", "caching_creds") + tmp, err := os.MkdirTemp("", "caching_creds") Expect(err).NotTo(HaveOccurred()) _ = os.Setenv(credentials.EksctlCacheFilenameEnvName, filepath.Join(tmp, "credentials.yaml")) _ = os.Setenv(credentials.EksctlGlobalEnableCachingEnvName, "1") @@ -74,7 +73,7 @@ var _ = Describe("", func() { ).WithoutArg("--region", params.Region) Expect(cmd).Should(RunSuccessfully()) - content, err := ioutil.ReadFile(filepath.Join(tmp, "credentials.yaml")) + content, err := os.ReadFile(filepath.Join(tmp, "credentials.yaml")) Expect(err).NotTo(HaveOccurred()) Expect(content).NotTo(BeEmpty()) }) diff --git a/integration/tests/cloudwatch_logging/cloudwatch_logging_test.go b/integration/tests/cloudwatch_logging/cloudwatch_logging_test.go new file mode 100644 index 0000000000..4081852a60 --- /dev/null +++ b/integration/tests/cloudwatch_logging/cloudwatch_logging_test.go @@ -0,0 +1,71 @@ +//go:build integration +// +build integration + +package cloudwatch_logging + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/cloudwatchlogs" + + . "github.com/weaveworks/eksctl/integration/matchers" + + api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + + "github.com/pkg/errors" + "github.com/weaveworks/eksctl/pkg/testutils" + + . "github.com/weaveworks/eksctl/integration/runner" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "github.com/weaveworks/eksctl/integration/tests" + clusterutils "github.com/weaveworks/eksctl/integration/utilities/cluster" +) + +var params *tests.Params + +func init() { + // Call testing.Init() prior to tests.NewParams(), as otherwise -test.* will not be recognised. See also: https://golang.org/doc/go1.13#testing + testing.Init() + if err := api.Register(); err != nil { + panic(errors.Wrap(err, "unexpected error registering API scheme")) + } + params = tests.NewParams("cloudwatch") +} + +func TestCloudWatchLogging(t *testing.T) { + testutils.RegisterAndRun(t) +} + +var _ = Describe("(Integration) [CloudWatch Logging test]", func() { + Describe("CloudWatch logging", func() { + It("should create a cluster with CloudWatch logging enabled and log retention set", func() { + cmd := params.EksctlCreateCmd. + WithArgs( + "cluster", + "--config-file=-", + "--verbose=4", + ). + WithoutArg("--region", params.Region). + WithStdin(clusterutils.ReaderFromFile(params.ClusterName, params.Region, "testdata/cloudwatch-cluster.yaml")) + + Expect(cmd).To(RunSuccessfullyWithOutputString(ContainSubstring("set log retention to 545 days for CloudWatch logging"))) + + cloudWatchLogs := cloudwatchlogs.New(NewSession(params.Region)) + logGroups, err := cloudWatchLogs.DescribeLogGroups(&cloudwatchlogs.DescribeLogGroupsInput{ + LogGroupNamePrefix: aws.String(fmt.Sprintf("/aws/eks/%s/cluster", params.ClusterName)), + }) + Expect(err).NotTo(HaveOccurred()) + Expect(logGroups.LogGroups).To(HaveLen(1)) + Expect(*logGroups.LogGroups[0].RetentionInDays).To(Equal(int64(545))) + }) + }) +}) + +var _ = AfterSuite(func() { + params.DeleteClusters() +}) diff --git a/integration/tests/cloudwatch_logging/testdata/cloudwatch-cluster.yaml b/integration/tests/cloudwatch_logging/testdata/cloudwatch-cluster.yaml new file mode 100644 index 0000000000..1ccf17a749 --- /dev/null +++ b/integration/tests/cloudwatch_logging/testdata/cloudwatch-cluster.yaml @@ -0,0 +1,11 @@ +apiVersion: eksctl.io/v1alpha5 +kind: ClusterConfig + +# name is generated +metadata: + name: + +cloudWatch: + clusterLogging: + enableTypes: ["audit", "authenticator", "controllerManager"] + logRetentionInDays: 545 diff --git a/integration/tests/cluster_api/cluster_api_endpoints_test.go b/integration/tests/cluster_api/cluster_api_endpoints_test.go index 1d419fa848..c1dd7727a4 100644 --- a/integration/tests/cluster_api/cluster_api_endpoints_test.go +++ b/integration/tests/cluster_api/cluster_api_endpoints_test.go @@ -6,7 +6,6 @@ package cluster_api import ( "encoding/json" "fmt" - "io/ioutil" "os" "testing" "time" @@ -82,17 +81,17 @@ var _ = Describe("(Integration) Create and Update Cluster with Endpoint Configs" // create and populate config file from clusterconfig bytes, err := json.Marshal(cfg) - Expect(err).ToNot(HaveOccurred()) - Expect(len(bytes)).ToNot(BeZero()) - tmpfile, err := ioutil.TempFile("", "clusterendpointtests") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) + Expect(len(bytes)).NotTo(BeZero()) + tmpfile, err := os.CreateTemp("", "clusterendpointtests") + Expect(err).NotTo(HaveOccurred()) defer os.Remove(tmpfile.Name()) _, err = tmpfile.Write(bytes) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = tmpfile.Close() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) // create cluster with config file if e.Type == createCluster { diff --git a/integration/tests/cluster_dns/cluster_dns_test.go b/integration/tests/cluster_dns/cluster_dns_test.go index 962c456156..71d45e0c80 100644 --- a/integration/tests/cluster_dns/cluster_dns_test.go +++ b/integration/tests/cluster_dns/cluster_dns_test.go @@ -14,6 +14,7 @@ import ( "github.com/weaveworks/eksctl/integration/utilities/kube" "github.com/weaveworks/eksctl/integration/tests" + clusterutils "github.com/weaveworks/eksctl/integration/utilities/cluster" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/testutils" @@ -64,18 +65,18 @@ var _ = Describe("(Integration) [Cluster DNS test]", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(testutils.ClusterConfigReader(clusterConfig)) + WithStdin(clusterutils.Reader(clusterConfig)) Expect(cmd).To(RunSuccessfully()) }) It("cluster DNS should work", func() { test, err := kube.NewTest(params.KubeconfigPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) d := test.CreateDaemonSetFromFile(test.Namespace, "../../data/test-dns.yaml") test.WaitForDaemonSetReady(d, 2*time.Minute) ds, err := test.GetDaemonSet(test.Namespace, d.Name) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) fmt.Fprintf(GinkgoWriter, "ds.Status = %#v", ds.Status) }) diff --git a/integration/tests/crud/creategetdelete_test.go b/integration/tests/crud/creategetdelete_test.go index dbbde64016..6942927cb0 100644 --- a/integration/tests/crud/creategetdelete_test.go +++ b/integration/tests/crud/creategetdelete_test.go @@ -4,11 +4,9 @@ package crud import ( - "bytes" "context" "encoding/json" "fmt" - "io/ioutil" "os" "strings" "testing" @@ -30,6 +28,7 @@ import ( . "github.com/weaveworks/eksctl/integration/matchers" . "github.com/weaveworks/eksctl/integration/runner" "github.com/weaveworks/eksctl/integration/tests" + clusterutils "github.com/weaveworks/eksctl/integration/utilities/cluster" "github.com/weaveworks/eksctl/integration/utilities/kube" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/eks" @@ -77,7 +76,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { params.KubeconfigTemp = false if params.KubeconfigPath == "" { wd, _ := os.Getwd() - f, _ := ioutil.TempFile(wd, "kubeconfig-") + f, _ := os.CreateTemp(wd, "kubeconfig-") params.KubeconfigPath = f.Name() params.KubeconfigTemp = true } @@ -219,15 +218,6 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { Context("and create a new nodegroup with taints and maxPods", func() { It("should have taints and maxPods set", func() { - data, err := os.ReadFile("testdata/taints-max-pods.yaml") - Expect(err).ToNot(HaveOccurred()) - clusterConfig, err := eks.ParseConfig(data) - Expect(err).ToNot(HaveOccurred()) - clusterConfig.Metadata.Name = params.ClusterName - clusterConfig.Metadata.Region = params.Region - - data, err = json.Marshal(clusterConfig) - Expect(err).ToNot(HaveOccurred()) By("creating a new nodegroup with taints and maxPods set") cmd := params.EksctlCreateCmd. WithArgs( @@ -236,13 +226,13 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(bytes.NewReader(data)) + WithStdin(clusterutils.ReaderFromFile(params.ClusterName, params.Region, "testdata/taints-max-pods.yaml")) Expect(cmd).To(RunSuccessfully()) config, err := clientcmd.BuildConfigFromFlags("", params.KubeconfigPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) clientset, err := kubernetes.NewForConfig(config) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) By("asserting that both formats for taints are supported") var ( @@ -414,6 +404,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { }) It("should create the nodegroup without problems", func() { clusterConfig := makeClusterConfig() + clusterConfig.Metadata.Name = params.ClusterName clusterConfig.NodeGroups = []*api.NodeGroup{ { NodeGroupBase: &api.NodeGroupBase{ @@ -432,7 +423,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(testutils.ClusterConfigReader(clusterConfig)) + WithStdin(clusterutils.Reader(clusterConfig)) Expect(cmd).To(RunSuccessfully()) }) }) @@ -759,8 +750,8 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { stackNamePrefix := fmt.Sprintf("eksctl-%s-addon-iamserviceaccount-", params.ClusterName) - Expect(awsSession).ToNot(HaveExistingStack(stackNamePrefix + "default-s3-read-only")) - Expect(awsSession).ToNot(HaveExistingStack(stackNamePrefix + "app1-app-cache-access")) + Expect(awsSession).NotTo(HaveExistingStack(stackNamePrefix + "default-s3-read-only")) + Expect(awsSession).NotTo(HaveExistingStack(stackNamePrefix + "app1-app-cache-access")) }) }) @@ -887,10 +878,10 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { Expect(so.SubjectFromWebIdentityToken).To(Equal("system:serviceaccount:" + test.Namespace + ":s3-reader")) - Expect(so.Credentials.SecretAccessKey).ToNot(BeEmpty()) - Expect(so.Credentials.SessionToken).ToNot(BeEmpty()) - Expect(so.Credentials.Expiration).ToNot(BeEmpty()) - Expect(so.Credentials.AccessKeyID).ToNot(BeEmpty()) + Expect(so.Credentials.SecretAccessKey).NotTo(BeEmpty()) + Expect(so.Credentials.SessionToken).NotTo(BeEmpty()) + Expect(so.Credentials.Expiration).NotTo(BeEmpty()) + Expect(so.Credentials.AccessKeyID).NotTo(BeEmpty()) } deleteCmd := params.EksctlDeleteCmd.WithArgs( @@ -960,7 +951,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { "--arn", "arn:aws:iam::123456:role/idontexist", "-o", "yaml", ) - Expect(cmd).ToNot(RunSuccessfully()) + Expect(cmd).NotTo(RunSuccessfully()) }) It("fails getting unknown user mapping", func() { cmd := params.EksctlGetCmd.WithArgs( @@ -969,7 +960,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { "--arn", "arn:aws:iam::123456:user/bob", "-o", "yaml", ) - Expect(cmd).ToNot(RunSuccessfully()) + Expect(cmd).NotTo(RunSuccessfully()) }) It("creates role mapping", func() { create := params.EksctlCreateCmd.WithArgs( @@ -1086,7 +1077,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { "--cluster", params.ClusterName, "--arn", "arn:aws:iam::123456:role/idontexist", ) - Expect(deleteCmd).ToNot(RunSuccessfully()) + Expect(deleteCmd).NotTo(RunSuccessfully()) }) It("deletes duplicate role mappings with --all", func() { deleteCmd := params.EksctlDeleteCmd.WithArgs( @@ -1103,7 +1094,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { "--arn", role1.ARN(), "-o", "yaml", ) - Expect(getCmd).ToNot(RunSuccessfully()) + Expect(getCmd).NotTo(RunSuccessfully()) }) It("deletes duplicate user mappings with --all", func() { deleteCmd := params.EksctlDeleteCmd.WithArgs( @@ -1120,7 +1111,7 @@ var _ = Describe("(Integration) Create, Get, Scale & Delete", func() { "--arn", user0.ARN(), "-o", "yaml", ) - Expect(getCmd).ToNot(RunSuccessfully()) + Expect(getCmd).NotTo(RunSuccessfully()) }) }) diff --git a/integration/tests/dry_run/dry_run_test.go b/integration/tests/dry_run/dry_run_test.go index 34ea1a6ca7..4fcb34ab10 100644 --- a/integration/tests/dry_run/dry_run_test.go +++ b/integration/tests/dry_run/dry_run_test.go @@ -150,9 +150,9 @@ vpc: var _ = Describe("(Integration) [Dry-Run test]", func() { parseOutput := func(output []byte) (*api.ClusterConfig, *api.ClusterConfig) { actual, err := eks.ParseConfig(output) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) defaultConfig, err := eks.ParseConfig([]byte(fmt.Sprintf(defaultClusterConfig, params.ClusterName))) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return actual, defaultConfig } @@ -206,7 +206,7 @@ var _ = Describe("(Integration) [Dry-Run test]", func() { c.ManagedNodeGroups = nil c.NodeGroups = nil cidr, err := ipnet.ParseCIDR("192.168.0.0/24") - ExpectWithOffset(1, err).ToNot(HaveOccurred(), "unexpected error parsing CIDR") + ExpectWithOffset(1, err).NotTo(HaveOccurred(), "unexpected error parsing CIDR") c.VPC.CIDR = cidr c.VPC.NAT.Gateway = aws.String("HighlyAvailable") c.IAM.WithOIDC = aws.Bool(true) @@ -220,7 +220,7 @@ var _ = Describe("(Integration) [Dry-Run test]", func() { // TODO consider using a custom matcher session := cmd.Run() - Expect(session.ExitCode()).ToNot(Equal(0)) + Expect(session.ExitCode()).NotTo(Equal(0)) output := string(session.Err.Contents()) Expect(output).To(ContainSubstring(fmt.Sprintf("cannot use %s with --dry-run", strings.Split(flag, "=")[0]))) @@ -258,7 +258,7 @@ var _ = Describe("(Integration) [Dry-Run test]", func() { }, Entry("instance selector options with unmanaged nodegroup", func(actual, expected *api.ClusterConfig) { // This does not do an exact match because instance types matching the instance selector criteria may // change over time as EC2 adds more instance types - Expect(actual.NodeGroups[0].InstancesDistribution.InstanceTypes).ToNot(BeEmpty()) + Expect(actual.NodeGroups[0].InstancesDistribution.InstanceTypes).NotTo(BeEmpty()) actual.NodeGroups[0].InstancesDistribution.InstanceTypes = nil expected.ManagedNodeGroups = nil @@ -275,7 +275,7 @@ var _ = Describe("(Integration) [Dry-Run test]", func() { }, "--managed=false", "--instance-selector-vcpus=2", "--instance-selector-memory=4"), Entry("instance selector options with managed nodegroup", func(actual, expected *api.ClusterConfig) { - Expect(actual.ManagedNodeGroups[0].InstanceTypes).ToNot(BeEmpty()) + Expect(actual.ManagedNodeGroups[0].InstanceTypes).NotTo(BeEmpty()) actual.ManagedNodeGroups[0].InstanceTypes = nil expected.NodeGroups = nil @@ -355,7 +355,7 @@ var _ = Describe("(Integration) [Dry-Run test]", func() { ng := c.ManagedNodeGroups[0] actualNG := actual.ManagedNodeGroups[0] - Expect(actualNG.InstanceTypes).ToNot(BeEmpty()) + Expect(actualNG.InstanceTypes).NotTo(BeEmpty()) actualNG.InstanceTypes = nil ng.InstanceType = "" ng.InstanceSelector = &api.InstanceSelector{ diff --git a/integration/tests/eks_connector/eks_connector_test.go b/integration/tests/eks_connector/eks_connector_test.go index b8bf14bb7b..ed1be3f907 100644 --- a/integration/tests/eks_connector/eks_connector_test.go +++ b/integration/tests/eks_connector/eks_connector_test.go @@ -5,7 +5,6 @@ package eks_connector_test import ( "fmt" - "io/ioutil" "os" "path" "testing" @@ -60,7 +59,7 @@ var _ = Describe("(Integration) [EKS Connector test]", func() { ) wd, err := os.Getwd() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(cmd).To(RunSuccessfullyWithOutputStringLines( ContainElement(ContainSubstring(fmt.Sprintf("registered cluster %q successfully", connectedClusterName))), @@ -87,8 +86,8 @@ var _ = Describe("(Integration) [EKS Connector test]", func() { rawClient := getRawClient(params.ClusterName, params.Region) for _, f := range resourcePaths { - bytes, err := ioutil.ReadFile(f) - Expect(err).ToNot(HaveOccurred()) + bytes, err := os.ReadFile(f) + Expect(err).NotTo(HaveOccurred()) Expect(rawClient.CreateOrReplace(bytes, false)).To(Succeed()) } @@ -99,7 +98,7 @@ var _ = Describe("(Integration) [EKS Connector test]", func() { Region: params.Region, }, }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) By("ensuring the registered cluster is active and visible") describeClusterInput := &awseks.DescribeClusterInput{ @@ -107,7 +106,7 @@ var _ = Describe("(Integration) [EKS Connector test]", func() { } Eventually(func() string { connectedCluster, err := provider.Provider.EKS().DescribeCluster(describeClusterInput) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return *connectedCluster.Cluster.Status }, "5m", "8s").Should(Equal("ACTIVE")) @@ -122,7 +121,7 @@ var _ = Describe("(Integration) [EKS Connector test]", func() { ) session := cmd.Run() - Expect(session.ExitCode()).ToNot(Equal(0)) + Expect(session.ExitCode()).NotTo(Equal(0)) output := string(session.Err.Contents()) Expect(output).To(ContainSubstring(fmt.Sprintf("cannot perform this operation on a non-EKS cluster; please follow the documentation for "+ "cluster %s's Kubernetes provider", connectedClusterName))) @@ -177,6 +176,6 @@ func getRawClient(clusterName, region string) *kubewrapper.RawClient { err = ctl.RefreshClusterStatus(cfg) Expect(err).ShouldNot(HaveOccurred()) rawClient, err := ctl.NewRawClient(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return rawClient } diff --git a/integration/tests/fargate/fargate_test.go b/integration/tests/fargate/fargate_test.go index fdd5067d80..3539398948 100644 --- a/integration/tests/fargate/fargate_test.go +++ b/integration/tests/fargate/fargate_test.go @@ -64,7 +64,7 @@ var _ = Describe("(Integration) Fargate", func() { var err error ft.kubeTest, err = kube.NewTest(params.KubeconfigPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } testDefaultFargateProfile := func(clusterName string, kubeTest *harness.Test) { diff --git a/integration/tests/gitops/flux_test.go b/integration/tests/gitops/flux_test.go index b45ef37987..fb4e8148c3 100644 --- a/integration/tests/gitops/flux_test.go +++ b/integration/tests/gitops/flux_test.go @@ -4,15 +4,13 @@ package integration_test import ( - "encoding/json" - "io/ioutil" - "os" + "fmt" "testing" . "github.com/weaveworks/eksctl/integration/matchers" - "github.com/weaveworks/eksctl/integration/runner" . "github.com/weaveworks/eksctl/integration/runner" "github.com/weaveworks/eksctl/integration/tests" + clusterutils "github.com/weaveworks/eksctl/integration/utilities/cluster" "github.com/weaveworks/eksctl/integration/utilities/git" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/testutils" @@ -59,10 +57,9 @@ var _ = AfterSuite(func() { var _ = Describe("Enable GitOps", func() { var ( - branch string - cmd runner.Cmd - configFile *os.File - localRepo string + branch string + clusterConfig *api.ClusterConfig + localRepo string ) BeforeEach(func() { @@ -70,7 +67,7 @@ var _ = Describe("Enable GitOps", func() { branch = namer.RandomName() } - cfg := &api.ClusterConfig{ + clusterConfig = &api.ClusterConfig{ TypeMeta: api.ClusterConfigTypeMeta(), Metadata: &api.ClusterMeta{ Version: api.DefaultVersion, @@ -88,25 +85,22 @@ var _ = Describe("Enable GitOps", func() { }, }, } - configData, err := json.Marshal(&cfg) - Expect(err).NotTo(HaveOccurred()) - configFile, err = ioutil.TempFile("", "") - Expect(err).NotTo(HaveOccurred()) - Expect(ioutil.WriteFile(configFile.Name(), configData, 0755)).To(Succeed()) }) AfterEach(func() { - _ = git.CleanupBranchAndRepo(branch, localRepo) - Expect(os.RemoveAll(configFile.Name())).To(Succeed()) + if err := git.CleanupBranchAndRepo(branch, localRepo); err != nil { + fmt.Fprintf(GinkgoWriter, "error cleaning up branch and repo: %v", err) + } }) Context("enable flux", func() { It("should deploy Flux v2 components to the cluster", func() { AssertFluxPodsAbsentInKubernetes(params.KubeconfigPath, "flux-system") - cmd = params.EksctlEnableCmd.WithArgs( + cmd := params.EksctlEnableCmd.WithArgs( "flux", - "--config-file", configFile.Name(), - ) + "--config-file", "-", + ).WithStdin(clusterutils.Reader(clusterConfig)) + Expect(cmd).To(RunSuccessfully()) AssertFlux2PodsPresentInKubernetes(params.KubeconfigPath) }) diff --git a/integration/tests/inferentia/inferentia_test.go b/integration/tests/inferentia/inferentia_test.go index d12355c70c..46311c73a1 100644 --- a/integration/tests/inferentia/inferentia_test.go +++ b/integration/tests/inferentia/inferentia_test.go @@ -5,7 +5,6 @@ package inferentia import ( "context" - "io/ioutil" "os" "testing" @@ -52,7 +51,7 @@ var _ = Describe("(Integration) Inferentia nodes", func() { params.KubeconfigTemp = false if params.KubeconfigPath == "" { wd, _ := os.Getwd() - f, _ := ioutil.TempFile(wd, "kubeconfig-") + f, _ := os.CreateTemp(wd, "kubeconfig-") params.KubeconfigPath = f.Name() params.KubeconfigTemp = true } diff --git a/integration/tests/instance_selector/instance_selector_test.go b/integration/tests/instance_selector/instance_selector_test.go index d113869ff6..755da69180 100644 --- a/integration/tests/instance_selector/instance_selector_test.go +++ b/integration/tests/instance_selector/instance_selector_test.go @@ -9,12 +9,12 @@ import ( . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" "github.com/pkg/errors" - "github.com/weaveworks/eksctl/pkg/utils" "github.com/weaveworks/eksctl/integration/tests" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/eks" "github.com/weaveworks/eksctl/pkg/testutils" + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" . "github.com/onsi/ginkgo" ) @@ -50,7 +50,7 @@ var _ = Describe("(Integration) [Instance Selector test]", func() { output := session.Buffer().Contents() clusterConfig, err := eks.ParseConfig(output) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(clusterConfig.ManagedNodeGroups).To(HaveLen(1)) if assertionFunc != nil { assertionFunc(clusterConfig.ManagedNodeGroups[0].InstanceTypes) @@ -58,7 +58,7 @@ var _ = Describe("(Integration) [Instance Selector test]", func() { }, Entry("non-GPU instances", func(instanceTypes []string) { for _, instanceType := range instanceTypes { - Expect(instanceType).ToNot(Satisfy(utils.IsGPUInstanceType)) + Expect(instanceType).NotTo(Satisfy(instanceutils.IsGPUInstanceType)) } }, "--instance-selector-vcpus=8", "--instance-selector-memory=32", diff --git a/integration/tests/managed/managed_nodegroup_test.go b/integration/tests/managed/managed_nodegroup_test.go index 77a2d22115..71ed0701d4 100644 --- a/integration/tests/managed/managed_nodegroup_test.go +++ b/integration/tests/managed/managed_nodegroup_test.go @@ -22,9 +22,11 @@ import ( . "github.com/weaveworks/eksctl/integration/matchers" . "github.com/weaveworks/eksctl/integration/runner" "github.com/weaveworks/eksctl/integration/tests" + clusterutils "github.com/weaveworks/eksctl/integration/utilities/cluster" "github.com/weaveworks/eksctl/integration/utilities/kube" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/testutils" + "github.com/weaveworks/eksctl/pkg/utils/names" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" @@ -99,7 +101,7 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(testutils.ClusterConfigReader(clusterConfig)) + WithStdin(clusterutils.Reader(clusterConfig)) Expect(cmd).To(RunSuccessfully()) }, @@ -141,7 +143,7 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { if m.expectedErr != "" { session := cmd.Run() - Expect(session.ExitCode()).ToNot(Equal(0)) + Expect(session.ExitCode()).NotTo(Equal(0)) output := session.Err.Contents() Expect(string(output)).To(ContainSubstring(m.expectedErr)) return @@ -191,25 +193,24 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { }), ) - Context("Bottlerocket nodegroups", func() { - It("should work as a node AMI family", func() { + Describe("Bottlerocket nodegroup", func() { + var kubeTest *harness.Test + + BeforeEach(func() { + var err error + kubeTest, err = kube.NewTest(params.KubeconfigPath) + Expect(err).NotTo(HaveOccurred()) + }) + + AfterEach(func() { + kubeTest.Close() + }) + + assertCreateBottlerocket := func(ng *api.ManagedNodeGroup) *corev1.NodeList { clusterConfig := makeClusterConfig() - clusterConfig.ManagedNodeGroups = []*api.ManagedNodeGroup{ - { - NodeGroupBase: &api.NodeGroupBase{ - Name: "bottlerocket", - VolumeSize: aws.Int(35), - AMIFamily: "Bottlerocket", - }, - Taints: []api.NodeGroupTaint{ - { - Key: "key1", - Value: "value1", - Effect: "PreferNoSchedule", - }, - }, - }, - } + ng.Name = names.ForNodeGroup("", "") + + clusterConfig.ManagedNodeGroups = []*api.ManagedNodeGroup{ng} cmd := params.EksctlCreateCmd. WithArgs( "nodegroup", @@ -217,9 +218,78 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(testutils.ClusterConfigReader(clusterConfig)) + WithStdin(clusterutils.Reader(clusterConfig)) Expect(cmd).To(RunSuccessfully()) + + nodeList := kubeTest.ListNodes(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", "eks.amazonaws.com/nodegroup", ng.Name), + }) + Expect(nodeList.Items).NotTo(BeEmpty()) + for _, node := range nodeList.Items { + Expect(node.Status.NodeInfo.OSImage).To(ContainSubstring("Bottlerocket")) + } + return nodeList + } + + It("should create a standard nodegroup", func() { + ng := &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + VolumeSize: aws.Int(35), + AMIFamily: "Bottlerocket", + Labels: map[string]string{ + "ami-family": "bottlerocket", + }, + Bottlerocket: &api.NodeGroupBottlerocket{ + EnableAdminContainer: api.Enabled(), + }, + ScalingConfig: &api.ScalingConfig{ + DesiredCapacity: aws.Int(1), + }, + }, + Taints: []api.NodeGroupTaint{ + { + Key: "key1", + Value: "value1", + Effect: "PreferNoSchedule", + }, + }, + } + + assertCreateBottlerocket(ng) + }) + + It("should create a nodegroup with custom Bottlerocket settings", func() { + ng := &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + VolumeSize: aws.Int(20), + AMIFamily: "Bottlerocket", + Labels: map[string]string{ + "ami-family": "bottlerocket", + }, + Bottlerocket: &api.NodeGroupBottlerocket{ + EnableAdminContainer: api.Enabled(), + Settings: &api.InlineDocument{ + "motd": "Bottlerocket is the future", + "network": map[string]string{ + "hostname": "custom-bottlerocket-host", + }, + }, + }, + }, + Taints: []api.NodeGroupTaint{ + { + Key: "key1", + Value: "value1", + Effect: "PreferNoSchedule", + }, + }, + } + + nodeList := assertCreateBottlerocket(ng) + for _, node := range nodeList.Items { + Expect(node.Labels["kubernetes.io/hostname"]).To(Equal("custom-bottlerocket-host")) + } }) }) @@ -407,13 +477,13 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { } By(fmt.Sprintf("checking that control plane is updated to %v", nextVersion)) config, err := clientcmd.BuildConfigFromFlags("", params.KubeconfigPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) clientset, err := kubernetes.NewForConfig(config) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Eventually(func() string { serverVersion, err := clientset.ServerVersion() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return fmt.Sprintf("%s.%s", serverVersion.Major, strings.TrimSuffix(serverVersion.Minor, "+")) }, k8sUpdatePollTimeout, k8sUpdatePollInterval).Should(Equal(nextVersion)) @@ -464,13 +534,13 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(testutils.ClusterConfigReader(clusterConfig)) + WithStdin(clusterutils.Reader(clusterConfig)) Expect(cmd).To(RunSuccessfully()) config, err := clientcmd.BuildConfigFromFlags("", params.KubeconfigPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) clientset, err := kubernetes.NewForConfig(config) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) mapTaints := func(taints []api.NodeGroupTaint) []corev1.Taint { var ret []corev1.Taint @@ -510,7 +580,7 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(testutils.ClusterConfigReader(clusterConfig)) + WithStdin(clusterutils.Reader(clusterConfig)) Expect(cmd).To(RunSuccessfully()) clusterProvider, err := eks.New(&api.ProviderConfig{Region: params.Region}, clusterConfig) @@ -536,7 +606,7 @@ var _ = Describe("(Integration) Create Managed Nodegroups", func() { "--verbose", "4", ). WithoutArg("--region", params.Region). - WithStdin(testutils.ClusterConfigReader(clusterConfig)) + WithStdin(clusterutils.Reader(clusterConfig)) Expect(cmd).To(RunSuccessfullyWithOutputStringLines( ContainElement(ContainSubstring("unchanged fields for nodegroup update-config-ng: the following fields remain unchanged; they are not supported by `eksctl update nodegroup`: Spot")), diff --git a/integration/tests/params.go b/integration/tests/params.go index a6c1632506..08d04d1df3 100644 --- a/integration/tests/params.go +++ b/integration/tests/params.go @@ -94,7 +94,7 @@ func (p *Params) GenerateCommands() { p.EksctlGetCmd = p.EksctlCmd. WithArgs("get"). - WithTimeout(1 * time.Minute) + WithTimeout(2 * time.Minute) p.EksctlSetLabelsCmd = p.EksctlCmd. WithArgs("set", "labels"). diff --git a/integration/tests/quickstart_profiles_gen/quickstart_profiles_gen_test.go b/integration/tests/quickstart_profiles_gen/quickstart_profiles_gen_test.go index 7a6cd8f47a..13e957d6f7 100644 --- a/integration/tests/quickstart_profiles_gen/quickstart_profiles_gen_test.go +++ b/integration/tests/quickstart_profiles_gen/quickstart_profiles_gen_test.go @@ -58,7 +58,7 @@ var _ = Describe("(Integration) generate profile", func() { } contents, err := fs.ReadFile(filepath.Join(params.TestDirectory, "workloads/namespace.yaml")) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(string(contents)).To(MatchYAML(fmt.Sprintf( `--- apiVersion: v1 @@ -70,7 +70,7 @@ metadata: `, params.ClusterName, params.Region, params.ClusterName))) contents, err = fs.ReadFile(filepath.Join(params.TestDirectory, "workloads/services/service.yaml")) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(string(contents)).To(MatchYAML(fmt.Sprintf( `--- apiVersion: v1 @@ -87,7 +87,7 @@ spec: `, params.ClusterName))) contents, err = fs.ReadFile(filepath.Join(params.TestDirectory, "metadata.yaml")) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(string(contents)).To(MatchYAML( `--- somekey: diff --git a/integration/tests/unowned_cluster/unowned_cluster_test.go b/integration/tests/unowned_cluster/unowned_cluster_test.go index 9830d6cc50..61531563d2 100644 --- a/integration/tests/unowned_cluster/unowned_cluster_test.go +++ b/integration/tests/unowned_cluster/unowned_cluster_test.go @@ -6,7 +6,6 @@ package unowned_clusters import ( "encoding/json" "fmt" - "io/ioutil" "os" "strings" "testing" @@ -70,7 +69,7 @@ var _ = Describe("(Integration) [non-eksctl cluster & nodegroup support]", func( } var err error - configFile, err = ioutil.TempFile("", "") + configFile, err = os.CreateTemp("", "") Expect(err).NotTo(HaveOccurred()) if !params.SkipCreate { @@ -112,7 +111,7 @@ var _ = Describe("(Integration) [non-eksctl cluster & nodegroup support]", func( // write config file so that the nodegroup creates have access to the vpc spec configData, err := json.Marshal(&cfg) Expect(err).NotTo(HaveOccurred()) - Expect(ioutil.WriteFile(configFile.Name(), configData, 0755)).To(Succeed()) + Expect(os.WriteFile(configFile.Name(), configData, 0755)).To(Succeed()) cmd := params.EksctlCreateNodegroupCmd. WithArgs( "--config-file", configFile.Name(), @@ -130,7 +129,7 @@ var _ = Describe("(Integration) [non-eksctl cluster & nodegroup support]", func( // write config file so that the nodegroup creates have access to the vpc spec configData, err := json.Marshal(&cfg) Expect(err).NotTo(HaveOccurred()) - Expect(ioutil.WriteFile(configFile.Name(), configData, 0755)).To(Succeed()) + Expect(os.WriteFile(configFile.Name(), configData, 0755)).To(Succeed()) cmd := params.EksctlCreateNodegroupCmd. WithArgs( "--config-file", configFile.Name(), @@ -484,7 +483,7 @@ func createClusterWithNodeGroup(clusterName, stackName, ng1, version string, ctl } func createVPCAndRole(stackName string, ctl api.ClusterProvider) ([]string, []string, string, string, string, string) { - templateBody, err := ioutil.ReadFile("cf-template.yaml") + templateBody, err := os.ReadFile("cf-template.yaml") Expect(err).NotTo(HaveOccurred()) createStackInput := &cfn.CreateStackInput{ StackName: &stackName, diff --git a/integration/tests/update/update_cluster_test.go b/integration/tests/update/update_cluster_test.go index eaac85f074..7634ced6c1 100644 --- a/integration/tests/update/update_cluster_test.go +++ b/integration/tests/update/update_cluster_test.go @@ -6,7 +6,6 @@ package update import ( "context" "fmt" - "io/ioutil" "os" "strings" "testing" @@ -64,7 +63,7 @@ var _ = Describe("(Integration) Update addons", func() { params.KubeconfigTemp = false if params.KubeconfigPath == "" { wd, _ := os.Getwd() - f, _ := ioutil.TempFile(wd, "kubeconfig-") + f, _ := os.CreateTemp(wd, "kubeconfig-") params.KubeconfigPath = f.Name() params.KubeconfigTemp = true } @@ -141,14 +140,14 @@ var _ = Describe("(Integration) Update addons", func() { By(fmt.Sprintf("checking that control plane is updated to %v", nextEKSVersion)) config, err := clientcmd.BuildConfigFromFlags("", params.KubeconfigPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) clientSet, err := kubernetes.NewForConfig(config) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Eventually(func() string { serverVersion, err := clientSet.ServerVersion() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return fmt.Sprintf("%s.%s", serverVersion.Major, strings.TrimSuffix(serverVersion.Minor, "+")) }, k8sUpdatePollTimeout, k8sUpdatePollInterval).Should(Equal(nextEKSVersion)) }) @@ -164,12 +163,12 @@ var _ = Describe("(Integration) Update addons", func() { rawClient := getRawClient() kubernetesVersion, err := rawClient.ServerVersion() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Eventually(func() string { daemonSet, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), "kube-proxy", metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubeProxyVersion, err := addons.ImageTag(daemonSet.Spec.Template.Spec.Containers[0].Image) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return kubeProxyVersion }, k8sUpdatePollTimeout, k8sUpdatePollInterval).Should(Equal(fmt.Sprintf("v%s-eksbuild.1", kubernetesVersion))) }) @@ -178,9 +177,9 @@ var _ = Describe("(Integration) Update addons", func() { rawClient := getRawClient() getAWSNodeVersion := func() string { awsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), "aws-node", metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) imageTag, err := addons.ImageTag(awsNode.Spec.Template.Spec.Containers[0].Image) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return imageTag } preUpdateAWSNodeVersion := getAWSNodeVersion() @@ -222,6 +221,6 @@ func getRawClient() *kubewrapper.RawClient { err = ctl.RefreshClusterStatus(cfg) Expect(err).ShouldNot(HaveOccurred()) rawClient, err := ctl.NewRawClient(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return rawClient } diff --git a/integration/tests/windows/windows_test.go b/integration/tests/windows/windows_test.go index 67b08e1994..75a5bdb7c7 100644 --- a/integration/tests/windows/windows_test.go +++ b/integration/tests/windows/windows_test.go @@ -52,6 +52,12 @@ var _ = Describe("(Integration) [Windows Nodegroups]", func() { AMIFamily: api.NodeImageFamilyWindowsServer2019FullContainer, }, }, + { + NodeGroupBase: &api.NodeGroupBase{ + Name: "windows20h2", + AMIFamily: api.NodeImageFamilyWindowsServer20H2CoreContainer, + }, + }, } clusterConfig.ManagedNodeGroups = []*api.ManagedNodeGroup{ { @@ -62,7 +68,7 @@ var _ = Describe("(Integration) [Windows Nodegroups]", func() { } data, err := json.Marshal(clusterConfig) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cmd := params.EksctlCreateCmd. WithArgs( @@ -80,7 +86,7 @@ var _ = Describe("(Integration) [Windows Nodegroups]", func() { runWindowsPod := func() { By("scheduling a Windows pod") kubeTest, err := kube.NewTest(params.KubeconfigPath) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) d := kubeTest.CreateDeploymentFromFile("default", "../../data/windows-server-iis.yaml") kubeTest.WaitForDeploymentReady(d, 12*time.Minute) @@ -91,8 +97,8 @@ var _ = Describe("(Integration) [Windows Nodegroups]", func() { createCluster(withOIDC) runWindowsPod() }, - Entry("when withOIDC is disabled", false), - Entry("when withOIDC is enabled", true), + PEntry("when withOIDC is disabled", false), + PEntry("when withOIDC is enabled", true), ) }) diff --git a/integration/utilities/cluster/cluster.go b/integration/utilities/cluster/cluster.go new file mode 100644 index 0000000000..aaec11d94c --- /dev/null +++ b/integration/utilities/cluster/cluster.go @@ -0,0 +1,32 @@ +package testutils + +import ( + "bytes" + "encoding/json" + "io" + "os" + + . "github.com/onsi/gomega" + + "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/eks" +) + +func Reader(clusterConfig *v1alpha5.ClusterConfig) io.Reader { + data, err := json.Marshal(clusterConfig) + Expect(err).NotTo(HaveOccurred()) + return bytes.NewReader(data) +} + +func ReaderFromFile(clusterName, region, filename string) io.Reader { + data, err := os.ReadFile(filename) + Expect(err).NotTo(HaveOccurred()) + clusterConfig, err := eks.ParseConfig(data) + Expect(err).NotTo(HaveOccurred()) + clusterConfig.Metadata.Name = clusterName + clusterConfig.Metadata.Region = region + + data, err = json.Marshal(clusterConfig) + Expect(err).NotTo(HaveOccurred()) + return bytes.NewReader(data) +} diff --git a/pkg/actions/addon/create_test.go b/pkg/actions/addon/create_test.go index 1452be625c..d63a1acf20 100644 --- a/pkg/actions/addon/create_test.go +++ b/pkg/actions/addon/create_test.go @@ -56,15 +56,15 @@ var _ = Describe("Create", func() { for _, item := range sampleAddons { rc, err := rawClient.NewRawResource(item) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } ct := rawClient.Collection Expect(ct.Updated()).To(BeEmpty()) - Expect(ct.Created()).ToNot(BeEmpty()) + Expect(ct.Created()).NotTo(BeEmpty()) Expect(ct.CreatedItems()).To(HaveLen(10)) }) @@ -72,7 +72,7 @@ var _ = Describe("Create", func() { var err error oidc, err = iamoidc.NewOpenIDConnectManager(nil, "456123987123", "https://oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E", "aws", nil) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) oidc.ProviderARN = "arn:aws:iam::456123987123:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E" mockProvider.MockEKS().On("CreateAddon", mock.Anything).Run(func(args mock.Arguments) { diff --git a/pkg/actions/addon/update.go b/pkg/actions/addon/update.go index 34b3a0fabd..7834e226c2 100644 --- a/pkg/actions/addon/update.go +++ b/pkg/actions/addon/update.go @@ -3,13 +3,13 @@ package addon import ( "fmt" - "github.com/google/uuid" - "github.com/weaveworks/eksctl/pkg/cfn/manager" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/eks" + "github.com/google/uuid" "github.com/kris-nova/logger" + api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/cfn/manager" ) func (a *Manager) Update(addon *api.Addon, wait bool) error { @@ -101,7 +101,13 @@ func (a *Manager) updateWithNewPolicies(addon *api.Addon) (string, error) { return "", err } var templateBody manager.TemplateBody = createNewTemplate - err = a.stackManager.UpdateStack(stackName, fmt.Sprintf("updating-policy-%s", uuid.NewString()), "updating policies", templateBody, nil) + err = a.stackManager.UpdateStack(manager.UpdateStackOptions{ + StackName: stackName, + ChangeSetName: fmt.Sprintf("updating-policy-%s", uuid.NewString()), + Description: "updating policies", + TemplateData: templateBody, + Wait: true, + }) if err != nil { return "", err } diff --git a/pkg/actions/addon/update_test.go b/pkg/actions/addon/update_test.go index 197da67fd4..339a4e0e91 100644 --- a/pkg/actions/addon/update_test.go +++ b/pkg/actions/addon/update_test.go @@ -4,23 +4,19 @@ import ( "fmt" "time" - "github.com/aws/aws-sdk-go/service/cloudformation" - - iamoidc "github.com/weaveworks/eksctl/pkg/iam/oidc" - - "github.com/weaveworks/eksctl/pkg/cfn/manager" - - "github.com/weaveworks/eksctl/pkg/cfn/builder" - - "github.com/weaveworks/eksctl/pkg/cfn/manager/fakes" - "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/cloudformation" awseks "github.com/aws/aws-sdk-go/service/eks" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/stretchr/testify/mock" + "github.com/weaveworks/eksctl/pkg/actions/addon" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/cfn/builder" + "github.com/weaveworks/eksctl/pkg/cfn/manager" + "github.com/weaveworks/eksctl/pkg/cfn/manager/fakes" + iamoidc "github.com/weaveworks/eksctl/pkg/iam/oidc" "github.com/weaveworks/eksctl/pkg/testutils/mockprovider" ) @@ -48,7 +44,7 @@ var _ = Describe("Update", func() { } oidc, err := iamoidc.NewOpenIDConnectManager(nil, "456123987123", "https://oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E", "aws", nil) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) oidc.ProviderARN = "arn:aws:iam::456123987123:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E" mockProvider.MockEKS().On("DescribeAddonVersions", mock.Anything).Run(func(args mock.Arguments) { @@ -287,13 +283,14 @@ var _ = Describe("Update", func() { Expect(err).NotTo(HaveOccurred()) Expect(fakeStackManager.UpdateStackCallCount()).To(Equal(1)) - stackName, changeSetName, description, templateData, _ := fakeStackManager.UpdateStackArgsForCall(0) - Expect(stackName).To(Equal("eksctl-my-cluster-addon-vpc-cni")) - Expect(changeSetName).To(ContainSubstring("updating-policy")) - Expect(description).To(Equal("updating policies")) + options := fakeStackManager.UpdateStackArgsForCall(0) + Expect(options.StackName).To(Equal("eksctl-my-cluster-addon-vpc-cni")) + Expect(options.ChangeSetName).To(ContainSubstring("updating-policy")) + Expect(options.Description).To(Equal("updating policies")) + Expect(options.Wait).To(BeTrue()) Expect(err).NotTo(HaveOccurred()) - Expect(string(templateData.(manager.TemplateBody))).To(ContainSubstring("arn-1")) - Expect(string(templateData.(manager.TemplateBody))).To(ContainSubstring(":sub\":\"system:serviceaccount:kube-system:aws-node")) + Expect(string(options.TemplateData.(manager.TemplateBody))).To(ContainSubstring("arn-1")) + Expect(string(options.TemplateData.(manager.TemplateBody))).To(ContainSubstring(":sub\":\"system:serviceaccount:kube-system:aws-node")) Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster")) Expect(*updateAddonInput.AddonName).To(Equal("vpc-cni")) @@ -357,12 +354,13 @@ var _ = Describe("Update", func() { Expect(err).NotTo(HaveOccurred()) Expect(fakeStackManager.UpdateStackCallCount()).To(Equal(1)) - stackName, changeSetName, description, templateData, _ := fakeStackManager.UpdateStackArgsForCall(0) - Expect(stackName).To(Equal("eksctl-my-cluster-addon-vpc-cni")) - Expect(changeSetName).To(ContainSubstring("updating-policy")) - Expect(description).To(Equal("updating policies")) + options := fakeStackManager.UpdateStackArgsForCall(0) + Expect(options.StackName).To(Equal("eksctl-my-cluster-addon-vpc-cni")) + Expect(options.ChangeSetName).To(ContainSubstring("updating-policy")) + Expect(options.Description).To(Equal("updating policies")) + Expect(options.Wait).To(BeTrue()) Expect(err).NotTo(HaveOccurred()) - Expect(string(templateData.(manager.TemplateBody))).To(ContainSubstring("policy-bar")) + Expect(string(options.TemplateData.(manager.TemplateBody))).To(ContainSubstring("policy-bar")) Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster")) Expect(*updateAddonInput.AddonName).To(Equal("vpc-cni")) @@ -428,12 +426,13 @@ var _ = Describe("Update", func() { Expect(err).NotTo(HaveOccurred()) Expect(fakeStackManager.UpdateStackCallCount()).To(Equal(1)) - stackName, changeSetName, description, templateData, _ := fakeStackManager.UpdateStackArgsForCall(0) - Expect(stackName).To(Equal("eksctl-my-cluster-addon-vpc-cni")) - Expect(changeSetName).To(ContainSubstring("updating-policy")) - Expect(description).To(Equal("updating policies")) + options := fakeStackManager.UpdateStackArgsForCall(0) + Expect(options.StackName).To(Equal("eksctl-my-cluster-addon-vpc-cni")) + Expect(options.ChangeSetName).To(ContainSubstring("updating-policy")) + Expect(options.Description).To(Equal("updating policies")) + Expect(options.Wait).To(BeTrue()) Expect(err).NotTo(HaveOccurred()) - Expect(string(templateData.(manager.TemplateBody))).To(ContainSubstring("autoscaling:SetDesiredCapacity")) + Expect(string(options.TemplateData.(manager.TemplateBody))).To(ContainSubstring("autoscaling:SetDesiredCapacity")) Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster")) Expect(*updateAddonInput.AddonName).To(Equal("vpc-cni")) diff --git a/pkg/actions/anywhere/anywhere_test.go b/pkg/actions/anywhere/anywhere_test.go index 6c3f7f98fa..2d4e66abda 100644 --- a/pkg/actions/anywhere/anywhere_test.go +++ b/pkg/actions/anywhere/anywhere_test.go @@ -2,7 +2,7 @@ package anywhere_test import ( "fmt" - "io/ioutil" + "io" "os" "path/filepath" "strings" @@ -53,9 +53,9 @@ var _ = Describe("Anywhere", func() { ) BeforeEach(func() { var err error - tmpDir, err = ioutil.TempDir("", "anywhere-command") + tmpDir, err = os.MkdirTemp("", "anywhere-command") Expect(err).NotTo(HaveOccurred()) - err = ioutil.WriteFile(filepath.Join(tmpDir, anywhere.BinaryFileName), []byte(`#!/usr/bin/env sh + err = os.WriteFile(filepath.Join(tmpDir, anywhere.BinaryFileName), []byte(`#!/usr/bin/env sh echo $@ echo "EKSCTL_VERSION=$EKSCTL_VERSION" >&2 echo "stderr outputted" @@ -91,11 +91,11 @@ exit 0`), 0777) newStderrWriter.Close() By("printing the binary stderr to os.Stderr") - stderr, _ := ioutil.ReadAll(newStderrReader) + stderr, _ := io.ReadAll(newStderrReader) Expect(string(stderr)).To(Equal("stderr outputted\n")) By("printing the binary stdout to os.Stdout and passing the args to the binary") - stdout, _ := ioutil.ReadAll(newStdoutReader) + stdout, _ := io.ReadAll(newStdoutReader) stdoutLines := strings.Split(strings.TrimSuffix(string(stdout), "\n"), "\n") Expect(stdoutLines).To(HaveLen(2)) Expect(stdoutLines[0]).To(Equal("--do something")) @@ -106,7 +106,7 @@ exit 0`), 0777) When("the binary exits non-zero", func() { BeforeEach(func() { - err := ioutil.WriteFile(filepath.Join(tmpDir, anywhere.BinaryFileName), []byte(`#!/usr/bin/env sh + err := os.WriteFile(filepath.Join(tmpDir, anywhere.BinaryFileName), []byte(`#!/usr/bin/env sh exit 33`), 0777) Expect(err).NotTo(HaveOccurred()) }) diff --git a/pkg/actions/cluster/cluster.go b/pkg/actions/cluster/cluster.go index a14fd7f0ae..b3d9825860 100644 --- a/pkg/actions/cluster/cluster.go +++ b/pkg/actions/cluster/cluster.go @@ -20,7 +20,7 @@ type Cluster interface { func New(cfg *api.ClusterConfig, ctl *eks.ClusterProvider) (Cluster, error) { clusterExists := true - err := ctl.RefreshClusterStatus(cfg) + err := ctl.RefreshClusterStatusIfStale(cfg) if err != nil { if awsError, ok := errors.Unwrap(errors.Unwrap(err)).(awserr.Error); ok && awsError.Code() == awseks.ErrCodeResourceNotFoundException { @@ -31,14 +31,14 @@ func New(cfg *api.ClusterConfig, ctl *eks.ClusterProvider) (Cluster, error) { } stackManager := ctl.NewStackManager(cfg) - hasClusterStack, err := stackManager.HasClusterStack() + clusterStack, err := stackManager.GetClusterStackIfExists() if err != nil { return nil, err } - if hasClusterStack { + if clusterStack != nil { logger.Debug("cluster %q was created by eksctl", cfg.Metadata.Name) - return NewOwnedCluster(cfg, ctl, stackManager), nil + return NewOwnedCluster(cfg, ctl, clusterStack, stackManager), nil } if !clusterExists { diff --git a/pkg/actions/cluster/owned.go b/pkg/actions/cluster/owned.go index 1d13de26e9..41ea0c57d8 100644 --- a/pkg/actions/cluster/owned.go +++ b/pkg/actions/cluster/owned.go @@ -18,14 +18,16 @@ import ( type OwnedCluster struct { cfg *api.ClusterConfig ctl *eks.ClusterProvider + clusterStack *manager.Stack stackManager manager.StackManager newClientSet func() (kubernetes.Interface, error) } -func NewOwnedCluster(cfg *api.ClusterConfig, ctl *eks.ClusterProvider, stackManager manager.StackManager) *OwnedCluster { +func NewOwnedCluster(cfg *api.ClusterConfig, ctl *eks.ClusterProvider, clusterStack *manager.Stack, stackManager manager.StackManager) *OwnedCluster { return &OwnedCluster{ cfg: cfg, ctl: ctl, + clusterStack: clusterStack, stackManager: stackManager, newClientSet: func() (kubernetes.Interface, error) { return ctl.NewStdClientSet(cfg) @@ -34,7 +36,7 @@ func NewOwnedCluster(cfg *api.ClusterConfig, ctl *eks.ClusterProvider, stackMana } func (c *OwnedCluster) Upgrade(dryRun bool) error { - if err := c.ctl.LoadClusterVPC(c.cfg, c.stackManager); err != nil { + if err := vpc.UseFromClusterStack(c.ctl.Provider, c.clusterStack, c.cfg); err != nil { return errors.Wrapf(err, "getting VPC configuration for cluster %q", c.cfg.Metadata.Name) } diff --git a/pkg/actions/cluster/owned_test.go b/pkg/actions/cluster/owned_test.go index 9d0cfe3fdf..ccbef90259 100644 --- a/pkg/actions/cluster/owned_test.go +++ b/pkg/actions/cluster/owned_test.go @@ -91,7 +91,7 @@ var _ = Describe("Delete", func() { }}}, }, nil) - c := cluster.NewOwnedCluster(cfg, ctl, fakeStackManager) + c := cluster.NewOwnedCluster(cfg, ctl, nil, fakeStackManager) fakeClientSet = fake.NewSimpleClientset() c.SetNewClientSet(func() (kubernetes.Interface, error) { @@ -135,7 +135,7 @@ var _ = Describe("Delete", func() { }}}, }, nil) - c := cluster.NewOwnedCluster(cfg, ctl, fakeStackManager) + c := cluster.NewOwnedCluster(cfg, ctl, nil, fakeStackManager) err := c.Delete(time.Microsecond, false, false) Expect(err).NotTo(HaveOccurred()) diff --git a/pkg/actions/fargate/create_test.go b/pkg/actions/fargate/create_test.go index 45c8e9ea7c..14a61ed31a 100644 --- a/pkg/actions/fargate/create_test.go +++ b/pkg/actions/fargate/create_test.go @@ -63,10 +63,6 @@ var _ = Describe("Fargate", func() { }) Context("owned cluster", func() { - BeforeEach(func() { - fakeStackManager.HasClusterStackReturns(true, nil) - }) - When("creating a farage role without specifying a role", func() { When("the fargate role doesn't exist", func() { BeforeEach(func() { diff --git a/pkg/actions/irsa/tasks.go b/pkg/actions/irsa/tasks.go index 79a389ea10..c4af6f0478 100644 --- a/pkg/actions/irsa/tasks.go +++ b/pkg/actions/irsa/tasks.go @@ -4,12 +4,11 @@ import ( "fmt" "github.com/google/uuid" - iamoidc "github.com/weaveworks/eksctl/pkg/iam/oidc" - - "github.com/weaveworks/eksctl/pkg/cfn/builder" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/cfn/builder" "github.com/weaveworks/eksctl/pkg/cfn/manager" + iamoidc "github.com/weaveworks/eksctl/pkg/iam/oidc" "github.com/weaveworks/eksctl/pkg/utils/tasks" ) @@ -59,5 +58,11 @@ func (t *updateIAMServiceAccountTask) Do(errorCh chan error) error { }() desc := fmt.Sprintf("updating policies for IAMServiceAccount %s/%s", t.sa.Namespace, t.sa.Name) - return t.stackManager.UpdateStack(stackName, fmt.Sprintf("updating-policy-%s", uuid.NewString()), desc, t.templateData, nil) + return t.stackManager.UpdateStack(manager.UpdateStackOptions{ + StackName: stackName, + ChangeSetName: fmt.Sprintf("updating-policy-%s", uuid.NewString()), + Description: desc, + TemplateData: t.templateData, + Wait: true, + }) } diff --git a/pkg/actions/irsa/update.go b/pkg/actions/irsa/update.go index d9b49ad7f0..f5b4637fb3 100644 --- a/pkg/actions/irsa/update.go +++ b/pkg/actions/irsa/update.go @@ -2,6 +2,7 @@ package irsa import ( "fmt" + "strings" "github.com/weaveworks/eksctl/pkg/cfn/manager" @@ -9,8 +10,6 @@ import ( "github.com/weaveworks/eksctl/pkg/utils/tasks" - "strings" - api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" ) diff --git a/pkg/actions/irsa/update_test.go b/pkg/actions/irsa/update_test.go index bc9774512f..aa54181043 100644 --- a/pkg/actions/irsa/update_test.go +++ b/pkg/actions/irsa/update_test.go @@ -5,10 +5,10 @@ import ( "github.com/aws/aws-sdk-go/service/cloudformation" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "github.com/weaveworks/eksctl/pkg/cfn/manager" "github.com/weaveworks/eksctl/pkg/actions/irsa" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/cfn/manager" "github.com/weaveworks/eksctl/pkg/cfn/manager/fakes" iamoidc "github.com/weaveworks/eksctl/pkg/iam/oidc" ) @@ -37,7 +37,7 @@ var _ = Describe("Update", func() { fakeStackManager = new(fakes.FakeStackManager) oidc, err = iamoidc.NewOpenIDConnectManager(nil, "456123987123", "https://oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E", "aws", nil) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) oidc.ProviderARN = "arn:aws:iam::456123987123:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E" irsaManager = irsa.New("my-cluster", fakeStackManager, oidc, nil) }) @@ -57,13 +57,14 @@ var _ = Describe("Update", func() { Expect(fakeStackManager.ListStacksMatchingArgsForCall(0)).To(Equal("eksctl-.*-addon-iamserviceaccount")) Expect(fakeStackManager.UpdateStackCallCount()).To(Equal(1)) fakeStackManager.UpdateStackArgsForCall(0) - stackName, changeSetName, description, templateData, _ := fakeStackManager.UpdateStackArgsForCall(0) - Expect(stackName).To(Equal("eksctl-my-cluster-addon-iamserviceaccount-default-test-sa")) - Expect(changeSetName).To(ContainSubstring("updating-policy")) - Expect(description).To(Equal("updating policies for IAMServiceAccount default/test-sa")) + options := fakeStackManager.UpdateStackArgsForCall(0) + Expect(options.StackName).To(Equal("eksctl-my-cluster-addon-iamserviceaccount-default-test-sa")) + Expect(options.ChangeSetName).To(ContainSubstring("updating-policy")) + Expect(options.Description).To(Equal("updating policies for IAMServiceAccount default/test-sa")) + Expect(options.Wait).To(BeTrue()) Expect(err).NotTo(HaveOccurred()) - Expect(string(templateData.(manager.TemplateBody))).To(ContainSubstring("arn-123")) - Expect(string(templateData.(manager.TemplateBody))).To(ContainSubstring(":sub\":\"system:serviceaccount:default:test-sa")) + Expect(string(options.TemplateData.(manager.TemplateBody))).To(ContainSubstring("arn-123")) + Expect(string(options.TemplateData.(manager.TemplateBody))).To(ContainSubstring(":sub\":\"system:serviceaccount:default:test-sa")) }) When("in plan mode", func() { diff --git a/pkg/actions/nodegroup/create.go b/pkg/actions/nodegroup/create.go index 1c3e385783..f3faf65ab7 100644 --- a/pkg/actions/nodegroup/create.go +++ b/pkg/actions/nodegroup/create.go @@ -14,7 +14,7 @@ import ( "github.com/weaveworks/eksctl/pkg/eks" "github.com/weaveworks/eksctl/pkg/kubernetes" "github.com/weaveworks/eksctl/pkg/printers" - "github.com/weaveworks/eksctl/pkg/utils" + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" "github.com/weaveworks/eksctl/pkg/utils/tasks" "github.com/weaveworks/eksctl/pkg/vpc" @@ -278,7 +278,7 @@ func (m *Manager) checkARMSupport(ctl *eks.ClusterProvider, clientSet kubernetes if err != nil { return err } - if api.ClusterHasInstanceType(cfg, utils.IsARMInstanceType) { + if api.ClusterHasInstanceType(cfg, instanceutils.IsARMInstanceType) { upToDate, err := defaultaddons.DoAddonsSupportMultiArch(clientSet, rawClient, kubernetesVersion, ctl.Provider.Region()) if err != nil { return err diff --git a/pkg/actions/nodegroup/scale.go b/pkg/actions/nodegroup/scale.go index 5d8d405b03..31c61d4e9f 100644 --- a/pkg/actions/nodegroup/scale.go +++ b/pkg/actions/nodegroup/scale.go @@ -16,7 +16,7 @@ import ( api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" ) -func (m *Manager) Scale(ng *api.NodeGroup) error { +func (m *Manager) Scale(ng *api.NodeGroupBase) error { logger.Info("scaling nodegroup %q in cluster %s", ng.Name, m.cfg.Metadata.Name) nodegroupStackInfos, err := m.stackManager.DescribeNodeGroupStacksAndResources() @@ -48,7 +48,7 @@ func (m *Manager) Scale(ng *api.NodeGroup) error { return nil } -func (m *Manager) scaleUnmanagedNodeGroup(ng *api.NodeGroup, stackInfo manager.StackInfo) error { +func (m *Manager) scaleUnmanagedNodeGroup(ng *api.NodeGroupBase, stackInfo manager.StackInfo) error { asgName := "" for _, resource := range stackInfo.Resources { if *resource.LogicalResourceId == "NodeGroup" { @@ -86,7 +86,7 @@ func (m *Manager) scaleUnmanagedNodeGroup(ng *api.NodeGroup, stackInfo manager.S return nil } -func (m *Manager) scaleManagedNodeGroup(ng *api.NodeGroup) error { +func (m *Manager) scaleManagedNodeGroup(ng *api.NodeGroupBase) error { scalingConfig := &eks.NodegroupScalingConfig{} if ng.MaxSize != nil { diff --git a/pkg/actions/nodegroup/scale_test.go b/pkg/actions/nodegroup/scale_test.go index 03f2f1db82..1150f5d5ca 100644 --- a/pkg/actions/nodegroup/scale_test.go +++ b/pkg/actions/nodegroup/scale_test.go @@ -26,7 +26,7 @@ var _ = Describe("Scale", func() { clusterName, ngName string p *mockprovider.MockProvider cfg *api.ClusterConfig - ng *api.NodeGroup + ng *api.NodeGroupBase m *nodegroup.Manager fakeStackManager *fakes.FakeStackManager ) @@ -37,13 +37,11 @@ var _ = Describe("Scale", func() { cfg = api.NewClusterConfig() cfg.Metadata.Name = clusterName - ng = &api.NodeGroup{ - NodeGroupBase: &api.NodeGroupBase{ - Name: ngName, - ScalingConfig: &api.ScalingConfig{ - MinSize: aws.Int(1), - DesiredCapacity: aws.Int(3), - }, + ng = &api.NodeGroupBase{ + Name: ngName, + ScalingConfig: &api.ScalingConfig{ + MinSize: aws.Int(1), + DesiredCapacity: aws.Int(3), }, } m = nodegroup.New(cfg, &eks.ClusterProvider{Provider: p}, nil) diff --git a/pkg/actions/nodegroup/upgrade.go b/pkg/actions/nodegroup/upgrade.go index 083587c69e..d83f9b9409 100644 --- a/pkg/actions/nodegroup/upgrade.go +++ b/pkg/actions/nodegroup/upgrade.go @@ -4,19 +4,18 @@ import ( "fmt" "github.com/aws/aws-sdk-go/aws" - - "github.com/pkg/errors" - "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/service/eks" "github.com/blang/semver" "github.com/kris-nova/logger" + "github.com/pkg/errors" + "github.com/weaveworks/eksctl/pkg/cfn/manager" "github.com/weaveworks/eksctl/pkg/managed" "github.com/weaveworks/eksctl/pkg/utils/waiters" ) -func (m *Manager) Upgrade(options managed.UpgradeOptions, wait bool) error { +func (m *Manager) Upgrade(options managed.UpgradeOptions) error { stackCollection := manager.NewStackCollection(m.ctl.Provider, m.cfg) hasStacks, err := m.hasStacks(options.NodegroupName) if err != nil { @@ -38,7 +37,7 @@ func (m *Manager) Upgrade(options managed.UpgradeOptions, wait bool) error { return err } - if wait { + if options.Wait { return m.waitForUpgrade(options) } diff --git a/pkg/actions/repo/enable.go b/pkg/actions/repo/enable.go index 4584a2f27c..ac3ae5cd90 100644 --- a/pkg/actions/repo/enable.go +++ b/pkg/actions/repo/enable.go @@ -5,7 +5,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "net/http" "os" "path/filepath" @@ -289,7 +288,7 @@ func writeFluxManifests(baseDir string, manifests map[string][]byte) error { } for fileName, contents := range manifests { fullPath := filepath.Join(baseDir, fileName) - if err := ioutil.WriteFile(fullPath, contents, 0600); err != nil { + if err := os.WriteFile(fullPath, contents, 0600); err != nil { return errors.Wrapf(err, "failed to write Flux manifest file %s", fullPath) } } diff --git a/pkg/actions/repo/enable_test.go b/pkg/actions/repo/enable_test.go index cde88a6798..c086d56ddd 100644 --- a/pkg/actions/repo/enable_test.go +++ b/pkg/actions/repo/enable_test.go @@ -2,7 +2,6 @@ package repo_test import ( - "io/ioutil" "os" "github.com/instrumenta/kubeval/kubeval" @@ -46,7 +45,7 @@ var _ = Describe("Installer", func() { } var err error - tmpDir, err = ioutil.TempDir(os.TempDir(), "getmanifestsandsecrets") + tmpDir, err = os.MkdirTemp(os.TempDir(), "getmanifestsandsecrets") Expect(err).NotTo(HaveOccurred()) }) diff --git a/pkg/addons/assets.go b/pkg/addons/assets.go deleted file mode 100644 index 5baaf0a456..0000000000 --- a/pkg/addons/assets.go +++ /dev/null @@ -1,458 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// assets/efa-device-plugin.yaml (3.084kB) -// assets/neuron-device-plugin.yaml (3.623kB) -// assets/nvidia-device-plugin.yaml (2.369kB) -// assets/vpc-admission-webhook-config.yaml (524B) -// assets/vpc-admission-webhook-csr.yaml (234B) -// assets/vpc-admission-webhook-dep.yaml (1.675kB) -// assets/vpc-admission-webhook.yaml (231B) -// assets/vpc-resource-controller-dep.yaml (1.679kB) -// assets/vpc-resource-controller.yaml (565B) - -package addons - -import ( - "bytes" - "compress/gzip" - "crypto/sha256" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo - digest [sha256.Size]byte -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _efaDevicePluginYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\x4d\x8f\xdb\x36\x10\xbd\xfb\x57\x0c\x1c\xec\xad\x92\xba\xd9\x5d\x20\x50\x4f\xc6\xc6\x2d\x82\x6e\xb6\x41\x9d\xb4\x87\xa2\x87\x31\x39\xb2\x08\x53\x24\xcb\x19\xd9\xeb\xfe\xfa\x82\xb2\xac\x58\xce\x3a\xeb\x5e\x72\x8a\x2f\x16\xc8\xf7\xe6\xcd\x0c\x1f\x3f\xb2\x2c\x9b\x60\x30\x7f\x50\x64\xe3\x5d\x09\x18\x02\x17\x9b\xeb\xc9\xda\x38\x5d\xc2\x5b\xa4\xc6\xbb\x05\xc9\xa4\x21\x41\x8d\x82\xe5\x04\xc0\x61\x43\x25\xe0\x96\x33\xaa\x30\x5b\xbf\xe1\x4c\xd3\xc6\x28\xca\x82\x6d\x57\xc6\x65\xba\x63\x31\x49\x8f\xe5\x80\x8a\x4a\x58\xb7\x4b\xca\x78\xc7\x42\xcd\x84\x03\xa9\x14\x8a\xc9\x92\x12\x1f\xd3\x37\x40\x83\xa2\xea\x07\x5c\x92\xe5\xfd\xc0\x41\xeb\xbc\xd8\x04\xa0\x0d\x1a\x85\x16\x12\x51\x68\xb5\xdb\x13\x65\x17\xa8\x84\xdf\xbd\xb5\xc6\xad\x3e\x75\x80\x09\x80\x50\x13\x2c\x0a\xf5\x6a\x47\x25\xa5\xdf\x2b\xf8\x58\x1b\x06\x74\xce\x0b\x8a\xf1\x0e\x0c\x83\xa6\x10\x49\xa1\x90\xce\xe1\x57\x0a\x02\x35\x45\x82\xca\x47\x58\xa2\x5a\x6f\x31\x6a\x50\xbe\x09\x28\x66\x69\xac\x91\xdd\x10\x6b\x41\x04\xb5\x48\xe0\xb2\x28\x52\xe5\xd1\x91\x10\xe7\xc6\x17\xda\x2b\x2e\x04\x79\xcd\x05\xea\xc6\x38\xc3\x42\x31\x53\xb6\x4d\xff\xc5\xaa\xc5\x88\x4e\x88\x74\xc6\xaa\x26\xdd\xa6\x0a\x32\x15\x8d\x18\x85\x36\x43\xad\xbd\xcb\x82\xd7\x5c\xf4\x52\x9f\xf3\x1d\x9a\x06\xd0\x53\x29\xe6\x68\x43\x8d\xf9\x38\x83\x21\x5a\xf0\xba\x84\xe9\xb4\xa7\xd9\x51\xe7\x5f\x5c\xe7\x0e\x77\x58\xc8\xee\x9b\x62\x9a\x9e\x29\xe5\x5b\x27\x25\x68\xaa\xb0\xb5\xd2\xcf\x8a\xb7\x14\x4f\xf3\xcc\x60\x4d\xbb\x12\xee\xfb\x84\x66\xa9\x3a\xfe\xcd\xd9\xdd\x80\x00\xf0\x21\xf1\x7c\x2c\x61\xfe\x64\x58\xf8\x94\x8c\x5b\xce\xb1\xc1\x7f\xbd\xcb\x95\x6f\x0a\xaa\xf0\x12\x32\x00\x55\x15\x29\x29\xe1\xd1\x2f\xfa\x6e\x0d\x8b\xf7\x1e\xe3\x1a\x24\xb9\x21\x78\x0d\xc8\x80\x70\xe8\x19\xa0\xd6\x99\x77\x3f\xc1\xb6\x26\x07\xe4\x70\x69\x49\xff\x00\x52\xd3\x29\x64\x88\x36\x2c\x06\x44\x4a\x3d\x22\x4e\x1f\xbe\x8d\x8a\xb8\xb3\xd2\x09\x31\x89\x32\xb0\x07\xa9\x51\x52\xe4\x1d\x28\xfc\x1c\x6e\x49\x89\xde\xc7\xd4\x80\x95\x50\x04\x84\x0a\x8d\x6d\x23\xe5\xdf\xde\x81\x21\x1a\x1f\x8d\xec\xee\x2d\x32\x3f\x76\xa6\x99\xee\xf7\x79\xe6\xbc\xa6\x81\x7a\xf0\x19\x56\x95\x71\x46\x76\x47\x4e\xf3\x9a\x66\x5f\x8c\xa6\x22\xe6\x3f\xcf\x80\xdb\x10\x7c\x14\xd2\x60\x1c\x0b\x3a\x45\x5c\x0e\x95\xa5\x5a\xf2\x13\x0b\xcc\xfe\x5c\xcc\xef\x5f\x17\x69\xab\xb3\x14\x9f\x98\xe2\x2f\xad\xd1\x94\xac\x91\xd7\xd2\xd8\x57\xc9\xcf\x87\x58\x59\x3a\x2b\x8e\x7d\x11\xe9\x9f\xd6\x44\xd2\x6f\xdb\x68\xdc\x6a\x31\xb4\xe0\xdd\xca\xf9\x61\x78\xfe\x44\xaa\x4d\x66\x3e\x4e\x77\x5f\xc8\xa2\x3f\xd3\x3e\x52\x6c\x78\x3c\x9d\x3c\xdb\x1d\x72\xf3\xa7\x10\x89\x79\xbc\x19\x8e\x51\x9d\xb3\xa7\x4b\x92\xd3\xbd\x3b\x4a\x7b\xfa\x0c\xf7\xd8\xf3\xef\xdc\xb3\x80\x0d\xda\x96\x9e\x15\xde\x8b\xab\x3b\x97\x5f\xbf\x79\xb2\x18\x57\xf4\x55\x50\x3a\x42\xed\x59\xc4\xea\x56\xbf\x04\x31\x37\xe4\xf2\xd7\xb7\x2f\x48\x75\xa8\x17\x02\xb9\xea\xfa\xe5\x40\xcd\x9d\xbe\x40\xae\xb9\xbb\x00\x14\x6e\x2e\x09\x15\x2f\x12\x8c\x17\x09\xde\xea\x73\xa0\xff\x67\xaa\xe4\xd1\xef\xa6\xfa\x6e\xaa\x33\xa6\xaa\x3d\xcb\x23\xc9\xd6\xc7\x75\x09\x12\xdb\xc3\xb8\xf2\x4e\xd0\x38\x8a\xa3\xeb\xdb\x34\xb8\x4a\xe7\xfd\x15\xe7\x7a\x1d\x73\x52\x31\xbf\xe2\xfc\x8a\x0b\x4a\x97\xcb\xb9\xa7\x43\xb9\xf9\x31\xbf\xc9\x6f\x8e\x9d\x76\xc9\x63\x63\xff\x63\x52\x6d\x77\xdd\x78\x27\xf4\x24\x63\xc7\xa1\xb5\x7e\xfb\x21\x9a\x8d\xb1\xb4\xa2\x39\x2b\xb4\xdd\x9b\xa3\x84\x0a\x2d\x8f\x1b\xa1\x30\x60\xf7\x6a\x33\x5f\xfa\x56\x47\x1f\x4a\xf8\x6b\x3a\x7b\x78\x98\xfe\x7d\x34\xb7\xf1\xb6\x6d\xe8\x7d\x7a\xe0\x9c\x70\xb2\xbe\x84\x73\x69\xa7\x5f\x93\x78\x1f\x50\xea\x12\x8a\x0d\xc6\xc2\x9a\x65\x77\x35\x5b\x92\x62\xc4\x3b\xdc\x47\x7b\xb9\x51\xc7\xbf\xae\x92\x56\xaf\x13\x18\x29\x87\x8b\x24\xff\x0b\x00\x00\xff\xff\xf5\xa9\x92\x60\x0c\x0c\x00\x00") - -func efaDevicePluginYamlBytes() ([]byte, error) { - return bindataRead( - _efaDevicePluginYaml, - "efa-device-plugin.yaml", - ) -} - -func efaDevicePluginYaml() (*asset, error) { - bytes, err := efaDevicePluginYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "efa-device-plugin.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x88, 0xf3, 0x33, 0x57, 0xdb, 0x84, 0xb8, 0x9e, 0x87, 0x8d, 0x16, 0xec, 0x91, 0x23, 0x4, 0xcc, 0x1d, 0x9f, 0x58, 0x2a, 0xa8, 0xee, 0x6b, 0xa7, 0xe9, 0xd6, 0x14, 0xbf, 0x16, 0x57, 0xeb}} - return a, nil -} - -var _neuronDevicePluginYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x56\x4d\x73\xdb\x36\x10\xbd\xeb\x57\xec\x28\xd7\x92\xac\xfb\x35\x19\xf6\xe4\x38\x4a\x26\xd3\xc4\xf1\x44\x4d\x2f\x9d\x4e\x67\x05\x2c\x29\x54\x20\x80\x02\x0b\xd9\xca\xaf\xef\x80\xa4\x68\xd2\x66\x58\xa7\xd3\x9e\xca\x13\x29\xec\xbe\x5d\x3c\xbc\x7d\x50\x96\x65\xab\x83\x32\xb2\x84\x2b\x1d\x03\x93\xff\x60\x35\xad\xd0\xa9\x5f\xc8\x07\x65\x4d\x09\x7e\x87\x22\xc7\xc8\x7b\xeb\xd5\x27\x64\x65\x4d\x7e\x78\x1e\x72\x65\x8b\xe3\xc5\xaa\x21\x46\x89\x8c\xe5\x0a\xc0\x60\x43\x25\x18\x8a\xde\x9a\x4c\xd2\x51\x09\xca\x9c\x8e\xb5\x32\x2b\x1f\x35\x85\x14\x93\x01\x3a\xf5\xda\xdb\xe8\xda\xcf\xf4\x64\xb0\x5e\xb7\xaf\x9e\x82\x8d\x5e\xd0\x68\xc5\x58\x49\xa1\xfd\x3a\x92\xdf\x8d\x16\x6a\xe2\xe1\x5d\xab\x70\xff\x71\x8b\x2c\xf6\x5f\x5e\x88\x8e\x64\x78\xb6\x92\xf0\x84\x4c\xc3\xa7\xfb\x67\xf8\xce\xca\x59\xf4\xe8\xe4\x1c\xfa\x7f\xb3\xc9\x96\xcd\x22\x30\x72\x9c\x6d\x66\x5a\xbd\x6f\x2d\x09\x64\x2c\x87\xe3\x45\xaf\x97\x2d\xf9\x74\xc4\x97\x42\xd8\x68\xf8\xa9\x4a\xe8\x16\x83\x43\x41\x25\x1c\xe2\x8e\xb2\x70\x0a\x4c\xcd\x6a\x56\x88\x2f\x94\x91\xca\xd4\xff\xba\x1e\x3f\xdb\x85\xb7\x9a\x3e\x50\x95\xd2\xcf\xd4\x2e\x54\x5c\x01\x3c\x9e\x9d\xc5\xc2\x21\xee\xfe\x20\xc1\xfd\x2c\xcc\x12\x99\xd8\x5f\x6c\x7d\x91\xc2\x67\xb0\x67\x76\xa1\x2c\x8a\xb4\xe2\x0d\x31\xb5\xdc\x48\x2b\x42\x21\xac\x11\xe4\x38\x14\x74\xc7\x64\x64\x76\x1f\x52\x08\xdb\xb8\xc8\x94\x05\xb6\x1e\x6b\xca\x0c\x71\x31\x29\x1c\x8a\xc9\x29\xa0\x73\xa1\x18\xb4\xf0\x12\xa9\xb1\x66\x4b\x4f\x95\x41\x26\xdb\x84\xd0\x0a\xfc\x33\xbb\x09\x8e\x44\x42\x09\xa4\x49\xb0\xf5\x9d\x4e\x9b\xa4\xd1\xb7\xb8\x23\x3d\x08\x77\xa9\x4c\xd2\x79\x27\xe4\x2d\x7b\x64\xaa\x4f\x5d\x16\x9f\x1c\x95\xf0\xc1\x6a\xad\x4c\xfd\xf1\x3c\x84\x4c\x8d\xd3\xc8\xd4\x97\x1a\x6d\x25\x3d\x68\x8c\xe5\xf6\xf8\x87\xd2\x00\x41\xec\x49\x46\x4d\x3e\x47\xed\xf6\x98\x4f\x59\x17\x5e\xb1\x12\xa8\x33\x67\x65\x79\x9e\x4c\x00\x3d\xe9\xff\xef\x77\x00\x70\x26\xa3\x7d\x9f\xe8\x65\x41\x26\x00\x6c\x35\xf9\x87\x2d\x67\x70\xa0\x53\x09\x57\x7d\x6f\x97\x52\x5a\x13\xde\x1b\x7d\x1a\x22\x00\xac\x4b\x79\xd6\x97\xb0\xb9\x53\xa1\x77\xc6\x51\x32\xde\x86\x1c\x1b\xfc\x64\x4d\x2e\x6c\x53\x74\x2d\x3c\x25\x1f\x80\xaa\x8a\x04\x97\x70\x6d\xb7\x3d\x77\xfd\xe2\x33\x78\x87\xfe\x00\xbc\x57\x21\xf9\x25\x60\x00\x84\x33\x83\x80\x52\x66\xd6\xfc\x08\xb7\x7b\x32\x40\x06\x77\x9a\xe4\x57\xc0\x7b\x7a\x18\x32\xa0\x0d\x47\x93\xbc\x90\xfc\x91\xc2\xbd\x29\x42\x65\xfd\xc3\xc4\xd6\xa4\x21\x58\xe0\x3d\x72\x42\x3e\x81\xc0\x7b\xb8\x1d\xa5\xf4\x1e\x53\x02\x56\x4c\x1e\x10\x2a\x54\x3a\x7a\xca\x87\xb8\x2d\xd1\xd2\x0c\x32\x86\x43\x28\x50\x36\xca\xa8\xe4\x19\x99\xe8\xbc\xa3\xa8\x23\x7a\x34\x4c\x24\xb3\xbe\x8a\x32\x75\x36\x28\x08\xd3\x31\x25\x1d\x85\xa2\x2f\xe5\xbc\xb2\x5e\xf1\xe9\x4a\x63\x08\xd7\xad\x84\xd6\xdd\xec\x64\xc9\xe9\x87\xd4\xb3\xea\xb0\xaa\x94\x51\x7c\x1a\xe9\xce\x4a\xba\x7c\xf4\x6b\xba\x3b\xfe\x8c\xca\x93\x7c\x19\xbd\x32\xf5\x76\xe8\xe6\x4d\x6d\xec\xf0\xf3\xe6\x8e\x44\x4c\xd2\x1a\x67\x76\x98\xdb\x7e\x64\x7f\x26\xdf\x84\xe9\x72\x52\x50\x3b\xc3\x9b\x3b\xe7\x29\x84\xa9\x34\xc7\x51\xad\xce\xd6\x3b\xe2\x87\x43\xa5\x4c\x60\x34\x82\xb2\x34\xc4\xeb\x99\xdc\xb1\xfc\xde\x98\xd9\x80\x23\xea\x48\xb3\x85\xbb\xe2\xca\x54\x17\xf9\x9d\x46\x5f\xd3\x72\xcc\x37\x4f\x09\xfa\xe1\x49\x48\xdf\xcd\x46\x7d\x19\x5d\x89\xfd\xff\x25\x5d\xc2\x1a\x46\x65\xc8\x4f\x8c\x4e\x35\x58\xa7\xb1\x70\x71\xa7\x95\xc8\x49\xf8\x1c\x6f\x43\x6f\x57\xc5\x9c\x71\x96\x17\xf9\xf7\xf9\xb7\xf9\xd7\x63\xa2\x5a\x94\x9b\xa8\xf5\x8d\xd5\x4a\x9c\x4a\xb8\xd4\xb7\x78\x1a\x7b\x5a\x67\xe0\x87\xe7\x21\x9b\x35\x71\xc1\x7e\x6c\x80\xe6\x38\x65\x32\xeb\xf3\x7f\xfa\xf8\x62\x73\xf5\xfe\xfa\xd5\x9b\xd7\xab\x19\xfa\x4b\x28\x88\xc5\xc8\x52\xda\x57\x4d\x9c\x0b\x6b\xaa\x59\xc0\xeb\xf7\x2f\x37\xbf\x5f\x5f\xbe\xdb\xcc\xe1\xbd\xf2\xb6\x79\x7c\xa2\x95\x22\x2d\xfb\x7f\x40\xb3\x6b\x37\xc8\xfb\xb2\xbd\x8f\xf2\x24\xb6\xe4\x3b\xa3\xd0\x40\x22\xb6\x9e\x64\x0d\xd3\x1d\x4f\x51\x50\x6b\x7b\x7b\xe3\xd5\x51\x69\xaa\x69\x13\x04\xea\xf6\x6e\x2a\xa1\x42\x1d\xa6\xe7\x2d\xd0\xe1\x4e\x69\xc5\xea\xb1\xee\xa4\xb7\xae\x84\x5f\xd7\x97\x6f\xdf\xae\x7f\x1b\xad\x1d\xad\x8e\x0d\xbd\x4b\xb7\x62\x98\x67\x78\xee\x8e\x3c\x3f\x4d\xca\xeb\x76\x57\x1c\xd1\x17\x5a\xed\xce\x0c\x3f\xf8\x27\x34\x0b\xad\x4c\x85\x59\x83\x6e\x01\xd5\xc7\x73\xcd\xae\xd3\x89\x54\x97\x1b\xdc\xdb\xd0\xa1\x4c\xe0\xdd\x17\x75\xbb\xd0\xe9\x22\x7c\x6a\xfb\xaf\x00\x00\x00\xff\xff\xb8\x35\xe9\xa2\x27\x0e\x00\x00") - -func neuronDevicePluginYamlBytes() ([]byte, error) { - return bindataRead( - _neuronDevicePluginYaml, - "neuron-device-plugin.yaml", - ) -} - -func neuronDevicePluginYaml() (*asset, error) { - bytes, err := neuronDevicePluginYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "neuron-device-plugin.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfd, 0x74, 0x40, 0xab, 0xb9, 0x89, 0x7d, 0xb8, 0x93, 0xb5, 0xea, 0x8f, 0x3d, 0x97, 0x97, 0xa2, 0x7c, 0xd4, 0xde, 0xb3, 0x44, 0xa0, 0xd3, 0xf9, 0xa4, 0xde, 0x3b, 0x6, 0xdc, 0xc6, 0x8d, 0x8c}} - return a, nil -} - -var _nvidiaDevicePluginYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x55\x41\x8f\xdb\x36\x13\xbd\xeb\x57\x3c\xd8\x97\x04\x58\x49\x9b\x9c\xbe\x28\xf8\x0e\xee\xee\x16\x35\xb2\xb1\x83\xf5\x26\x41\x50\xf4\x30\x26\xc7\x12\x61\x8a\x64\x49\xca\x5e\xfd\xfb\x82\xb2\xd6\x6b\xa5\x40\x93\x53\x81\xea\x62\x43\x7a\x33\xf3\xe6\xbd\x19\x72\x8e\x1b\xeb\x7a\xaf\xea\x26\xe2\x95\x78\x8d\xb7\xd7\x6f\xde\x5d\x61\xf5\x65\x79\xbb\x5c\xe0\x66\xfd\xf0\x69\xfd\xb0\x78\x5c\xae\x57\x05\xb0\xd0\x1a\x03\x30\xc0\x73\x60\x7f\x60\x59\x64\xf3\x6c\x8e\x7b\x25\xd8\x04\x96\xe8\x8c\x64\x8f\xd8\x30\x16\x8e\x44\xc3\xcf\x5f\xae\xf0\x85\x7d\x50\xd6\xe0\x6d\x71\x8d\x57\x09\x30\x1b\x3f\xcd\x5e\xbf\xcf\xe6\xe8\x6d\x87\x96\x7a\x18\x1b\xd1\x05\x46\x6c\x54\xc0\x4e\x69\x06\x3f\x09\x76\x11\xca\x40\xd8\xd6\x69\x45\x46\x30\x8e\x2a\x36\x43\x99\x31\x49\x91\xcd\xf1\x6d\x4c\x61\xb7\x91\x94\x01\x41\x58\xd7\xc3\xee\x2e\x71\xa0\x38\x10\x4e\x4f\x13\xa3\xab\xca\xf2\x78\x3c\x16\x34\x90\x2d\xac\xaf\x4b\x7d\x02\x86\xf2\x7e\x79\x73\xb7\xda\xdc\xe5\x6f\x8b\xeb\x21\xe4\xb3\xd1\x1c\x52\xe3\x7f\x76\xca\xb3\xc4\xb6\x07\x39\xa7\x95\xa0\xad\x66\x68\x3a\xc2\x7a\x50\xed\x99\x25\xa2\x4d\x7c\x8f\x5e\x45\x65\xea\x2b\x04\xbb\x8b\x47\xf2\x9c\xcd\x21\x55\x88\x5e\x6d\xbb\x38\x11\xeb\x99\x9d\x0a\x13\x80\x35\x20\x83\xd9\x62\x83\xe5\x66\x86\x5f\x16\x9b\xe5\xe6\x2a\x9b\xe3\xeb\xf2\xf1\xb7\xf5\xe7\x47\x7c\x5d\x3c\x3c\x2c\x56\x8f\xcb\xbb\x0d\xd6\x0f\xb8\x59\xaf\x6e\x97\xc9\xa8\x0d\xd6\xbf\x62\xb1\xfa\x86\x0f\xcb\xd5\xed\x15\x58\xc5\x86\x3d\xf8\xc9\xf9\xc4\xdf\x7a\xa8\x24\xe3\x60\x1d\x36\xcc\x13\x02\x3b\x7b\x22\x14\x1c\x0b\xb5\x53\x02\x9a\x4c\xdd\x51\xcd\xa8\xed\x81\xbd\x51\xa6\x86\x63\xdf\xaa\x90\xcc\x0c\x20\x23\xb3\x39\xb4\x6a\x55\xa4\x38\xbc\xf9\x5b\x53\x45\x96\x91\x53\xa3\xfd\x55\xd2\x2c\x94\x87\x37\xd9\x5e\x19\x59\xe1\x96\xb8\xb5\x66\xc3\x31\x6b\x39\x92\xa4\x48\x55\x06\x18\x6a\xb9\x82\x39\x28\xa9\x28\x97\x7c\x50\x82\x73\xa7\xbb\x5a\x99\x5c\x0e\x01\x81\xe3\x08\x0b\x8e\x04\x57\xd8\x77\x5b\xce\x43\x1f\x22\xb7\x59\xe2\x9e\xb2\x04\xd6\x2c\xa2\xf5\xe9\x3f\xd0\x52\x14\xcd\x3d\x6d\x59\x87\xd3\x8b\x7f\x2e\x13\x32\xa0\x73\x92\x22\x6f\xa2\xa7\xc8\x75\x7f\x8a\x8a\xbd\xe3\x0a\x0f\x56\x6b\x65\xea\xcf\x03\x20\x03\x22\xb7\x4e\x53\xe4\xb1\xd4\x45\x2b\xe9\x99\xe3\x31\x4d\x33\x19\x63\x4f\x2a\x0d\x3e\xb3\xf3\x2c\x28\xb2\x2c\xf0\x21\x0d\x78\xc3\xfe\xa4\xff\x96\xc4\xfe\x48\x5e\x0e\xf3\x4e\x51\x6d\x95\x56\xb1\x3f\xe7\x4a\x96\xa5\xd1\x0d\x55\x59\xa6\xb6\xbd\xe1\xc8\xa1\x50\xb6\x94\x56\x84\x32\x52\xd8\x87\x92\x64\xab\x8c\x0a\x91\x7d\x2e\x74\x97\x7e\xcb\xba\x23\x4f\x26\x32\xcb\x3c\x88\x86\x65\x97\x3a\xc8\x45\x9a\x51\x41\x3a\x27\x29\xad\xc9\x9d\x95\xa1\x1c\x4b\xbd\xf0\x3d\x2b\x06\x8c\xa1\xec\x0b\xd2\xae\xa1\x62\xca\xe0\x9c\xcd\x59\x59\x61\x36\x1b\xc3\xf4\x44\xf6\x1f\x0b\x0f\x3c\x7b\x38\x48\x6e\x35\xfb\x29\x8f\x51\xd1\x97\x2f\xff\x0d\x45\x73\xec\xb9\xaf\x70\x33\x22\x16\x09\x10\xd6\x46\xf7\x67\x65\xac\x4b\x0d\x59\x5f\xe1\xee\x49\x85\x18\xa6\x81\x27\xc5\x0a\x61\xdb\xb2\x76\xdd\x8f\x82\x00\xde\xed\x58\xc4\x0a\x2b\xbb\x19\x6d\x3b\xf7\xfc\x91\xfc\xfe\x74\xc8\x3a\x2b\x41\x21\x1d\x97\x23\x2d\x90\x94\xb9\x35\xef\x71\x6c\xd8\x80\x4d\x3a\xdf\xe4\xd5\xb0\xd2\xdf\x41\xce\xd9\xce\x53\xf1\x7c\x2f\x0c\x17\x84\xed\xbc\xe0\x30\x38\xf0\x5d\x60\x2a\x1a\x10\x2c\x62\x43\x31\x65\xee\x21\xe8\x25\xdd\x96\x53\xf8\x98\x53\x82\x76\x91\x3d\x08\x3b\x52\xba\xf3\x5c\xfc\xfb\xc6\x39\xaf\xac\x57\xb1\xbf\xd1\x14\xc2\x6a\x98\xde\xd9\xe9\xb4\xc9\x8d\x95\x7c\x0e\x7d\x1e\x78\x61\x4d\xba\x83\xd8\x9f\x27\x36\x87\x6a\xa9\x1e\xa6\x5e\xf8\xc4\xf0\xe4\x65\xb9\xff\x5f\x98\x6e\x40\x75\xb8\x2e\xde\x15\xd7\x3f\xb3\x2b\x22\xfa\x33\x8c\x7c\x1d\x2a\xfc\x3e\xcb\xf3\xa4\x52\x6e\x4d\xae\x8c\x8a\x39\x7b\x6f\xfd\xff\x77\xa4\x03\xcf\xfe\x78\x59\x62\x16\xdd\xd0\x8e\x35\x91\x9f\xe2\xcb\x62\x02\xa4\xb5\x3d\x7e\xf2\xea\xa0\x34\xd7\x7c\x17\x04\xe9\x61\xc1\x2a\x0c\x49\x2e\x90\x82\x1c\x0d\x8b\xa4\x38\x5c\x66\x00\xa4\xb7\x2e\x71\x59\xdc\xdf\x5f\x14\x3d\x58\xdd\xb5\xfc\xd1\x76\x26\x4e\xf0\xf9\xd8\xe2\xa4\xb7\x49\xbe\x36\xc5\x7c\xa2\xd8\x54\x28\x0f\xe4\x4b\xad\xb6\x83\xdd\x9a\x63\x39\x89\x7a\x9e\xfc\x53\xa9\x8b\x2a\x3f\xaa\xd1\xd8\x70\x2a\x30\xa9\xeb\x7e\xaa\x64\xf6\x57\x00\x00\x00\xff\xff\xaf\x6c\xf5\xd9\x41\x09\x00\x00") - -func nvidiaDevicePluginYamlBytes() ([]byte, error) { - return bindataRead( - _nvidiaDevicePluginYaml, - "nvidia-device-plugin.yaml", - ) -} - -func nvidiaDevicePluginYaml() (*asset, error) { - bytes, err := nvidiaDevicePluginYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "nvidia-device-plugin.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x34, 0xa1, 0xba, 0x6, 0x98, 0xf5, 0x96, 0x4d, 0x79, 0xa1, 0x9a, 0x47, 0x9, 0x3e, 0x2d, 0x8e, 0x64, 0x45, 0xf5, 0x9d, 0xcf, 0x3f, 0xf6, 0x8d, 0x97, 0x94, 0xa3, 0x59, 0xec, 0x4a, 0x29}} - return a, nil -} - -var _vpcAdmissionWebhookConfigYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x91\x4f\x6b\xf3\x30\x0c\xc6\xef\xf9\x14\x22\xf7\xa4\xf4\xf6\xe2\xdb\x4b\x29\x63\x87\xc1\x18\x63\x3b\x8c\x1d\x14\x47\x4d\x45\x62\xcb\x58\x76\x4a\xf7\xe9\x47\xfe\xb4\xac\xb0\xd5\x17\xdb\x7a\xa4\xdf\x63\xc9\x18\xf8\x8d\xa2\xb2\x78\x03\xd8\x3a\xd6\xe9\x18\xa9\x63\x4d\x11\x13\x8b\xaf\xfb\x7f\x5a\xb3\x6c\xc6\x6d\x43\x09\xb7\x45\xcf\xbe\x35\xf0\x94\x13\x26\xf6\xdd\x3b\x35\x47\x91\x7e\x27\xfe\xc0\x5d\x5e\x2a\x0a\x47\x09\x5b\x4c\x68\x0a\x00\x8f\x8e\x0c\x8c\xc1\x56\x57\x7a\x75\x5a\x8a\x2a\x7b\xe8\xd6\x0c\x0d\x68\xc9\x40\x9f\x1b\xaa\xf4\xac\x89\x5c\x01\x30\x60\x43\x83\x4e\x10\x00\x0c\xe1\x0f\x4a\xb1\xee\x73\x62\x75\xcf\xaf\x46\x87\x5f\xe2\xf1\xa4\xb5\x15\x37\x63\xed\xc0\xe4\xd3\xf2\xfa\xc5\x08\x40\x29\x8e\x6c\xe9\x72\xbd\xdb\xc2\x4d\xce\xaf\x4d\x2c\x2b\x60\x3a\x1a\x28\x37\x6e\x1a\x1b\x95\x73\x3c\xe6\x81\xf4\xe2\x52\x81\x04\x5a\xc6\xa7\x06\x3e\xa0\xdc\xbd\xec\xff\xbf\xee\x4b\xf8\xbc\x32\x30\xf0\x43\x94\x1c\x26\xbd\x2c\x6f\xe2\xeb\x0f\xce\xca\xb8\xfd\xa1\x45\x52\xc9\xd1\xd2\xac\x04\x69\x75\xd5\x0e\xc8\x43\x8e\xf4\x2c\x03\xdb\xb3\x81\xc7\xce\x4b\xa4\xe2\x3b\x00\x00\xff\xff\x49\xee\x9e\x02\x0c\x02\x00\x00") - -func vpcAdmissionWebhookConfigYamlBytes() ([]byte, error) { - return bindataRead( - _vpcAdmissionWebhookConfigYaml, - "vpc-admission-webhook-config.yaml", - ) -} - -func vpcAdmissionWebhookConfigYaml() (*asset, error) { - bytes, err := vpcAdmissionWebhookConfigYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "vpc-admission-webhook-config.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7d, 0x11, 0x23, 0x17, 0x2f, 0xdc, 0x4e, 0x18, 0xaa, 0xc8, 0x66, 0xee, 0xf3, 0xc1, 0x85, 0x63, 0xb1, 0xe3, 0x53, 0x57, 0x80, 0x96, 0xe6, 0x54, 0x26, 0x46, 0x6b, 0x3f, 0x17, 0x20, 0x31, 0x8}} - return a, nil -} - -var _vpcAdmissionWebhookCsrYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x44\x8d\x4b\x4e\xc4\x30\x10\x44\xf7\x3e\x45\x5f\x20\x41\xb3\x43\xde\x72\x03\x90\xd8\x77\xec\xc2\x69\x19\x7f\x70\xb7\x83\xe6\xf6\x28\x13\xa4\xd9\x95\xaa\x9e\x5e\x71\x97\x4f\x0c\x95\x56\x3d\x05\x0c\x93\x2f\x09\x6c\xd0\x35\xbf\xea\x2a\xed\xe5\xb8\x6d\x30\xbe\xb9\x2c\x35\x7a\x7a\x7b\x12\x1f\x92\xaa\xd4\xf4\x8e\x9f\x09\x35\x57\x60\x1c\xd9\xd8\x3b\xa2\xca\x05\x9e\x8e\x1e\x16\x8e\x45\xf4\x94\x2f\xbf\xd8\xf6\xd6\xf2\x9a\xe7\x86\x45\xef\x6a\x28\x4e\x3b\xc2\xc9\xa7\xd1\x66\xd7\x33\x2d\x74\x4d\x9e\xa7\xed\xa8\xf6\x78\x8a\x8e\x68\x2a\x27\xfc\x23\x51\x92\x18\x7f\x93\x4a\xaa\x6c\x73\xe0\xd1\x66\xdc\x09\x35\x48\xdf\x31\x0a\xaa\x5d\x36\x8c\x03\x83\x4e\x9b\xfb\x0b\x00\x00\xff\xff\xf1\x7d\x42\x97\xea\x00\x00\x00") - -func vpcAdmissionWebhookCsrYamlBytes() ([]byte, error) { - return bindataRead( - _vpcAdmissionWebhookCsrYaml, - "vpc-admission-webhook-csr.yaml", - ) -} - -func vpcAdmissionWebhookCsrYaml() (*asset, error) { - bytes, err := vpcAdmissionWebhookCsrYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "vpc-admission-webhook-csr.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x56, 0xf4, 0x54, 0x57, 0xf8, 0xbd, 0x8a, 0x1a, 0x67, 0xb2, 0x29, 0x18, 0xe2, 0x44, 0x8a, 0xc2, 0x7f, 0x44, 0x26, 0x4c, 0x52, 0xe0, 0x70, 0xe0, 0xc8, 0x5a, 0x74, 0x76, 0x2, 0xcd, 0x3e, 0xa}} - return a, nil -} - -var _vpcAdmissionWebhookDepYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x54\xc1\x6e\xdb\x3a\x10\xbc\xfb\x2b\xf6\x92\x97\x93\xa5\x97\xa0\xc8\x81\x40\x0a\x04\x4d\x0a\x04\x6d\x93\xa0\x29\x7a\x5f\x53\x13\x99\x10\x45\xb2\xe4\x4a\x8e\xfe\xbe\xa0\xad\xa4\xb6\x1c\x37\x39\x14\xad\x0e\x3e\xec\xec\xcc\x2c\x87\x5e\x72\x30\xdf\x11\x93\xf1\x4e\x11\x87\x90\xca\xfe\x64\xd6\x18\x57\x29\xba\x44\xb0\x7e\x68\xe1\x64\xd6\x42\xb8\x62\x61\x35\x23\x72\xdc\x42\x51\x1f\xf4\x9c\xab\xd6\xa4\xcc\x9c\xaf\xb0\x58\x7a\xdf\x8c\x68\x0a\xac\xa1\xa8\xe9\x16\x98\xa7\x21\x09\xda\x19\x91\xe5\x05\x6c\xca\x02\x94\x7d\x0e\x29\xa4\x00\x9d\x9b\x22\x82\x35\x9a\x93\xa2\x93\x19\x51\x92\xc8\x82\x7a\xd8\xd0\x65\x08\x50\xf4\x15\x3a\x82\x05\x19\x86\x85\x16\x1f\x37\x70\xcb\xa2\x97\x9f\xb7\xec\x7e\x6b\x48\x24\x68\x83\x65\xc1\xc8\xde\x3a\x6a\xfe\xec\x8e\xd0\x2b\x52\x44\x4f\xf3\xe7\x4f\x7b\x27\x6c\x1c\xe2\x16\x7d\xfe\x4a\x7e\xcf\x36\xb1\xde\x62\x6d\x98\x73\xb1\xe9\x03\xa2\x7c\x34\x16\xe7\x25\x44\x97\x23\xaf\xd4\x88\x92\xd6\xbf\x45\x58\xa7\x3d\xa5\x7d\xc2\x70\x88\xd5\x60\x78\x89\x74\x7b\xbf\x8e\xf0\x7e\x8c\xf6\xb6\x47\x8c\xa6\xc2\xf9\xca\xb8\xca\xaf\xd2\xb4\x9d\x6d\xf2\xd6\xd7\xe2\x93\x54\x88\x71\x0a\xf7\xe7\xef\x26\xa5\xd3\xf7\xff\x9d\x6c\x95\x4c\xcb\x35\x14\x1d\x1f\xa5\xa2\x6a\x62\x01\x1d\x8b\xa3\x54\x1c\xa5\x12\x4d\x2a\x5f\x0c\x4b\xf5\xff\x17\xa7\xc5\xd9\xf1\x54\xe4\xae\xb3\xf6\xce\x5b\xa3\x07\x45\x17\x76\xc5\xc3\xf6\xac\xbd\xb7\x5d\x8b\x2f\xbe\x73\xb2\x17\xef\xe6\x62\x46\xf5\xf9\x3a\x9c\x9d\x0e\xa2\x36\xf3\xee\x58\x96\x8a\xf6\x83\x9c\xf4\x46\x70\x75\xeb\xec\xa0\x48\x62\x87\x11\x5c\xfa\x24\x37\x90\x95\x8f\xcd\x4e\x9d\x1f\x1e\x8c\x33\x32\xfc\x1a\xc9\xf9\x0a\x17\x7b\xd5\x2c\xfb\xa3\x33\x11\xd5\x65\x17\x8d\xab\xef\xf5\x12\x55\x67\x8d\xab\xaf\x6b\xe7\x9f\xcb\x57\x8f\xd0\x9d\xe4\x95\xde\x19\x2a\x6b\x3e\xdd\xe7\x37\xc4\x76\x2f\x81\xf5\xe6\x5c\x3d\x86\x88\x75\xd2\x13\x3c\x77\x34\x18\x14\x2d\x20\x5c\xe4\xed\x8e\x0e\x82\x54\x18\x5f\xfa\xe9\xf1\x89\x7c\x40\xe4\xbc\x94\x74\xed\xf6\xc0\x9e\x6d\x87\x3d\xfd\xec\x60\x8d\xeb\x1e\xdf\xec\xcb\x51\x2f\xff\x94\x33\xb7\xd5\xd9\xf4\x5f\xfa\xc6\x44\xfe\x41\x18\x7f\x27\x87\xcd\xbe\xbc\xf0\x7e\x1d\x5a\x93\x94\x5f\x65\xd9\x95\xdd\xd4\x6e\x0e\xbf\x7b\xa3\xca\xcf\x00\x00\x00\xff\xff\x52\xd4\x1b\x58\x8b\x06\x00\x00") - -func vpcAdmissionWebhookDepYamlBytes() ([]byte, error) { - return bindataRead( - _vpcAdmissionWebhookDepYaml, - "vpc-admission-webhook-dep.yaml", - ) -} - -func vpcAdmissionWebhookDepYaml() (*asset, error) { - bytes, err := vpcAdmissionWebhookDepYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "vpc-admission-webhook-dep.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0x48, 0x71, 0x63, 0xbb, 0x59, 0xcc, 0xd5, 0x1b, 0x30, 0xc7, 0x1c, 0x5e, 0xf2, 0x65, 0x72, 0xff, 0xa9, 0x4d, 0x14, 0x6c, 0xce, 0x49, 0xa8, 0x6f, 0x4d, 0x8e, 0x19, 0xf7, 0xee, 0xfa, 0x8c}} - return a, nil -} - -var _vpcAdmissionWebhookYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x8c\x31\xae\xc2\x40\x0c\x05\xfb\x3d\x85\x2f\xe0\xe2\xeb\xa7\xf2\x29\x90\x90\xe8\x9d\xcd\x13\xac\x92\xcd\x5a\x6b\x13\xc4\xed\x51\x22\x0a\x1a\x44\x67\xf9\xcd\x0c\x33\x27\xb5\x72\x41\xf7\xd2\x56\xa1\xed\x2f\xcd\x65\x9d\x84\xce\xe8\x5b\xc9\x48\x15\xa1\x93\x86\x4a\x22\x5a\xb5\x42\x68\xb3\xcc\x3a\xd5\xe2\xbb\xc1\x0f\x8c\xb7\xd6\xe6\xf7\xea\xa6\x19\x42\xf3\x7d\x04\xfb\xd3\x03\x35\x11\x2d\x3a\x62\xf1\x3d\x40\xa4\x66\xdf\x0a\x6e\xc8\x3b\x64\xad\xc7\x41\xf3\x71\x0a\x0d\xc3\xff\xe1\x86\xf6\x2b\xe2\xf4\xf1\x73\x2c\xc8\xd1\xfa\xcf\xf6\x2b\x00\x00\xff\xff\xbc\xa7\x78\x3e\xe7\x00\x00\x00") - -func vpcAdmissionWebhookYamlBytes() ([]byte, error) { - return bindataRead( - _vpcAdmissionWebhookYaml, - "vpc-admission-webhook.yaml", - ) -} - -func vpcAdmissionWebhookYaml() (*asset, error) { - bytes, err := vpcAdmissionWebhookYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "vpc-admission-webhook.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc0, 0x14, 0x3e, 0x68, 0x1c, 0x57, 0x26, 0x7e, 0x3b, 0xab, 0xf1, 0x55, 0x21, 0x61, 0xc3, 0xe1, 0xaf, 0x46, 0xb6, 0xf7, 0xdd, 0x11, 0x29, 0x41, 0x64, 0x57, 0xc8, 0xd4, 0xea, 0x97, 0xba, 0xff}} - return a, nil -} - -var _vpcResourceControllerDepYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x94\x4f\x6f\xdb\x3c\x0c\xc6\xef\xfe\x14\xbc\x14\x3d\xd9\x49\xfa\xbe\x6b\x31\x01\x3b\x14\x6b\xb1\x15\x18\x86\x00\x0d\x76\x67\x24\x26\x16\x2c\x4b\x1a\x45\x3b\xf1\x3e\xfd\xa0\xb5\xf9\xe3\xa6\x5b\x8b\x61\xc3\x7c\x32\x9e\x9f\xc4\x87\x24\x44\x96\x65\x59\x60\xb4\x5f\x88\x93\x0d\x5e\x01\xc6\x98\x26\xfd\xac\x68\xac\x37\x0a\x6e\x28\xba\x30\xb4\xe4\xa5\x68\x49\xd0\xa0\xa0\x2a\x00\x3c\xb6\xa4\xa0\x8f\xba\x64\x4a\xa1\x63\x4d\xa5\x0e\x5e\x38\x38\x47\xfc\xc8\x53\x44\x4d\x0a\x9a\x6e\x49\x65\x1a\x92\x50\x5b\xa4\x48\x3a\x5f\x67\x8a\xce\x6a\x4c\x0a\x66\x05\x40\x22\x47\x5a\x02\x67\x02\xd0\xa2\xe8\xfa\x13\x2e\xc9\xa5\x07\x01\x72\x4a\xbf\x32\xcb\x9f\x58\x62\x05\x4b\xd4\x0d\x79\xb3\xd3\x18\x75\xa3\x20\x09\x2e\x1d\x15\x00\x42\x6d\x74\x28\xf4\xe8\x73\x54\x4e\xfe\xdc\xc8\xf2\x55\xa6\xcf\xdb\x9e\x1a\x03\xec\x0a\xff\xf1\x4f\xdc\x5b\x4d\xd7\x5a\x87\xce\xcb\x4b\x1e\x59\x40\xeb\x89\xf7\xa9\x95\xa0\x43\xdb\xa2\x37\x87\x5c\x4b\x98\xbc\x94\x29\xf2\x3a\x1d\x5f\x28\x93\x18\x62\x96\x9a\x29\xd5\xc1\x99\x77\xd6\xaf\xc2\x9e\xdb\x16\xd7\xa4\xe0\xfc\x2c\x55\xa6\xe1\x8a\x34\x57\x67\xa9\x3a\x4b\x13\x6a\xd2\x64\x63\xbd\x09\x9b\x54\xfe\xc4\x52\xf5\xd3\xea\xa2\xba\x3c\x1f\x07\x9b\x77\xce\xcd\x83\xb3\x7a\x50\x70\xed\x36\x38\xa4\x3d\x77\xb6\x27\x4f\x29\xcd\x39\x2c\xe9\x90\x23\xc0\x0a\xad\xeb\x98\x16\xbb\x1c\x15\xbc\x39\xa2\xb5\x48\xfc\x40\x72\x7c\x01\xa0\x0e\x49\x14\xcc\x2e\xae\xaa\x69\x35\xad\x66\x23\x16\x51\x6a\x05\x93\x9a\xd0\x49\xfd\x6d\x8c\x02\x8b\x82\xcb\xd9\xd5\xd5\xdb\x91\x9e\x74\x4d\xf9\xa5\x7f\x5c\x2c\xe6\x47\xc0\x7a\x2b\x16\xdd\x0d\x39\x1c\xee\x49\x07\x6f\x92\x82\xff\xa6\x47\x27\x22\xb1\x0d\xe6\x79\x26\xb6\xa5\xd0\xc9\x1e\x1e\x8a\x7a\x69\xac\x76\x0f\x48\x77\x6c\x65\x78\x1f\xbc\xd0\x76\xd4\x80\xc8\xb6\xb7\x8e\xd6\x64\x14\x08\x77\x54\x1c\xba\xf2\x99\x64\x13\xb8\x19\xe9\xb8\x5a\xe5\x52\x86\x43\x08\x1f\x0c\x5d\x9f\xa8\x79\x62\xbf\x76\x96\xc9\xdc\x74\x6c\xfd\xfa\x5e\xd7\x64\x3a\x67\xfd\xfa\x6e\xed\xc3\x5e\xbe\xdd\x92\xee\x24\x6f\x91\x51\x13\x73\xcc\xfb\xc7\x19\x5f\x10\xb7\x69\x8c\xcb\x87\x91\xbf\xdd\x46\xa6\x94\x77\xd0\x13\x9e\x4f\x34\x34\x28\x58\x92\x60\x95\xd7\x09\x7b\x12\x4a\x95\x0d\x93\x90\x9e\x1c\x05\x08\x91\x18\xf3\x36\x81\x3b\x7f\x02\x7b\x74\x1d\x9d\xc4\xcf\x0e\xce\xfa\x6e\xfb\x6a\x5f\x64\x5d\xff\x29\x67\x6c\xcd\xe5\xff\xbf\xd7\x91\x7f\xd0\x8c\xbf\xdd\x87\xef\x01\x00\x00\xff\xff\xec\x16\x91\xef\x8f\x06\x00\x00") - -func vpcResourceControllerDepYamlBytes() ([]byte, error) { - return bindataRead( - _vpcResourceControllerDepYaml, - "vpc-resource-controller-dep.yaml", - ) -} - -func vpcResourceControllerDepYaml() (*asset, error) { - bytes, err := vpcResourceControllerDepYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "vpc-resource-controller-dep.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x0, 0xbf, 0x11, 0xf3, 0x5f, 0x76, 0xa3, 0xb2, 0x2e, 0x2f, 0x80, 0xa7, 0x86, 0xae, 0x3f, 0xb7, 0x7e, 0x76, 0xed, 0x68, 0xfe, 0x23, 0x5c, 0x76, 0xb9, 0xd0, 0xd8, 0xed, 0xf9, 0x9d, 0x96, 0x93}} - return a, nil -} - -var _vpcResourceControllerYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x90\x31\x4f\x33\x31\x0c\x86\xf7\xfc\x8a\xa8\x7b\x5a\x7d\xdb\xa7\xdb\x80\x81\xbd\x48\xec\x3e\x9f\xdb\x9a\xe6\xe2\xc8\x76\x0e\xc1\xaf\x47\x77\xd7\xc2\x80\x44\x85\x98\xf2\xc4\xf6\x6b\x4b\x4f\x4a\x29\x40\xe5\x67\x52\x63\x29\x5d\xd4\x1e\x70\x0b\xcd\x4f\xa2\xfc\x0e\xce\x52\xb6\xe7\xff\xb6\x65\xd9\x4d\xff\xc2\x99\xcb\xd0\xc5\x87\xdc\xcc\x49\xf7\x92\x29\x8c\xe4\x30\x80\x43\x17\x62\x2c\x30\x52\x17\xa7\x8a\x49\xc9\xa4\x29\x52\x42\x29\xae\x92\x33\x69\xd0\x96\xc9\xba\x90\x22\x54\x7e\x54\x69\xd5\xe6\x4c\x8a\x9b\x4d\x88\xf1\x1a\xb8\xd4\x8a\x0c\x64\x5f\xb4\x33\x07\x6f\x6b\xa1\xca\xb0\x02\x4a\x39\xf0\x71\x84\x3a\x7f\x27\xd2\xfe\x92\x6d\x75\x00\xa7\x05\x8f\xe4\xcb\x9b\xd9\x56\x78\x05\xc7\xd3\xba\xe6\x93\x50\x69\x9e\xff\x9b\x87\x7b\x2e\x03\x97\xe3\x6f\x74\x48\xa6\x3d\x1d\xe6\xc1\xab\x90\x1f\x8e\x86\x18\xbf\xbb\xbf\x75\xc2\x5a\xff\x42\xe8\x8b\xf4\x35\xfd\x44\x3a\x31\xd2\x1d\xa2\xb4\xe2\x37\x17\xac\x7d\xab\x80\xd4\xc5\x73\xeb\x29\xd9\x9b\x39\x8d\xe1\x23\x00\x00\xff\xff\x83\x2e\x8d\x64\x35\x02\x00\x00") - -func vpcResourceControllerYamlBytes() ([]byte, error) { - return bindataRead( - _vpcResourceControllerYaml, - "vpc-resource-controller.yaml", - ) -} - -func vpcResourceControllerYaml() (*asset, error) { - bytes, err := vpcResourceControllerYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "vpc-resource-controller.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0xff, 0xd2, 0xc, 0x46, 0xfb, 0xe4, 0x4e, 0xb, 0x26, 0x4a, 0xa0, 0x7d, 0x73, 0x5e, 0xaf, 0x6d, 0xab, 0xfd, 0xe5, 0xc2, 0x4f, 0xed, 0xae, 0xb6, 0xd7, 0x17, 0x38, 0x68, 0xb0, 0xe8, 0x2d}} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// AssetString returns the asset contents as a string (instead of a []byte). -func AssetString(name string) (string, error) { - data, err := Asset(name) - return string(data), err -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// MustAssetString is like AssetString but panics when Asset would return an -// error. It simplifies safe initialization of global variables. -func MustAssetString(name string) string { - return string(MustAsset(name)) -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetDigest returns the digest of the file with the given name. It returns an -// error if the asset could not be found or the digest could not be loaded. -func AssetDigest(name string) ([sha256.Size]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) - } - return a.digest, nil - } - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) -} - -// Digests returns a map of all known files and their checksums. -func Digests() (map[string][sha256.Size]byte, error) { - mp := make(map[string][sha256.Size]byte, len(_bindata)) - for name := range _bindata { - a, err := _bindata[name]() - if err != nil { - return nil, err - } - mp[name] = a.digest - } - return mp, nil -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "efa-device-plugin.yaml": efaDevicePluginYaml, - "neuron-device-plugin.yaml": neuronDevicePluginYaml, - "nvidia-device-plugin.yaml": nvidiaDevicePluginYaml, - "vpc-admission-webhook-config.yaml": vpcAdmissionWebhookConfigYaml, - "vpc-admission-webhook-csr.yaml": vpcAdmissionWebhookCsrYaml, - "vpc-admission-webhook-dep.yaml": vpcAdmissionWebhookDepYaml, - "vpc-admission-webhook.yaml": vpcAdmissionWebhookYaml, - "vpc-resource-controller-dep.yaml": vpcResourceControllerDepYaml, - "vpc-resource-controller.yaml": vpcResourceControllerYaml, -} - -// AssetDebug is true if the assets were built with the debug flag enabled. -const AssetDebug = false - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"}, -// AssetDir("data/img") would return []string{"a.png", "b.png"}, -// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - canonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(canonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "efa-device-plugin.yaml": {efaDevicePluginYaml, map[string]*bintree{}}, - "neuron-device-plugin.yaml": {neuronDevicePluginYaml, map[string]*bintree{}}, - "nvidia-device-plugin.yaml": {nvidiaDevicePluginYaml, map[string]*bintree{}}, - "vpc-admission-webhook-config.yaml": {vpcAdmissionWebhookConfigYaml, map[string]*bintree{}}, - "vpc-admission-webhook-csr.yaml": {vpcAdmissionWebhookCsrYaml, map[string]*bintree{}}, - "vpc-admission-webhook-dep.yaml": {vpcAdmissionWebhookDepYaml, map[string]*bintree{}}, - "vpc-admission-webhook.yaml": {vpcAdmissionWebhookYaml, map[string]*bintree{}}, - "vpc-resource-controller-dep.yaml": {vpcResourceControllerDepYaml, map[string]*bintree{}}, - "vpc-resource-controller.yaml": {vpcResourceControllerYaml, map[string]*bintree{}}, -}} - -// RestoreAsset restores an asset under the given directory. -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively. -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - canonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) -} diff --git a/pkg/addons/assets/vpc-admission-webhook-dep.yaml b/pkg/addons/assets/vpc-admission-webhook-dep.yaml index 2c08acab80..87fdadbc71 100644 --- a/pkg/addons/assets/vpc-admission-webhook-dep.yaml +++ b/pkg/addons/assets/vpc-admission-webhook-dep.yaml @@ -26,7 +26,7 @@ spec: - -alsologtostderr - -v=4 - 2>&1 - image: '%s.dkr.ecr.%s.%s/eks/vpc-admission-webhook:v0.2.6' + image: '%s.dkr.ecr.%s.%s/eks/vpc-admission-webhook:v0.2.7' imagePullPolicy: Always volumeMounts: - name: webhook-certs diff --git a/pkg/addons/assets/vpc-resource-controller-dep.yaml b/pkg/addons/assets/vpc-resource-controller-dep.yaml index 3966657e1b..2f45bea66d 100644 --- a/pkg/addons/assets/vpc-resource-controller-dep.yaml +++ b/pkg/addons/assets/vpc-resource-controller-dep.yaml @@ -24,7 +24,7 @@ spec: - /vpc-resource-controller args: - -stderrthreshold=info - image: '%s.dkr.ecr.%s.%s/eks/windows-vpc-resource-controller:v0.2.6' + image: '%s.dkr.ecr.%s.%s/eks/windows-vpc-resource-controller:v0.2.7' imagePullPolicy: Always livenessProbe: failureThreshold: 5 diff --git a/pkg/addons/default/assets.go b/pkg/addons/default/assets.go deleted file mode 100644 index 9018ff08d3..0000000000 --- a/pkg/addons/default/assets.go +++ /dev/null @@ -1,389 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// assets/aws-node.yaml (6.768kB) -// assets/coredns-1.17.json (10.228kB) -// assets/coredns-1.18.json (10.212kB) -// assets/coredns-1.19.json (10.163kB) -// assets/coredns-1.20.json (10.393kB) -// assets/coredns-1.21.json (10.486kB) - -package defaultaddons - -import ( - "bytes" - "compress/gzip" - "crypto/sha256" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo - digest [sha256.Size]byte -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _awsNodeYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x59\x41\x93\xe2\xba\x11\xbe\xf3\x2b\xa6\x54\x95\x4b\xaa\x6c\x60\xb3\xbb\xd9\x37\x55\x39\xb0\xe0\x21\xae\x07\x86\x32\x30\xfb\x5e\x2e\x2e\x21\xf7\x18\x05\x59\xf2\x93\x64\x86\x79\xa9\xfc\xf7\x94\x84\x0d\x36\xd8\xc0\x6c\xb6\x92\x1c\x72\x9a\x19\xa9\xfb\xeb\xd6\xa7\xee\x56\xbb\xc7\x71\x9c\x0e\xc2\x19\x7d\x06\xa9\xa8\xe0\xe8\xf1\x01\xc9\x35\x26\x2e\xce\xf5\x46\x48\xfa\x3b\xd6\x54\x70\x77\xfb\x45\xb9\x54\x74\x77\x7d\xd4\x41\x5b\xca\x63\x23\x36\x64\xb9\xd2\x20\x43\xc1\xe0\x2b\xe5\x31\xe5\x09\xea\xa0\x14\x34\x8e\xb1\xc6\xe8\xb1\xf3\xf0\x80\x38\x4e\xc1\x88\xe2\x57\xe5\x70\x11\x03\xea\x20\x29\x18\x84\xf0\x72\xd8\xc7\x19\x1d\x4b\x91\x67\x57\xad\x22\x23\xd9\x60\x14\xb5\x58\x50\xf9\xfa\xef\x40\xb4\x42\x8f\x1d\xe7\xa4\xb8\x00\xb9\xa3\x04\x06\x84\x88\x9c\xeb\x16\xdd\x62\x51\x65\x98\xd8\x9d\x6d\xbe\x06\x47\xbd\x29\x0d\x29\xea\xfc\x10\xa6\xee\xa2\x28\x67\x50\x78\x5f\x12\xa4\xac\xb0\xf3\x80\x88\x8c\xad\x09\x9c\xe2\xdf\x05\xc7\xaf\xca\x25\x22\xb5\x8e\x4b\x50\x22\x97\x04\x8e\xa2\xc0\x29\x11\xfc\x85\x26\xca\xee\xef\x40\xae\x8f\x7b\x09\x58\x0a\x9c\x07\xc4\xa8\x2a\x7f\x7d\xc5\x9a\x6c\x50\xa3\xd9\x66\x0b\x99\x88\x55\xa1\x7b\xa4\xad\xc1\xd8\xa5\x89\x93\x0f\xf7\x1b\x33\xe4\xbc\x13\xdc\xfe\x96\x67\x31\xd6\xd0\x6c\x09\xf6\x1a\xb8\xb9\x4c\xd5\x6c\xf3\x8f\xf7\xd8\x6b\x88\x0b\x9c\xd1\x13\xf4\x29\x24\xd6\xa0\x71\x2d\x2e\x72\xa5\x45\x1a\x16\x56\x47\xf0\x42\x39\x35\x41\xd4\x1a\x24\xa7\x2b\x75\x5b\x02\x01\xa9\x0c\xc8\x41\x29\x29\x33\xab\x3d\x66\xec\xad\x59\xe9\x4a\x8a\x79\x81\x3f\xb4\x46\xd0\x61\x3d\x63\xb9\xc4\xac\x6e\xbe\xd8\x52\x94\x27\x39\xc3\xb2\xb6\x69\x91\x15\x11\x19\x54\x62\xbf\x24\xf2\x40\xf6\xe3\x29\x68\x8c\xcc\xae\x8f\x59\xb6\x31\xd4\x1c\x50\x41\xee\xc0\xb8\xa2\x65\x0e\xc5\x92\x16\x12\x27\x50\xae\x35\x52\x9e\xa9\x7a\xd6\x8d\x30\xa4\x82\x2f\x4c\x20\x9c\xd1\xc9\xf0\x1a\xd8\xe9\xdc\x5f\x94\x83\xb3\xac\xb1\x12\xbc\xa3\x3c\x54\x98\x57\xc0\x80\x68\x21\x4b\x0b\xa9\x09\x94\x49\xd5\xe8\x15\xb3\x1a\xd2\x8c\x99\x88\x2d\x95\xab\xae\xdb\x15\x56\x47\x6a\xc7\x32\xae\x94\x4e\xd9\xbf\xf0\x8b\x0d\xb1\xb7\xaa\xae\x11\x1e\x5c\xae\xdb\x74\xf8\x2d\xa7\x12\xe2\x51\x2e\x29\x4f\x16\x64\x03\x71\xce\x28\x4f\xfc\x84\x8b\xe3\xb2\xb7\x07\x92\xdb\xa0\xad\xea\x16\xb8\x8b\x82\x88\x25\xc8\x54\x9d\x09\x38\x05\x2f\xde\x3e\x93\xa0\x4e\x71\x71\x26\xb3\x85\x37\x73\x2c\x93\x3a\xae\xe1\x5b\x72\xd0\x60\xf3\x49\x14\x51\x58\xb3\x2a\x32\x90\xd8\x52\xff\x80\x7c\xde\x20\xb0\xc3\x2c\x87\x4b\x4b\x45\x6e\xf3\x7c\x7f\xae\x73\xd5\x07\x2c\x0f\x15\xe7\x47\x7a\x81\xd3\xf8\xf3\xc7\x4b\x1d\xb3\x23\xd3\xcb\x9d\x93\x7f\xb0\x3d\xcb\xf1\x2e\x11\x69\x96\x6b\x70\xf4\x5b\x06\x37\xdc\x0c\x84\x7e\xb7\xa7\x2f\x58\x26\xb6\xb6\x9e\xad\xbf\xe3\x5e\xff\xcb\x57\xfa\xff\xdb\x3c\xd9\x3d\xbb\x4d\x44\x04\xd7\x98\x72\x90\x27\x79\xdb\x55\xec\x2a\xea\x95\x22\x3e\x18\x8d\xfc\xa5\x3f\x0b\x06\x93\xc8\x0b\xfc\x68\x39\x18\x2f\xaa\x0e\x1c\x4c\x1b\xc1\x7f\xfc\x13\x35\xea\x7f\x5b\x44\xcf\xf3\x61\x34\x0c\xfc\x28\x98\x8d\xbc\x68\x3e\x0b\x97\xd1\x62\x35\x37\x3f\x9b\x91\xcc\x5b\x70\x15\xcb\x38\x32\x5d\xae\x9a\xb5\x7f\xea\xf5\xfa\x57\xb5\x7f\xfe\xb2\xb0\xde\x0c\x67\xc1\x93\x3f\x5e\x85\x5e\x14\xce\x9f\xfc\xc9\xd2\x0b\x9b\x01\x5f\x30\x53\xd7\xfd\x39\x22\xae\x16\xcb\xd9\x34\x0a\xbc\xe5\xb7\x59\xf8\x73\x34\x7c\x1a\xff\xbb\x88\xde\x2f\x4b\x2f\x0c\x06\x93\x45\x30\x68\x21\xeb\x7e\xac\xc9\x6c\x3c\xf1\x9e\xbd\x49\x33\xce\xc8\xfb\xba\x1a\xdf\x8b\x13\x3d\xf9\x13\xaf\x19\xa7\xbb\x11\x4a\x77\x77\x58\x76\x99\x48\xba\xe6\xd9\x92\x22\xd7\x10\x3b\xc0\x69\x97\x66\x38\x8d\x5d\x26\x92\xbb\x0c\x85\x83\x60\x34\x9b\xfa\x7f\xf3\xda\x4f\x9f\x49\x7e\x1f\xd6\xb3\xb7\xfc\xeb\x3c\xf4\x9e\xfc\x5f\x9a\x81\x80\xd3\x9b\x38\xf3\xc9\x6a\xec\x07\xb7\xce\xdf\x72\xf4\x8c\xe5\x09\xe5\x77\x9d\xbd\x62\xe7\xbb\x2e\x6c\xe4\x2f\x06\x5f\x27\x5e\xe4\x07\xcb\x70\xb6\x98\x7b\x43\x93\xbf\xef\x8d\x9e\x12\x64\xea\x2d\x43\x7f\xd8\x92\xf3\xb7\xd5\xcb\x5c\x08\xbd\xc5\x6c\x15\x0e\xbd\x68\x1e\xce\x9e\xfd\x85\x3f\x0b\xfc\xe0\xdd\xd9\xe1\x05\x16\x73\x3e\x1b\x99\x12\xf0\xbd\xda\x36\x0a\xa2\x91\x37\xf1\xc6\x83\xef\x61\x66\xfa\xeb\xa1\x90\x05\x83\x69\x43\x0c\x3c\x49\x91\x9e\xf7\x4c\x2f\x14\x58\x5c\x7e\x1d\x5f\xee\xcc\xb1\xde\x18\x60\xd3\xd4\xb9\xa6\xbf\x0a\x8c\xa5\x26\xd3\xdf\x06\xe1\xb4\x28\xc3\xe1\xd8\x6b\xc9\x89\xe6\xea\x67\x55\x8b\xb3\xdf\xa9\x8d\x68\x7a\x68\xce\xd1\xe7\xde\x87\x8f\xbd\x7e\xff\xe3\x9f\x3e\x7e\xfa\xe0\xc6\x5b\xe9\x02\x91\x6e\xae\x9c\x57\x50\xda\xf9\x70\xf6\x9e\x1d\xfe\x72\x4c\xf3\x4a\x38\x7d\xdc\xf5\xdd\x9f\xdc\x2a\x2a\xa3\x3b\xe0\xa0\xd4\x5c\x8a\x35\xd4\x5b\x53\xd8\x57\xda\xda\x62\x8d\x88\x34\xc5\xa6\xf5\x3f\x6f\x47\xba\x38\xcb\xba\x89\xcc\x88\xb3\x01\xcc\xf4\xc6\xc9\x2c\xe0\xb9\x98\x83\xe3\x58\xfe\xe5\xf1\x53\xaf\xf7\xa9\x5f\x3b\xb2\xfd\x2a\xc3\x6c\x04\x0c\xbf\x2d\x80\x08\x1e\x2b\xf4\xf8\xf0\xb9\x57\xe9\xa1\x1b\x3e\x15\x8a\xad\x4c\x48\xad\xea\x2f\xe6\xf1\x61\x9d\x0b\xa9\x0d\x52\xff\xf3\x9f\xbf\x54\x0d\x96\x70\x29\x68\x49\x49\xa5\x27\x42\x12\x70\x4c\xff\x77\x39\xe9\x57\x3d\xad\x7e\x4b\x57\x96\x7f\xcb\x41\xe9\xf3\x16\x04\x91\x2c\xb7\x41\xd5\x4b\x2b\xa7\x55\x40\x72\x49\xf5\xdb\x50\x70\x0d\x7b\x5d\x47\x22\x38\xc3\x6b\xca\xa8\xa6\x17\x0d\x0d\xc2\x71\xc3\x91\x03\x6f\x19\x0d\x46\x53\xbf\x92\xc7\x68\x27\x58\x9e\xc2\x54\xe4\xfc\xfc\x92\x52\xb3\x56\x26\xdc\xe1\xad\x12\x99\xee\x12\x4e\xbb\x6b\x5a\x6b\xad\x8e\xd7\x45\x38\x75\xd6\x94\x3b\x31\x95\xe8\x06\x14\x68\x62\xa1\x38\x68\x37\x6e\x05\xe3\xa0\xef\x01\x6b\x7e\x48\x1a\x51\x99\x48\x6e\x20\x1a\x30\x99\xf3\xee\x65\x28\x57\x60\x64\x7e\xeb\x94\x25\x4c\x2c\xc8\x16\xa4\xda\xd0\xd4\x55\x82\x6c\x1b\xd1\x4e\x32\x57\x00\x0d\xd8\x5e\xe3\x35\x03\xe5\xb2\x36\xa4\x42\xc0\xa9\x0a\x20\xc3\x51\x00\xfa\x55\xc8\x6d\x75\xa6\x50\x04\xf1\xf0\x7d\x5d\x6e\xf9\x5c\x2d\x87\xf3\xc8\x1b\x84\x93\x5f\xa3\x91\x37\x5d\xb5\xf4\x0a\x67\x4f\xc3\x0f\x29\x93\x8e\x71\xfa\xb2\x56\x56\x2b\xd0\x2e\x23\x47\xc9\x7b\xb3\x29\x93\x74\x47\x19\x24\xf5\xb9\xcb\x7f\x24\x47\x8c\x6d\x61\x1d\x63\x58\xa9\xa0\x10\x3c\x8c\x55\x6c\x08\x3a\x44\x52\x4d\x09\x66\x47\x0d\x55\x1b\xe6\x06\x2d\xd5\x17\x69\x90\x29\xe5\x76\x2e\x3b\x96\x98\xc0\x1c\x24\x15\x71\xa5\x5c\xf5\x8e\x92\x82\x99\x8f\xa7\xda\xc7\xaa\x53\xff\xa4\xf2\xf6\xd4\xd4\xad\x4e\x8d\x95\x9a\xb4\x21\xe0\xc0\x46\x8d\xd9\x92\x9f\x46\x6a\xae\x11\x73\x1b\xb2\xa5\x8c\x5c\x2b\x22\xb7\x41\x6f\xa6\xee\x95\xc4\xbd\x8d\xde\x9e\xc7\x57\xb3\xf8\x3e\xb7\x6f\x54\x41\xfb\xe1\x6c\x92\x98\x4a\x3b\x96\x7a\x9b\xc9\xa1\x84\xda\x04\xa3\xad\x52\xde\x4f\x5b\x63\xe1\x7c\x8f\xe5\x4a\x71\x2d\x86\xd7\x0b\x2d\xb1\x86\xa4\x1c\xcf\x21\x29\x18\xa3\x3c\x59\x1d\x26\xdb\xc7\xe9\x5e\x8a\xf7\x2b\x8e\x77\x98\x32\xc3\xdf\xe1\x39\xfd\x43\x31\x07\x2c\x1d\x08\x6b\xaa\x4d\x83\xd4\xda\x0c\xf5\xfc\xbf\x26\x37\xff\x79\x71\x75\x44\xea\xba\x6e\xe7\x5f\x01\x00\x00\xff\xff\xaf\xc1\xd4\x65\x70\x1a\x00\x00") - -func awsNodeYamlBytes() ([]byte, error) { - return bindataRead( - _awsNodeYaml, - "aws-node.yaml", - ) -} - -func awsNodeYaml() (*asset, error) { - bytes, err := awsNodeYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "aws-node.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x15, 0x7a, 0x4, 0xf3, 0x4e, 0x9c, 0x52, 0x8b, 0x4, 0xa4, 0x1c, 0xee, 0xfc, 0xd4, 0x7e, 0x41, 0x58, 0x5, 0xc8, 0x90, 0xb4, 0xaa, 0x3, 0x3c, 0xce, 0x9d, 0x1d, 0x53, 0x8, 0xe9, 0x20, 0xc0}} - return a, nil -} - -var _coredns117Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\x1b\xb9\x0d\x7f\xf7\xa7\xd8\xd9\x99\xbc\x9d\x64\x29\x8e\xdd\x9c\xdf\x7c\xb6\x9b\xf3\x34\x76\x35\xb6\x73\x2f\xcd\xcd\x0d\xc5\x85\x24\x56\x5c\x82\x05\xb9\xb2\x75\x19\x7f\xf7\x0e\xf7\x8f\xb4\x7f\xc8\x95\xe4\x3a\x9d\x74\xa6\x7a\x48\xd6\x24\x00\x62\x01\xfc\x40\x80\xdc\x6f\x47\x51\x14\x33\x2d\x7e\x03\x32\x02\x55\x7c\x1e\xc5\xab\x71\xfc\x93\x1b\x15\x16\x52\x13\x9f\x47\xff\x38\x8a\xa2\x28\xfa\x96\xff\x1b\x22\xce\x67\x96\x42\x25\x6e\xec\x01\x68\x25\x38\x6c\x27\x52\xb0\x2c\x61\x96\xc5\xe7\x1b\x31\x4e\x90\x52\x68\x99\x15\xa8\x4c\x63\x22\x8a\x62\x4d\x98\x82\x5d\x40\x66\x86\x02\x8f\x35\x92\x75\x72\x7f\x1e\x9f\x9e\x6c\x84\x7a\xe8\x0c\x27\xa6\xc1\x51\x5a\xca\x20\xde\x10\xbe\x6c\x79\x62\xc9\xa6\x20\x3b\xeb\xc1\xd2\x0c\x59\xca\xfe\x44\xc5\x9e\xcc\x90\x63\x7a\xcc\x31\xd5\xa8\x40\xe5\x0b\x2f\xb3\x29\x0c\x12\x65\x9a\x8b\x2f\x3f\x9a\x01\xd3\xba\x87\x20\x9b\x02\x29\xb0\x90\x6b\xc7\x65\x66\x2c\xd0\xc0\x94\xd6\xa9\xd4\xec\x61\x51\x2c\xcd\xe9\x2e\x91\xe0\xea\xee\xc1\xff\x46\x15\x91\x47\x87\x7c\xce\x68\xc6\xb7\x04\x66\x6d\x2c\xa4\x95\xa4\x8d\x9c\xd8\x68\xe0\x4d\xf7\x38\xab\x6f\xdd\x5f\xfc\xea\x46\xab\x2d\xdd\x7e\xf3\x92\x3b\x3e\x8f\x4e\x4f\xda\xe3\x84\x16\x39\x4a\xc7\xf6\xe5\x6a\xd2\x66\xb3\x8c\xe6\x60\x27\x15\x73\x6d\xf2\xe5\xa7\xbd\xf4\x18\x58\xae\x5f\xa3\xcb\xe3\xe5\x21\xba\x6c\x9e\x7f\xaf\x19\xdb\x80\x04\x6e\x91\xda\xc1\xe5\x8b\x13\xaf\x27\x0d\x18\x07\xab\x8b\xd9\x4c\x28\x61\xd7\x8e\xe1\x0e\x55\x3d\x42\x62\xbb\x2e\x02\xfc\xb2\x08\xa6\x9b\xc9\xc6\x93\x47\x35\x69\x87\x63\xf5\x82\x73\xcc\x94\x3d\x10\xb2\xff\x31\xb0\x38\x12\xec\x85\xab\xde\xc8\xef\x4a\xd9\x1d\xf8\x07\x9a\xab\x6b\x0a\x87\xc9\x99\x90\xf9\x02\xc3\xf3\xd3\x93\xe8\xdb\x57\xe5\x26\x80\x08\xc9\x14\xcf\x0b\x60\xd2\x2e\x8a\xe7\x2d\xb2\xa3\x32\x13\x0c\x25\x72\x26\x23\xa1\x06\x2c\x49\x68\xc8\x48\xb3\x48\xe8\xb3\xe2\xa1\x94\x16\x45\x1a\x13\x13\x09\x65\x80\x67\x04\xd5\x60\xa6\x8d\x25\x60\x69\xf5\xf7\x8c\x49\x69\x17\x84\xd9\x7c\xe1\x97\x57\x10\xbe\x14\xff\x6d\xb3\x66\x74\xee\x72\x6a\x31\x3a\x43\x7a\x62\x94\x44\xc3\xe8\x18\x2c\x3f\x26\x30\x28\x57\x43\x8e\x6a\x56\xcc\x73\xc6\x17\x10\x9d\x8c\x8a\xbf\x24\xa2\x2e\x9e\x08\x24\xb2\xa4\x1a\x65\xc9\x94\x49\xa6\x38\x7c\x55\x2f\x5f\x55\x37\xcf\x54\x71\x77\x89\x6a\x26\xe6\xb7\x4c\xff\x3f\xe4\x6a\x21\xc7\xb4\x36\xc7\x3e\x98\x5e\x81\x96\xb8\x4e\xe1\x07\x86\xe8\x5b\xed\x63\xaf\x31\x6d\xdf\x36\x46\x38\x27\x30\xe6\x0a\x58\x22\x85\x82\x07\xe0\xa8\x12\x67\x85\xb3\xd1\xa8\xb6\x06\x81\x96\x82\x33\x37\xf1\xbe\x31\xbc\x12\xce\x3b\xbf\x0a\x63\x91\xd6\x9f\x45\x2a\x9c\x59\xc6\xa3\x3d\x12\x7f\xca\x2c\x5f\x7c\xf6\x19\xfd\x75\x66\xdf\x15\xa8\xf5\x8d\xa9\xb1\xaf\x58\x62\x16\xe6\xeb\xb6\x7e\x84\x52\x0a\x35\xff\xa2\x13\x66\xa1\xab\x61\xca\x9e\x1f\x32\x9a\xe7\x46\x7f\x7f\xfa\xae\xad\x4a\xca\x9e\xbf\x28\xb6\x62\x42\xb2\x69\x9e\x06\xc7\xa1\xdd\x7a\xb3\x6b\xdd\x37\x16\xf4\xea\x6a\x21\xd5\xb2\xab\x8e\x3f\xd8\xa3\xfe\x32\xb2\xc7\xce\x99\x85\x41\xa5\x15\xf0\xf7\x71\x83\xeb\xa5\xf5\xa6\x9c\x20\x97\xff\x28\x52\x30\x96\xa5\xce\xfc\x2a\x93\xb2\x45\xe6\x85\x57\x8f\x0e\x3b\x7c\xbd\xdb\xdb\x75\x7f\xb7\x4d\xde\x01\x42\x61\xab\x6d\x69\xd1\x51\x52\x61\x02\x17\xe1\xf9\x1c\x0b\xff\xca\x04\x41\x72\x95\x91\x50\xf3\x07\xbe\x80\x24\x73\xfe\xbc\x99\x2b\xdc\x0c\x5f\x3f\x03\xcf\x6c\x91\xcf\xba\x32\xca\x75\x1e\x4a\xc4\x3c\x02\xa5\xed\x1a\x73\xfb\xf3\xb1\x47\x1b\x60\x5d\x3f\x6b\x2a\x0a\xa6\xb0\x84\x3e\x29\xb9\xa4\x25\xe4\x65\xd6\x14\x2c\x1b\x36\x73\x16\x76\xfd\xd1\xe0\x44\x0d\xc4\x0a\xd0\xc7\x37\xaa\x9f\x76\xc5\x64\x06\xfd\x5a\xe6\x74\x52\xa8\xec\x39\xee\xa1\xf9\x3d\x38\xf7\x12\x56\xe0\x95\x06\x60\xc4\x17\xff\x7d\x13\xb0\x34\x39\xfb\xd0\x2b\xca\x11\x51\x7a\xf6\xe1\x95\x76\x0a\xcc\xf8\x39\x7c\xd4\x5d\xca\x36\x55\xc7\x17\xb1\xc6\xe4\x42\x59\xd1\x0f\x2f\x4d\x30\x03\x3a\x04\x5f\x3e\x5b\xfa\xbd\x9d\x6b\x50\xae\xee\x40\x17\x00\x67\xb4\xc9\x63\x0f\xfe\x3d\xad\x45\x7a\x10\x10\xfb\x23\x71\x1b\x8b\x55\xd6\xdb\x11\x04\x07\x44\xdf\xfe\xf1\x17\x85\x32\x6d\xfb\x17\x8e\xb0\x70\x8c\x85\xb9\x82\xe8\x8d\x2d\x6a\x94\x38\x5f\xff\xad\xb4\x4d\x03\xa2\x0b\x34\x36\x2f\x9b\xfc\xc1\xeb\x17\x1a\x3f\x81\x98\x2f\x8a\x22\x66\xe4\xa1\xe8\x6a\xdf\xd6\xfa\xa5\x7f\xb7\x44\x65\x99\x50\x40\x3e\x6b\x7b\xc2\x9e\xd1\x3c\xe4\x97\x78\xe0\xda\x0f\xaf\x6b\xe3\xbc\x49\x29\x77\xce\xe3\x4d\x33\xd6\xd5\xbd\xcb\x1c\x8b\x94\x15\x55\xcd\x3b\x33\x4c\x96\x34\x04\x4e\xc3\x77\x66\xf8\xce\x1c\xc3\xd2\x54\x32\xcf\x57\xe3\xe1\xd9\xf0\x6c\x00\x4b\x33\xcd\x84\x4c\x86\x63\x8f\x1e\x85\xa8\x49\x26\xe5\x04\xa5\xe0\xb9\x8b\x6e\x66\x77\x68\x27\x04\xa6\x5e\xac\xd7\x58\xa4\x58\x81\x02\x63\x26\x84\xd3\x6e\xd5\x55\x12\xcd\x98\x90\x19\xc1\xe3\x82\xc0\x2c\x50\xba\x1e\xe0\xd4\x6b\x86\x85\xb5\xfa\x13\xd8\x20\x4c\x63\xcd\xec\xc2\xa9\x75\x5c\x34\xa3\x01\x9c\x54\x67\x24\x1f\x47\x1f\x47\x01\x0a\xc3\x17\x50\x54\xe8\xbf\x3e\x3e\x4e\x7c\x21\xe7\x0d\xb8\xd8\xe5\x1c\xc1\xe4\x15\x48\xb6\xae\x17\xdf\x5e\x62\x0d\x24\x30\xd9\x92\x8d\xfd\x64\x26\xe3\x1c\x8c\xa9\x9b\x67\xec\x25\xb4\x22\x05\xcc\xec\x56\xe0\x69\x37\x7b\x7b\x7c\x14\xee\x45\xb6\x9a\x7a\x8e\xc7\xaa\x5f\xc0\x15\x1b\x64\x4c\xfc\x07\x52\x9d\xe5\xfd\x4b\x47\xbe\x73\xb4\x7d\xdd\xf1\x86\xaa\x79\x8e\xda\xbc\xea\x3d\x5e\xbe\xb9\x7a\x3f\x8f\x77\x2a\x98\x82\x25\xc1\xf7\xb2\x5f\x48\xc1\xbd\x92\x09\x01\x4b\xc4\x6b\xf0\xec\x7d\x81\xff\x01\x3c\x7f\x77\x88\x8e\xf7\x82\x28\x81\xc1\x8c\x38\xf8\x1a\xae\xa8\xc8\xb3\xa9\xb0\xa1\xd9\xbc\xa3\x4c\x91\xf2\x8c\x3d\xfe\xcb\xe8\x56\xec\x6f\x00\xd7\x06\x81\xe9\x13\xcd\x75\x96\xcb\x1d\x8d\xd2\x90\x7f\xb6\xab\x07\x17\xdf\xcb\x0c\xf9\xb9\xa0\xb0\xeb\x4b\x54\x16\x9e\x43\x71\x13\x33\x29\xf1\x69\x42\x62\x25\x24\xcc\xe1\xda\x70\x26\x59\x59\x44\xce\x98\x34\xe0\x7d\x51\xce\x34\x9b\x0a\x29\xac\x08\x5a\xd9\x89\x4e\x92\x9e\xb2\x2a\xbe\xbb\x7e\xfc\xe3\x97\x9b\xbb\xab\x3f\x1e\xae\xef\x7f\xbb\xb9\xbc\xf6\xd7\x2a\x1e\x64\xe5\xdc\x09\xa1\xee\x93\xce\xa4\x0c\x08\x3c\xc0\x9d\x2c\xf9\xbb\x92\xeb\x7b\x44\xfb\x57\x21\xa1\x3c\x5a\x3a\x8f\x2c\x65\xb0\x97\x0f\x2c\x50\x2a\x54\x6e\xcf\x5b\x30\xc6\x55\x04\x15\x48\x13\x58\x1d\xd7\xa6\x07\x12\xe7\xbe\xcd\xc4\x23\x61\x53\x4f\x38\x9d\x7c\x3c\x2b\x94\x59\x0a\xb7\x98\xa9\x43\xf7\xa1\xd4\xf1\x6c\x54\xac\xd5\x51\xa1\x60\xdd\x6e\x87\x6a\x26\xe6\x83\x62\xe5\x10\x71\x65\xcf\x90\x05\x0f\xcb\xfc\x4d\x5d\x6d\x1a\xdc\x71\x2a\x1d\x1d\xc9\x1b\x54\xb5\xad\x80\x74\xfb\xdd\xd6\x25\x57\x30\x63\x99\x6c\x57\x77\xb1\x26\x81\x39\x16\x25\x33\xe6\xae\xd4\xa7\x08\xa7\x41\x75\xfb\xc7\x49\x58\xc1\x99\x6c\xf3\x12\x18\xcb\xc8\x6e\xd7\xb8\x90\x4f\x6c\xdd\x39\xff\x33\x45\x53\x08\x54\x89\x4f\x0a\x55\x06\x9b\x89\x0e\x47\x37\x41\xb4\x2b\x76\xd3\xbc\x03\x0a\x9f\x3e\x36\x09\xef\x7a\x8b\xa4\x7a\x4c\x7f\x22\xc6\x61\xd2\xda\x37\x4e\x46\x6d\x06\x94\xae\xa3\x0b\xf4\x91\x9e\xce\x01\x66\x33\xe0\xb6\xb8\x26\x2b\xbb\x65\x2f\x52\xca\xbe\x52\x61\x02\x03\x42\x09\xad\x83\x8e\x94\x39\xcf\xb4\x83\xa6\x13\xa4\x1e\x05\x4a\xc1\x97\xa5\x4f\x2f\x92\x04\x95\xc9\x63\xdf\xa3\x45\xbd\x5f\xbd\x7e\x16\x6e\x03\x39\x28\x02\x0b\xd4\xed\x6b\x9a\x54\xdb\xf5\x95\x20\x8f\xbb\xa3\x1d\x68\xd9\xe7\xc5\xf9\xe6\xf6\x26\xb0\xdf\x94\x61\x79\x8b\x89\x5b\xe6\xc3\x7b\x7f\x8d\xd0\xfc\xc2\xa0\xfd\x0b\x1e\x50\x54\x66\xaf\x9a\xbe\x60\xf3\x5c\xd5\x4a\xe1\xf6\x30\x0a\x1d\xf2\x78\xf5\x6d\xb7\x05\x07\xf6\x12\xf5\xe4\xd9\xef\xfa\x23\xdf\x4c\xf5\xb4\xcf\x45\x12\x4d\x19\x1f\xb2\xcc\x2e\x90\xc4\x9f\x39\xa6\x86\xcb\x8f\x79\xb4\xfb\x6e\x97\xca\xdb\xe4\x7b\x94\x87\x7e\xb4\xf1\x43\x5c\x2f\x4d\x11\xad\xb1\xc4\xb4\x16\x6a\x5e\xbd\xfd\xa0\x0c\xc1\x1d\x17\x79\x45\x7a\x3e\x6f\x79\x74\x7b\xa1\x44\x99\x6c\x61\xae\xf1\x76\x4c\x8b\x4f\x84\x99\xee\x46\x71\x5c\x77\x71\x23\x9c\x1a\xa5\x6b\x8b\x09\x54\xa2\x51\xb8\x1d\xdd\x9f\x7a\x3d\xdf\x59\x24\x9d\xb1\xcd\x75\x99\x09\xeb\xb0\x02\x9a\x7a\xd6\x97\xc2\x74\xb6\xb5\x27\x66\xf9\xa2\x21\xc9\x67\xd1\xef\x6a\x16\x97\xba\x0f\x7f\x99\x39\xd8\x80\xda\x47\xf5\x91\xef\x84\xa4\x5f\x84\x4a\x5c\x3c\x1e\x06\xa8\x86\x41\x3c\x4b\x37\x8f\xe8\x33\x8b\x59\x75\x7b\xf7\xd6\x1f\x3d\xfd\xf0\xc8\x44\x09\xf7\x30\x6b\x59\xb3\x0c\xbc\x5e\xcf\xd5\xaf\x96\xfb\x52\xe0\x01\xca\x98\x6c\xfa\x4f\xe0\xb6\x27\x53\xec\xf8\xe0\x26\xda\x75\xec\xb4\xf3\x12\xbc\x13\xd6\x47\x25\x4c\x36\x4b\x7f\x76\xe0\x3e\x7a\x39\xfa\x77\x00\x00\x00\xff\xff\x85\x7f\x10\xa7\xf4\x27\x00\x00") - -func coredns117JsonBytes() ([]byte, error) { - return bindataRead( - _coredns117Json, - "coredns-1.17.json", - ) -} - -func coredns117Json() (*asset, error) { - bytes, err := coredns117JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "coredns-1.17.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9d, 0x70, 0x23, 0x87, 0xb4, 0xbb, 0xaf, 0x6f, 0x43, 0xc2, 0xf2, 0xe, 0xd2, 0xc1, 0x68, 0x9c, 0xb8, 0x1c, 0xf1, 0x3, 0xac, 0x82, 0xf4, 0x54, 0x6d, 0x63, 0xf3, 0x36, 0xa2, 0x7c, 0xa2, 0x1}} - return a, nil -} - -var _coredns118Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x6f\x1b\x39\x0e\x7f\xcf\xa7\x18\x0c\xd0\xb7\xb5\x63\x37\x4d\xb7\x9b\xb7\x6c\x92\xeb\x06\xd7\xe4\x8c\x24\xdd\x97\xeb\x62\x21\x6b\x68\x5b\x67\x8d\xa8\xa3\x34\x4e\xdc\x22\xdf\xfd\xa0\xf9\x63\xcf\x1f\x69\x6c\xe7\xd2\x43\x0f\x58\x3f\xb4\x13\x89\xa4\x38\x24\x7f\x14\x29\xcd\xb7\xa3\x28\x8a\x99\x16\xbf\x03\x19\x81\x2a\x3e\x8b\xe2\xd5\x38\xfe\xc9\x8d\x0a\x0b\xa9\x89\xcf\xa2\x7f\x1e\x45\x51\x14\x7d\xcb\xff\x0d\x11\xe7\x33\x4b\xa1\x12\x37\x76\x0f\xb4\x12\x1c\xb6\x13\x29\x58\x96\x30\xcb\xe2\xb3\x8d\x18\x27\x48\x29\xb4\xcc\x0a\x54\xa6\x31\x11\x45\xb1\x26\x4c\xc1\x2e\x20\x33\x43\x81\xc7\x1a\xc9\x3a\xb9\xbf\x8c\x4f\x4f\x36\x42\x3d\x74\x86\x13\xd3\xe0\x28\x2d\x65\x10\x6f\x08\x9f\xb7\x3c\xb1\x64\x53\x90\x9d\xf5\x60\x69\x86\x2c\x65\x5f\x51\xb1\x47\x33\xe4\x98\x1e\x73\x4c\x35\x2a\x50\xf9\xc2\xcb\x6c\x0a\x83\x44\x99\xe6\xe2\xcb\x0f\x66\xc0\xb4\xee\x21\xc8\xa6\x40\x0a\x2c\xe4\xda\x71\x99\x19\x0b\x34\x30\xa5\x75\x2a\x35\x7b\x58\x14\x4b\x73\xba\x0b\x24\xb8\xbc\xbd\xf7\xbf\x51\x45\xe4\xd1\x21\x9f\x33\x9a\xf1\x2d\x81\x59\x1b\x0b\x69\x25\x69\x23\x27\x36\x1a\x78\xd3\x3d\xce\xea\x5b\xf7\x17\xbf\xba\xd1\x6a\x4b\xb7\xdf\xbc\xe4\x8e\xcf\xa2\xd3\x93\xf6\x38\xa1\x45\x8e\xd2\xb1\x7d\xbe\x9c\xb4\xd9\x2c\xa3\x39\xd8\x49\xc5\x5c\x9b\x7c\xfe\x69\x2f\x3d\x06\x96\xeb\x97\xe8\xf2\x70\x71\x88\x2e\x9b\xe7\x3f\x6a\xc6\x36\x20\x81\x5b\xa4\x76\x70\xf9\xe2\xc4\xeb\x49\x03\xc6\xc1\xea\x7c\x36\x13\x4a\xd8\xb5\x63\xb8\x45\x55\x8f\x90\xd8\xae\x8b\x00\xbf\x28\x82\xe9\x7a\xb2\xf1\xe4\x51\x4d\xda\xe1\x58\x3d\xe7\x1c\x33\x65\x0f\x84\xec\x7f\x0d\x2c\x8e\x04\x7b\xe1\xaa\x37\xf2\xbb\x52\x76\x07\xfe\x81\xe6\xea\x9a\xc2\x61\x72\x26\x64\xbe\xc0\xf0\xec\xf4\x24\xfa\xf6\x45\xb9\x09\x20\x42\x32\xc5\xf3\x02\x98\xb4\x8b\xe2\x79\x8b\xec\xa8\xcc\x04\x43\x89\x9c\xc9\x48\xa8\x01\x4b\x12\x1a\x32\xd2\x2c\x12\xfa\x7d\xf1\x50\x4a\x8b\x22\x8d\x89\x89\x84\x32\xc0\x33\x82\x6a\x70\xc6\xa4\xb4\x0b\xc2\x6c\xbe\xf0\xf3\x17\x84\xcf\xc5\x7f\xdb\x2c\x19\x9d\xb9\x1c\x5a\x8c\xce\x90\x1e\x19\x25\xd1\x30\x3a\x06\xcb\x8f\x09\x0c\xca\xd5\x90\xa3\x9a\x15\xf3\x9c\xf1\x05\x44\x27\xa3\xe2\x2f\x89\xa8\x8b\x27\x02\x89\x2c\xa9\x46\x59\x32\x65\x92\x29\x0e\x5f\xd4\xf3\x17\xd5\xcd\x2b\x55\x9c\x5d\xa0\x9a\x89\xf9\x0d\xd3\x7f\x85\x58\x2d\xc4\x98\xd6\xe6\xd8\x07\xcb\x4b\xd0\x12\xd7\x29\xfc\xc0\x90\x7c\xad\x7d\xeb\x25\xa6\xed\xdb\xb6\x08\xe7\x04\xc6\x5c\x02\x4b\xa4\x50\x70\x0f\x1c\x55\xe2\xac\xf0\x7e\x34\xaa\xad\x41\xa0\xa5\xe0\xcc\x4d\xbc\x6d\x0c\xaf\x84\xf3\xce\x6f\xc2\x58\xa4\xf5\x27\x91\x0a\x67\x96\xf1\x68\x8f\x44\x9f\x32\xcb\x17\x9f\x7c\x46\x7f\x99\xd9\x77\x05\x6a\x7d\x23\x6a\xec\x23\x96\x98\x85\xf9\xba\xad\x1f\xa1\x94\x42\xcd\x3f\xeb\x84\x59\xe8\x6a\x98\xb2\xa7\xfb\x8c\xe6\xb9\xd1\xdf\x9e\xbe\x69\xab\x92\xb2\xa7\xcf\x8a\xad\x98\x90\x6c\x9a\xa7\xbd\x71\x68\x77\xde\xec\x52\x77\x8d\x05\xbd\xba\x5a\x48\xb5\xec\xaa\xe3\x0f\xf6\xa8\xbf\x6c\xec\xb1\x73\x66\x61\x50\x69\x05\xfc\x6d\xdc\xe0\x7a\x6e\xbd\x29\x27\xc8\xe5\x3f\x88\x14\x8c\x65\xa9\x33\xbf\xca\xa4\x6c\x91\x79\xe1\xd5\xa3\xc3\x0e\x5f\xef\xf6\x76\xdd\xdf\x6d\x93\x77\x80\x50\xd8\x6a\x5b\x4a\x74\x94\x54\x98\xc0\x79\x78\x3e\xc7\xc2\xbf\x33\x41\x90\x5c\x66\x24\xd4\xfc\x9e\x2f\x20\xc9\x9c\x3f\xaf\xe7\x0a\x37\xc3\x57\x4f\xc0\x33\x5b\xe4\xb3\xae\x8c\x72\x9d\xfb\x12\x31\x0f\x40\x69\xbb\xa6\xdc\xfe\x7c\xec\xd1\x06\x58\x57\x4f\x9a\x8a\x02\x29\x2c\xa1\x4f\x4a\x2e\x69\x09\x79\x59\x35\x05\xcb\x86\xcd\x9c\x85\x5d\x7f\x34\x38\x51\x03\xb1\x02\xf4\xf1\xb5\xea\xa7\x5d\x31\x99\x41\xbf\x96\x39\x9d\x14\x2a\x7b\x8a\x7b\x68\xfe\x08\xce\x3d\x87\x15\x78\xa1\x01\x18\xf1\xc5\xff\xde\x04\x2c\x4d\xde\xbf\xeb\x15\xe5\x88\x28\x7d\xff\xee\x85\x76\x0a\xcc\xf8\x39\x7c\xd4\x5d\xca\x36\x55\xc7\x17\xb1\xc6\xe4\x5c\x59\xd1\x0f\x2f\x4d\x30\x03\x3a\x04\x5f\x3e\x5b\xfa\xbd\x9d\x6b\x50\xae\xee\x40\x17\x00\x67\xb4\xc9\x63\xf7\xfe\x3d\xad\x45\x7a\x10\x10\xfb\x23\x71\x1b\x8b\x55\xd6\xdb\x11\x04\x07\x44\xdf\xfe\xf1\x17\x85\x32\x6d\xfb\x17\x8e\xb0\x70\x8c\x85\xb9\x82\xe8\x8d\x2d\x6a\x94\x38\x5f\xff\xbd\xb4\x4d\x03\xa2\x0b\x34\x36\x2f\x9b\xfc\xc1\xeb\x17\x1a\x3f\x82\x98\x2f\x8a\x22\x66\xe4\xa1\xe8\x6a\xdf\xd6\xfa\xb9\x7f\xb7\x44\x65\x99\x50\x40\x3e\x6b\x7b\xc2\x9e\xd1\x3c\xe4\x97\x78\xe0\xda\x0f\xaf\x6b\xe3\xbc\x49\x29\x77\xce\xe3\x4d\xf3\xd5\xd5\xbd\xcb\x1c\x8b\x94\x15\x55\xcd\x1b\x33\x4c\x96\x34\x04\x4e\xc3\x37\x66\xf8\xc6\x1c\xc3\xd2\x54\x32\xcf\x56\xe3\xe1\xcf\xc3\xd1\x00\x96\x66\x9a\x09\x99\x0c\xc7\x1e\x3d\x0a\x51\x93\x4c\xca\x09\x4a\xc1\x73\x17\x5d\xcf\x6e\xd1\x4e\x08\x4c\xbd\x58\xaf\xb1\x48\xb1\x02\x05\xc6\x4c\x08\xa7\xdd\xaa\xab\x24\x9a\x31\x21\x33\x82\x87\x05\x81\x59\xa0\x74\x3d\xc0\xa9\xd7\x0c\x0b\x6b\xf5\x47\xb0\x41\x98\xc6\x9a\xd9\x85\x53\xeb\xb8\x68\x3e\x03\x38\xa9\xce\x44\x3e\x8c\x3e\x8c\x02\x14\x86\x2f\xa0\xa8\xd0\x7f\x7b\x78\x98\xf8\x42\xce\x1b\x70\xb1\xcb\x39\x82\xc9\x4b\x90\x6c\x5d\x2f\xbe\xbd\xc4\x1a\x48\x60\xb2\x25\x1b\xfb\xc9\x4c\xc6\x39\x18\x53\x37\xcf\xd8\x4b\x68\x45\x0a\x98\xd9\xad\xc0\xd3\x6e\xf6\xf6\xf8\x28\xdc\x8b\x6c\x35\xf5\x1c\x87\x55\xbf\x80\x2b\x36\xc8\x98\xf8\x0f\xa0\x3a\xcb\xfb\x97\x8e\x7c\xe7\x66\xfb\xba\xe3\x15\x55\xf3\x1c\xad\x79\xd5\x7b\xb8\x78\x75\xf5\x7e\x19\xef\x54\x30\x05\x4b\x82\xef\x65\xbf\x90\x82\x7b\x25\x13\x02\x96\x88\x97\xe0\xd9\xfb\x02\xff\x07\x78\xfe\xee\x10\x1d\xef\x05\x51\x02\x83\x19\x71\xf0\x35\x5c\x51\x91\x67\x53\x61\x43\xb3\x79\x47\x99\x22\xe5\x19\x7b\xfc\xf3\xe8\x46\xec\x6f\x00\xd7\x06\x81\xe9\x13\xcd\x75\x96\xcb\x1d\x8d\xd2\x90\x7f\xb6\xab\x07\x17\xdf\xcb\x0c\xf9\x39\xa0\xb0\xeb\x0b\x54\x16\x9e\x42\x71\x13\x33\x29\xf1\x71\x42\x62\x25\x24\xcc\xe1\xca\x70\x26\x59\x59\x44\xce\x98\x34\xe0\x7d\x51\xce\x34\x9b\x0a\x29\xac\x08\x5a\xd9\x89\x4e\x92\x9e\xb2\x2a\xbe\xbd\x7a\xf8\xf3\xd7\xeb\xdb\xcb\x3f\xef\xaf\xee\x7e\xbf\xbe\xb8\xf2\xd7\x2a\x1e\x64\xe5\xdc\x09\xa1\xee\x93\xce\xa4\x0c\x08\x3c\xc0\x9d\x2c\xf9\x87\x92\xeb\x3b\x44\xfb\x37\x21\xa1\x3c\x5a\x3a\x8b\x2c\x65\xb0\x97\x0f\x2c\x50\x2a\x54\x6e\xcf\x1b\x30\xc6\x55\x04\x15\x48\x13\x58\x1d\xd7\xa6\x07\x12\xe7\xbe\xcd\xc4\x23\x61\x53\x4f\x38\x9d\x7c\x3c\x2b\x94\x59\x0a\x37\x98\xa9\x43\xf7\xa1\xd4\xf1\x6c\x54\xac\xd5\x51\xa1\x60\xdd\x6e\x87\x6a\x26\xe6\x83\x62\xe5\x10\x71\x65\xcf\x90\x05\x0f\xcb\xfc\x4d\x5d\x6d\x1a\xdc\x71\x2a\x1d\x1d\xc9\x2b\x54\xb5\xad\x80\x74\xfb\xdd\xd6\x25\x97\x30\x63\x99\x6c\x57\x77\xb1\x26\x81\x39\x16\x25\x33\xe6\xb6\xd4\xa7\x08\xa7\x41\x75\xdb\xc7\x49\x58\xc1\x99\x6c\xf3\x12\x18\xcb\xc8\x6e\xd7\x38\x97\x8f\x6c\xdd\x39\xff\x33\x45\x53\x08\x54\x89\x4f\x0a\x55\x06\x9b\x89\x0e\x47\x37\x41\xb4\x2b\x76\xd3\xbc\xf3\x09\x9f\x3e\x36\x09\x6f\x7b\x8b\xa4\x7a\x4c\x7f\x24\xc6\x61\xd2\xda\x37\x4e\x46\x6d\x06\x94\xae\xa3\x0b\xf4\x91\x9e\xce\x01\x66\x33\xe0\xb6\xb8\x16\x2b\xbb\x65\x2f\x52\xca\xbe\x52\x61\x02\x03\x42\x09\xad\x83\x8e\x94\x39\xcf\xb4\x83\xa6\x13\xa4\x1e\x05\x4a\xc1\x17\xa5\x4f\xcf\x93\x04\x95\xc9\x63\xdf\xa3\x45\xbd\x5f\xbd\x7a\x12\x6e\x03\x39\x28\x02\x0b\xd4\xed\x6b\x9a\x54\xdb\xf5\xa5\x20\x8f\xbb\xa3\x1d\x68\xd9\xe7\xc5\xf9\xe6\xf6\x26\xb0\xdf\x94\x61\x79\x83\x89\x5b\xe6\xdd\x5b\x7f\x8d\xd0\xfc\xa2\xa0\xfd\x0b\x1e\x50\x54\x66\xaf\x9a\xbe\x60\xf3\x5c\xd5\x4a\xe1\xf6\x30\x0a\x1d\xf2\x78\xf5\x6d\xb7\x05\x07\xf6\x12\xf5\xe4\xd9\xef\xfa\x23\xdf\x4c\xf5\xb4\xcf\x45\x12\x4d\x19\x1f\xb2\xcc\x2e\x90\xc4\xd7\x1c\x53\xc3\xe5\x87\x3c\xda\x7d\xb7\x4b\xe5\xed\xf1\x1d\xca\x43\x3f\xd2\xf8\x21\xae\x97\xa6\x88\xd6\x58\x62\x5a\x0b\x35\xaf\xde\x7e\x50\x86\xe0\x8e\x8b\xbc\x22\x3d\x9f\xb5\x3c\xba\xbd\x50\xa2\x4c\xb6\x30\xd7\x78\x3b\xa6\xc5\x47\xc2\x4c\x77\xa3\x38\xae\xbb\xb8\x11\x4e\x8d\xd2\xb5\xc5\x04\x2a\xd1\x28\xdc\x8e\xee\x4f\xbd\x9e\xef\x2a\x92\xce\xd8\xe6\xba\xcc\x84\x75\x58\x01\x4d\x3d\xeb\x4b\x61\x3a\xdb\xda\x23\xb3\x7c\xd1\x90\xe4\xb3\xe8\x77\x35\x8b\x4b\xdd\x87\xbf\xcc\x1c\x6c\x40\xed\xa3\xfa\xc8\x77\x42\xd2\xaf\x42\x25\x2e\x1e\x0f\x03\x54\xc3\x20\x9e\xa5\x9b\x47\xf4\x99\xc5\xac\xba\xbd\x7b\xed\x8f\x9c\x7e\x78\x64\xa2\x84\x3b\x98\xb5\xac\x59\x06\x5e\xaf\xe7\xea\x57\xcb\x7d\x29\xf0\x00\x65\x4c\x36\xfd\x17\x70\xdb\x93\x29\x76\x7c\x60\x13\xed\x3a\x76\xda\x79\x09\xde\x09\xeb\xa3\x12\x26\x9b\xa5\x3f\x39\x70\x1f\x3d\x1f\xfd\x27\x00\x00\xff\xff\x09\xbb\x53\xfc\xe4\x27\x00\x00") - -func coredns118JsonBytes() ([]byte, error) { - return bindataRead( - _coredns118Json, - "coredns-1.18.json", - ) -} - -func coredns118Json() (*asset, error) { - bytes, err := coredns118JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "coredns-1.18.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x9d, 0x4c, 0xd6, 0xfd, 0x7e, 0xcb, 0xe5, 0xc5, 0x9e, 0x2, 0x8, 0xd4, 0xd3, 0xe3, 0xba, 0x62, 0xf1, 0x1b, 0xea, 0x1, 0x31, 0x15, 0x6d, 0x18, 0x7e, 0x19, 0x41, 0x91, 0x51, 0xaa, 0xc7}} - return a, nil -} - -var _coredns119Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\x1b\xb9\x0d\x7f\xf7\xa7\xd8\xd9\x99\xbc\x9d\x64\x29\x8e\x53\x9f\xdf\x7c\xb6\x9b\xf3\x34\x76\x35\xb6\x73\x2f\xcd\xcd\x0d\xc5\x85\x24\x56\x5c\x82\x05\xb9\xb2\x75\x19\x7f\xf7\x0e\xf7\x8f\xb4\x7f\xc8\x95\xe4\x3a\x9d\x74\xa6\x7a\x48\xd6\x4b\x00\x04\x81\x1f\x40\x80\xdc\x6f\x47\x51\x14\x33\x2d\x7e\x03\x32\x02\x55\x7c\x1e\xc5\xab\x71\xfc\x93\x7b\x2b\x2c\xa4\x26\x3e\x8f\xfe\x71\x14\x45\x51\xf4\x2d\xff\x37\x44\x9c\x8f\x2c\x85\x4a\xdc\xbb\x07\xa0\x95\xe0\xb0\x1d\x48\xc1\xb2\x84\x59\x16\x9f\x6f\xc4\x38\x41\x4a\xa1\x65\x56\xa0\x32\x8d\x81\x28\x8a\x35\x61\x0a\x76\x01\x99\x19\x0a\x3c\xd6\x48\xd6\xc9\xfd\x79\x7c\x7a\xb2\x11\xea\xa1\x33\x9c\x98\x06\x47\x69\x29\x83\x78\x43\xf8\xb2\xe5\x89\x25\x9b\x82\xec\xcc\x07\x4b\x33\x64\x29\xfb\x13\x15\x7b\x32\x43\x8e\xe9\x31\xc7\x54\xa3\x02\x95\x4f\xbc\xcc\xa6\x30\x48\x94\x69\x4e\xbe\x3c\x33\x03\xa6\x75\x0f\x41\x36\x05\x52\x60\x21\xd7\x8e\xcb\xcc\x58\xa0\x81\x29\xad\x53\xa9\xd9\xc3\xa2\x58\x9a\xd3\x5d\x22\xc1\xd5\xdd\x83\x7f\x45\x15\x91\x47\x87\x7c\xcc\x68\xc6\xb7\x04\x66\x6d\x2c\xa4\x95\xa4\x8d\x9c\xd8\x68\xe0\x4d\xf7\x38\xab\x6f\xdd\x5f\xfc\xea\x46\xab\x4d\xdd\x5e\x79\xc9\x1d\x9f\x47\xa7\x27\xed\xf7\x84\x16\x39\x4a\xc7\xf6\xe5\x6a\xd2\x66\xb3\x8c\xe6\x60\x27\x15\x73\x6d\xf0\xe5\xa7\xbd\xf4\x18\x58\xae\x5f\xa3\xcb\xe3\xe5\x21\xba\x6c\x9e\x7f\xaf\x19\xdb\x80\x04\x6e\x91\xda\xe0\xf2\xe1\xc4\xeb\x49\x03\xc6\x85\xd5\xc5\x6c\x26\x94\xb0\x6b\xc7\x70\x87\xaa\x8e\x90\xd8\xae\x0b\x80\x5f\x16\x60\xba\x99\x6c\x3c\x79\x54\x93\x76\x78\xac\x5e\x70\x8e\x99\xb2\x07\x86\xec\x7f\x1c\x58\x1c\x09\xf6\x8a\xab\x5e\xe4\x77\xa5\xec\x06\xfe\x81\xe6\xea\x9a\xc2\xc5\xe4\x4c\xc8\x7c\x82\xe1\xf9\xe9\x49\xf4\xed\xab\x72\x03\x40\x84\x64\x8a\xe7\x05\x30\x69\x17\xc5\xf3\x36\xb2\xa3\x32\x13\x0c\x25\x72\x26\x23\xa1\x06\x2c\x49\x68\xc8\x48\xb3\x48\xe8\x8f\xc5\x43\x29\x2d\x8a\x34\x26\x26\x12\xca\x00\xcf\x08\xaa\x97\x33\x26\xa5\x5d\x10\x66\xf3\x85\x9f\xbf\x20\x7c\x29\xfe\xdb\x66\xc9\xe8\xdc\xe5\xd0\xe2\xed\x0c\xe9\x89\x51\x12\x0d\xa3\x63\xb0\xfc\x98\xc0\xa0\x5c\x0d\x39\xaa\x59\x31\xce\x19\x5f\x40\x74\x32\x2a\xfe\x92\x88\xba\x78\x22\x90\xc8\x92\xea\x2d\x4b\xa6\x4c\x32\xc5\xe1\xab\x7a\xf9\xaa\xba\x79\xa5\xc2\xd9\x25\xaa\x99\x98\xdf\x32\xfd\x7f\x88\xd5\x20\xc6\xb4\x36\xc7\xbe\xb0\xbc\x02\x2d\x71\x9d\xc2\x0f\x1c\x92\x6f\xb5\x6f\xbd\xc6\xb4\x7d\xdb\x16\xe1\x9c\xc0\x98\x2b\x60\x89\x14\x0a\x1e\x80\xa3\x4a\x9c\x15\x3e\x8e\x46\xb5\x39\x08\xb4\x14\x9c\xb9\x81\xf7\x8d\xd7\x2b\xe1\xbc\xf3\xab\x30\x16\x69\xfd\x59\xa4\xc2\x99\x65\x3c\xda\x23\xd1\xa7\xcc\xf2\xc5\x67\x9f\xd1\x5f\x67\xf6\x5d\x40\xad\x6f\x44\x8d\x7d\xc4\x12\xb3\x30\x5f\xb7\xf5\x23\x94\x52\xa8\xf9\x17\x9d\x30\x0b\x5d\x0d\x53\xf6\xfc\x90\xd1\x3c\x37\xfa\xfb\xd3\x77\x6d\x55\x52\xf6\xfc\x45\xb1\x15\x13\x92\x4d\xf3\xb4\x37\x0e\xed\xce\x9b\x5d\xea\xbe\x31\xa1\x57\x57\x0b\xa9\x96\x5d\x75\xfc\x60\x8f\xfa\xcb\xc6\x1e\x3b\x67\x16\x06\x95\x56\xc0\xdf\xc7\x0d\xae\x97\xd6\x4a\xbd\x71\xd3\x23\x7c\x87\x13\x77\xbb\xb1\xee\xc8\xb6\x2d\x3b\x08\x2f\x8c\xb0\xad\x11\x3a\x4a\x2a\x4c\xe0\x22\x3c\x9e\x83\xfc\x5f\x99\x20\x48\xae\x32\x12\x6a\xfe\xc0\x17\x90\x64\xce\x51\x37\x73\x85\x9b\xd7\xd7\xcf\xc0\x33\x5b\x24\xaa\xae\x8c\x72\x9e\x87\x32\x14\x1e\x81\xd2\x76\xb1\xb8\xfd\xf9\xd8\xa3\x4d\xc4\x5c\x3f\x6b\x2a\x2a\x9f\xb0\x84\x3e\x29\xb9\xa4\x25\xac\x2b\xeb\x6e\xf3\x10\x76\x5d\xd1\x60\x42\x0d\xc4\x8a\x40\x8e\x6f\x54\x3f\xed\x8a\xc9\x0c\xfa\x15\xcc\xe9\xa4\x50\xd9\x73\xdc\x43\xf3\x7b\x70\xec\x25\xac\xc0\xe1\x6b\x67\xc4\x17\xff\xfd\xd5\xb3\x34\xf9\xf8\xa1\x57\x94\x23\xa2\xf4\xe3\x87\x57\x9a\x28\x30\xe2\xe7\xf0\x51\x77\x29\xdb\x54\x1d\x37\xc4\x1a\x93\x0b\x65\x45\x7f\x50\x69\x82\x19\xd0\x21\x51\xe5\xb3\xa5\xdf\xd1\xb9\x06\xe5\xec\x2e\xd4\x02\x21\x19\x6d\xb2\xd7\x83\x7f\x8b\x6a\x91\x1e\x14\x7e\xfd\x20\xac\xc1\xb0\xcc\x75\x3b\x40\x70\x00\xfa\xf6\xc7\x5f\x14\xca\xaf\xed\x5f\x18\x61\x61\x8c\x85\xb9\x82\x81\x1b\x5b\xd4\x28\x71\xbe\xfe\x9b\x2f\x44\x17\x68\x6c\x5e\x05\xf9\xc1\xeb\x17\x1a\x3f\x81\x98\x2f\x8a\x9a\x64\xe4\xa1\xe8\x6a\xdf\xd6\xfa\xa5\x77\xf3\xe3\xa8\x2c\x13\x0a\xc8\x67\x6d\x0f\xec\x19\xcd\x43\x7e\x89\x07\xae\x9b\xf0\xba\x36\xce\x7b\x8e\x72\xbf\x3c\xde\xf4\x52\x5d\xdd\xbb\xcc\xb1\x48\x59\x51\xa4\xbc\x33\xc3\x64\x49\x43\xe0\x34\x7c\x67\x86\xef\xcc\x31\x2c\x4d\x25\xf3\x7c\x35\x1e\x9e\x0d\x47\x03\x58\x9a\x69\x26\x64\x32\x1c\x7b\xf4\x28\x44\x4d\x32\x29\x27\x28\x05\xcf\x5d\x74\x33\xbb\x43\x3b\x21\x30\xf5\xda\xbb\xc6\x22\xc5\x0a\x14\x18\x33\x21\x9c\x76\x8b\xa8\x92\x68\xc6\x84\xcc\x08\x1e\x17\x04\x66\x81\xd2\x95\xf4\xa7\x5e\x33\x2c\xac\xd5\x9f\xc0\x06\xc3\x34\xd6\xcc\x2e\x9c\x5a\xc7\x45\x2f\x19\x88\x93\xea\x88\xe3\x6c\x74\x36\x0a\x50\x18\xbe\x80\xa2\xe0\xfe\xf5\xf1\x71\xe2\x83\x9c\x17\x70\xb1\xcb\x39\x82\xc9\x2b\x90\x6c\x5d\xaf\xa5\xbd\xc4\x1a\x48\x60\xb2\x25\x1b\xfb\xc9\x4c\xc6\x39\x18\x53\x37\xcf\xd8\x4b\x68\x45\x0a\x98\xd9\xad\xc0\xd3\x6e\xf6\xf6\xf8\x28\xdc\x5a\x6c\x35\xf5\x9c\x6e\x55\xbf\x80\x2b\x36\x91\x31\xf1\x9f\x27\x75\xa6\xf7\x4f\x1d\xf9\x8e\xc1\xf6\x75\xc7\x1b\xaa\xe6\x39\x29\xf3\xaa\xf7\x78\xf9\xe6\xea\xfd\x3c\xde\xa9\x60\x0a\x96\x04\xdf\xcb\x7e\x21\x05\xf7\x4a\x26\x04\x2c\x11\xaf\x89\x67\xef\x02\xfe\x07\xe2\xf9\xbb\x87\xe8\x78\xaf\x10\x25\x30\x98\x11\x07\x5f\x9b\x15\x15\x79\x36\x15\x36\x34\x9a\x37\x88\x29\x52\x9e\xb1\xc7\x7f\x19\xdd\x8a\xfd\x0d\xe0\x9a\x1f\x30\x7d\xa2\xb9\xce\x72\xb9\xa3\x51\x1a\xf2\xcf\x76\xf6\xe0\xe4\x7b\x99\x21\x3f\xd6\x13\x76\x7d\x89\xca\xc2\x73\x08\x37\x31\x93\x12\x9f\x26\x24\x56\x42\xc2\x1c\xae\x0d\x67\x92\x95\x45\xe4\x8c\x49\x03\xde\x85\x72\xa6\xd9\x54\x48\x61\x45\xd0\xca\x4e\x74\x92\xf4\x94\x55\xf1\xdd\xf5\xe3\x1f\xbf\xdc\xdc\x5d\xfd\xf1\x70\x7d\xff\xdb\xcd\xe5\xb5\xbf\x56\xf1\x44\x56\xce\x9d\x10\xea\x3e\xe9\x4c\xca\x80\xc0\x03\xdc\xc9\x92\xbf\x2b\xb9\xbe\x47\xb4\x7f\x15\x12\xca\x93\xa2\xf3\xc8\x52\x06\x7b\xf9\xc0\x02\xa5\x42\xe5\xf6\xbc\x05\x63\x5c\x45\x50\x05\x69\x02\xab\xe3\xda\xf0\x40\xe2\xdc\xb7\x99\x78\x24\x6c\xea\x09\xa7\x93\x8f\x67\x85\x32\x4b\xe1\x16\x33\x75\xe8\x3e\x94\x3a\x9e\x8d\x8a\xb5\x3a\x2a\x04\xd6\xed\x76\xa8\x66\x62\x3e\x28\x66\x0e\x11\x57\xf6\x0c\x59\xf0\xb0\xcc\xdf\xd4\xd5\xa6\xc1\x1d\xa7\xd2\xd1\x91\xbc\x41\x55\xdb\x02\xa4\xdb\xef\xb6\x2e\xb9\x82\x19\xcb\x64\xbb\xba\x8b\x35\x09\xcc\x63\x51\x32\x63\xee\x4a\x7d\x0a\x38\x0d\xaa\xcb\x3b\x4e\xc2\x0a\xce\x64\x9b\x97\xc0\x58\x46\x76\x3b\xc7\x85\x7c\x62\xeb\xce\x71\x9e\x29\x9a\x42\xa0\x4a\x7c\x52\xa8\x32\xd8\x0c\x74\x38\xba\x09\xa2\x5d\xb1\x9b\xe6\x15\x4e\xf8\x30\xb1\x49\x78\xd7\x5b\x24\xd5\x31\xfd\x89\x18\x87\x49\x6b\xdf\x38\x19\xb5\x19\x50\xba\x8e\x2e\xd0\x47\x7a\x3a\x07\x98\xcd\x80\xdb\xe2\x96\xab\xec\x96\xbd\x91\x52\xf6\x95\x0a\x13\x18\x10\x4a\x18\x36\xbb\xa8\x94\x39\xcf\xb4\x41\xd3\x01\xa9\x47\x81\x52\xf0\x65\xe9\xd3\x8b\x24\x41\x65\x72\xec\x7b\xb4\xa8\xf7\xab\xd7\xcf\xc2\x6d\x20\x07\x21\xb0\x88\xba\x7d\x4d\x93\x6a\xbb\xbe\x12\xe4\x71\x77\xb4\x23\x5a\xf6\x59\x38\xdf\x5c\xc6\x04\xf6\x9b\x12\x96\xb7\x98\xb8\x69\x3e\xbc\xf7\xd7\x08\xcd\x0f\x04\xda\xbf\xe0\x01\x45\x65\xf6\xaa\xe9\x0b\x36\xcf\x55\xad\x14\x6e\x0f\xa3\xd0\x21\x8f\x57\xdf\x76\x5b\x70\x60\x2f\x51\x4f\x9e\xfd\xae\x3f\xf2\x8d\x54\x4f\xfb\xdc\x0b\xd1\x94\xf1\x21\xcb\xec\x02\x49\xfc\x99\xc7\xd4\x70\x79\x96\xa3\xdd\x77\x59\x54\x5e\x06\xdf\xa3\x3c\xf4\x9b\x8b\x1f\xe2\xb6\x68\x8a\x68\x8d\x25\xa6\xb5\x50\xf3\x6a\xf5\x83\x12\x82\x3b\xee\xe5\x8a\xf4\x7c\xde\xf2\xe8\xf6\x7e\x88\x32\xd9\x8a\xb9\xc6\xea\x98\x16\x9f\x08\x33\xdd\x45\x71\x5c\x77\x71\x03\x4e\x8d\xd2\xb5\xc5\x04\x2a\xd1\x28\xdc\x8e\xee\x4f\xbd\x9e\xcf\x24\x92\xce\xbb\xcd\xed\x97\x09\xeb\xb0\x02\x9a\x7a\xe6\x97\xc2\x74\xb6\xb5\x27\x66\xf9\xa2\x21\xc9\x67\xd1\xef\x6a\x16\x97\xba\x0f\x5f\xcc\x1c\x6c\x40\xed\xa3\xfa\x9b\xef\x14\x49\xbf\x08\x95\x38\x3c\x1e\x16\x50\x0d\x83\x78\xa6\x6e\x1e\xd1\x67\x16\xb3\xea\x32\xee\xad\xbf\x59\xfa\xe1\x23\x13\x25\xdc\xc3\xac\x65\xcd\x12\x78\xbd\x9e\xab\xdf\x14\xf7\xa5\xc0\x03\x94\x31\xd9\xf4\x9f\xc0\x6d\x4f\xa6\xd8\xf1\xbd\x4c\xb4\xeb\xd8\x69\xe7\x9d\x76\x07\xd6\x47\x65\x98\x6c\xa6\xfe\xec\x82\xfb\xe8\xe5\xe8\xdf\x01\x00\x00\xff\xff\x01\x81\x50\x2d\xb3\x27\x00\x00") - -func coredns119JsonBytes() ([]byte, error) { - return bindataRead( - _coredns119Json, - "coredns-1.19.json", - ) -} - -func coredns119Json() (*asset, error) { - bytes, err := coredns119JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "coredns-1.19.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0x8d, 0x3f, 0x60, 0xae, 0x0, 0x84, 0xaa, 0x11, 0xe6, 0x42, 0x56, 0xc5, 0xa9, 0x7d, 0xfb, 0xf, 0x61, 0x8, 0x58, 0x94, 0x36, 0xd4, 0x33, 0xff, 0x22, 0xac, 0x2a, 0x17, 0x78, 0x79, 0xfd}} - return a, nil -} - -var _coredns120Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x6f\x1b\x39\x0e\x7f\xcf\xa7\x18\x0c\xd0\xb7\xb5\x63\x37\x9b\x5e\x36\x6f\xd9\x24\xd7\x0d\xae\xc9\x19\x49\xba\x2f\xd7\xc5\x42\xd6\xd0\xb6\xce\x1a\x51\x47\x69\x9c\x78\x8b\x7c\xf7\x83\xe6\x8f\x3d\x7f\xa4\xb1\x9d\x4d\x17\x3d\xe0\xfc\xd0\x4e\x46\x24\x45\x91\x3f\x52\xa4\x34\x5f\x8f\xa2\x28\x66\x5a\xfc\x0a\x64\x04\xaa\xf8\x3c\x8a\x57\xe3\xf8\x07\xf7\x56\x58\x48\x4d\x7c\x1e\xfd\xeb\x28\x8a\xa2\xe8\x6b\xfe\x6f\x88\x38\x1f\x59\x0a\x95\xb8\x77\x0f\x40\x2b\xc1\x61\x3b\x90\x82\x65\x09\xb3\x2c\x3e\xdf\x88\x71\x82\x94\x42\xcb\xac\x40\x65\x1a\x03\x51\x14\x6b\xc2\x14\xec\x02\x32\x33\x14\x78\xac\x91\xac\x93\xfb\xd3\xf8\xf4\x64\x23\xd4\x43\x67\x38\x31\x0d\x8e\xd2\x52\x06\xf1\x86\xf0\x65\xcb\x13\x4b\x36\x05\xd9\x99\x0f\x96\x66\xc8\x52\xf6\x07\x2a\xf6\x64\x86\x1c\xd3\x63\x8e\xa9\x46\x05\x2a\x9f\x78\x99\x4d\x61\x90\x28\xd3\x9c\x7c\x79\x66\x06\x4c\xeb\x1e\x82\x6c\x0a\xa4\xc0\x42\xae\x1d\x97\x99\xb1\x40\x03\x53\x5a\xa7\x52\xb3\x87\x45\xb1\x34\xa7\xbb\x44\x82\xab\xbb\x07\xff\x8a\x2a\x22\x8f\x0e\xf9\x98\xd1\x8c\x6f\x09\xcc\xda\x58\x48\x2b\x49\x1b\x39\xb1\xd1\xc0\x9b\xee\x71\x56\xdf\xba\xbf\xf8\xd5\x8d\x56\x9b\xba\xbd\xf2\x92\x3b\x3e\x8f\x4e\x4f\xda\xef\x09\x2d\x72\x94\x8e\xed\xf3\xd5\xa4\xcd\x66\x19\xcd\xc1\x4e\x2a\xe6\xda\xe0\xcb\x0f\x7b\xe9\x31\xb0\x5c\xbf\x46\x97\xc7\xcb\x43\x74\xd9\x3c\xff\x56\x33\xb6\x01\x09\xdc\x22\xb5\xc1\xe5\xc3\x89\xd7\x93\x06\x8c\x0b\xab\x8b\xd9\x4c\x28\x61\xd7\x8e\xe1\x0e\x55\x1d\x21\xb1\x5d\x17\x00\xbf\x2c\xc0\x74\x33\xd9\x78\xf2\xa8\x26\xed\xf0\x58\xbd\xe0\x1c\x33\x65\x0f\x0c\xd9\x3f\x1d\x58\x1c\x09\xf6\x8a\xab\x5e\xe4\x77\xa5\xec\x06\xfe\x81\xe6\xea\x9a\xc2\xc5\xe4\x4c\xc8\x7c\x82\xe1\xf9\xe9\x49\xf4\xf5\x8b\x72\x03\x40\x84\x64\x8a\xe7\x05\x30\x69\x17\xc5\xf3\x36\xb2\xa3\x32\x13\x0c\x25\x72\x26\x23\xa1\x06\x2c\x49\x68\xc8\x48\xb3\x48\xe8\x0f\xc5\x43\x29\x2d\x8a\x34\x26\x26\x12\xca\x00\xcf\x08\xaa\x97\x33\x26\xa5\x5d\x10\x66\xf3\x85\x9f\xbf\x20\x7c\x29\xfe\xdb\x66\xc9\xe8\xdc\xe5\xd0\xe2\xed\x0c\xe9\x89\x51\x12\x0d\xa3\x63\xb0\xfc\x98\xc0\xa0\x5c\x0d\x39\xaa\x59\x31\xce\x19\x5f\x40\x74\x32\x2a\xfe\x92\x88\xba\x78\x22\x90\xc8\x92\xea\x2d\x4b\xa6\x4c\x32\xc5\xe1\x8b\x7a\xf9\xa2\xba\x79\xa5\xc2\xd9\x25\xaa\x99\x98\xdf\x32\xfd\x7f\x88\xd5\x20\xc6\xb4\x36\xc7\xbe\xb0\xbc\x02\x2d\x71\x9d\xc2\x77\x1c\x92\x6f\xb5\x6f\xbd\xc6\xb4\x7d\xdb\x16\xe1\x9c\xc0\x98\x2b\x60\x89\x14\x0a\x1e\x80\xa3\x4a\x9c\x15\x3e\x8c\x46\xb5\x39\x08\xb4\x14\x9c\xb9\x81\xf7\x8d\xd7\x2b\xe1\xbc\xf3\x8b\x30\x16\x69\xfd\x49\xa4\xc2\x99\x65\x3c\xda\x23\xd1\xa7\xcc\xf2\xc5\x27\x9f\xd1\x5f\x67\xf6\x5d\x40\xad\x6f\x44\x8d\x7d\xc4\x12\xb3\x30\x5f\xb7\xf5\x23\x94\x52\xa8\xf9\x67\x9d\x30\x0b\x5d\x0d\x53\xf6\xfc\x90\xd1\x3c\x37\xfa\xfb\xd3\x77\x6d\x55\x52\xf6\xfc\x59\xb1\x15\x13\x92\x4d\xf3\xb4\x37\x0e\xed\xce\x9b\x5d\xea\xbe\x31\xa1\x57\x57\x0b\xa9\x96\x5d\x75\xfc\x60\x8f\xfa\xcb\xc6\x1e\x3b\x67\x16\x06\x95\x56\xc0\xdf\xc7\x0d\xae\x97\xd6\x4a\xbd\x71\xd3\x23\x7c\x87\x13\x77\xbb\xb1\xee\xc8\xb6\x2d\x3b\x08\x2f\x8c\xb0\xad\x11\x3a\x4a\x2a\x4c\xe0\x22\x3c\x9e\x83\xfc\x3f\x99\x20\x48\xae\x32\x12\x6a\xfe\xc0\x17\x90\x64\xce\x51\x37\x73\x85\x9b\xd7\xd7\xcf\xc0\x33\x5b\x24\xaa\xae\x8c\x72\x9e\x87\x32\x14\x1e\x81\xd2\x76\xb1\xb8\xfd\xf9\xd8\xa3\x4d\xc4\x5c\x3f\x6b\x2a\x2a\x9f\xb0\x84\x3e\x29\xb9\xa4\x25\xac\x2b\xeb\x6e\xf3\x10\x76\x5d\xd1\x60\x42\x0d\xc4\x8a\x40\x8e\x6f\x54\x3f\xed\x8a\xc9\x0c\xfa\x15\xcc\xe9\xa4\x50\xd9\x73\xdc\x43\xf3\x5b\x70\xec\x25\xac\xc0\xe1\x6b\x67\xc4\x17\x7f\xfd\xea\x59\x9a\x7c\xf8\xb1\x57\x94\x23\xa2\xf4\xc3\x8f\xaf\x34\x51\x60\xc4\xcf\xe1\xa3\xee\x52\xb6\xa9\x3a\x6e\x88\x35\x26\x17\xca\x8a\xfe\xa0\xd2\x04\x33\xa0\x43\xa2\xca\x67\x4b\xbf\xa3\x73\x0d\xca\xd9\x5d\xa8\x05\x42\x32\xda\x64\xaf\x07\xff\x16\xd5\x22\x3d\x28\xfc\xfa\x41\x58\x83\x61\x99\xeb\x76\x80\xe0\x00\xf4\xed\x8f\xbf\x28\x94\x5f\xdb\xbf\x30\xc2\xc2\x18\x0b\x73\x05\x03\x37\xb6\xa8\x51\xe2\x7c\xfd\x0f\x5f\x88\x2e\xd0\xd8\xbc\x0a\xf2\x83\xd7\x2f\x34\x7e\x02\x31\x5f\x14\x35\xc9\xc8\x43\xd1\xd5\xbe\xad\xf5\x4b\xef\xe6\xc7\x51\x59\x26\x14\x90\xcf\xda\x1e\xd8\x33\x9a\x87\xfc\x12\x0f\x5c\x37\xe1\x75\x6d\x9c\xf7\x1c\xe5\x7e\x79\xbc\xe9\xa5\xba\xba\x77\x99\x63\x91\xb2\xa2\x48\x79\x67\x86\xc9\x92\x86\xc0\x69\xf8\xce\x0c\xdf\x99\x63\x58\x9a\x4a\xe6\xf9\x6a\x3c\x3c\x1b\x9e\x0c\x60\x69\xa6\x99\x90\xc9\x70\xec\xd1\xa3\x10\x35\xc9\xa4\x9c\xa0\x14\x3c\x77\xd1\xcd\xec\x0e\xed\x84\xc0\xd4\x6b\xef\x1a\x8b\x14\x2b\x50\x60\xcc\x84\x70\xda\x2d\xa2\x4a\xa2\x19\x13\x32\x23\x78\x5c\x10\x98\x05\x4a\x57\xd2\x9f\x7a\xcd\xb0\xb0\x56\x7f\x04\x1b\x0c\xd3\x58\x33\xbb\x70\x6a\x1d\x17\xbd\x64\x20\x4e\xaa\x23\x8e\xb3\xd1\xd9\x28\x40\x61\xf8\x02\x8a\x82\xfb\x97\xc7\xc7\x89\x0f\x72\x5e\xc0\xc5\x2e\xe7\x08\x26\xaf\x40\xb2\x75\xbd\x96\xf6\x12\x6b\x20\x81\xc9\x96\x6c\xec\x27\x33\x19\xe7\x60\x4c\xdd\x3c\x63\x2f\xa1\x15\x29\x60\x66\xb7\x02\x4f\xbb\xd9\xdb\xe3\xa3\x70\x6b\xb1\xd5\xd4\x73\xba\x55\xfd\x02\xae\xd8\x44\xc6\xc4\x7f\x9e\xd4\x99\xde\x3f\x75\xe4\x3b\x06\xdb\xd7\x1d\x6f\xa8\x9a\xe7\xa4\xcc\xab\xde\xe3\xe5\x9b\xab\xf7\xd3\x78\xa7\x82\x29\x58\x12\x7c\x2f\xfb\x85\x14\xdc\x2b\x99\x10\xb0\x44\xbc\x26\x9e\xbd\x0b\xf8\x1f\x88\xe7\x6f\x1e\xa2\xe3\xbd\x42\x94\xc0\x60\x46\x1c\x7c\x6d\x56\x54\xe4\xd9\x54\xd8\xd0\x68\xde\x20\xa6\x48\x79\xc6\x1e\xff\x6d\x74\x2b\xf6\x37\x80\x6b\x7e\xc0\xf4\x89\xe6\x3a\xcb\xe5\x8e\x46\x69\xc8\x3f\xdb\xd9\x83\x93\xef\x65\x86\xfc\x58\x4f\xd8\xf5\x25\x2a\x0b\xcf\x21\xdc\xc4\x4c\x4a\x7c\x9a\x90\x58\x09\x09\x73\xb8\x36\x9c\x49\x56\x16\x91\x33\x26\x0d\x78\x17\xca\x99\x66\x53\x21\x85\x15\x41\x2b\x3b\xd1\x49\xd2\x53\x56\xc5\x77\xd7\x8f\xbf\xff\x7c\x73\x77\xf5\xfb\xc3\xf5\xfd\xaf\x37\x97\xd7\xfe\x5a\xc5\x13\x59\x39\x77\x42\xa8\xfb\xa4\x33\x29\x03\x02\x0f\x70\x27\x4b\xfe\xa9\xe4\xfa\x1e\xd1\xfe\x5d\x48\x28\x4f\x8a\xce\x23\x4b\x19\xec\xe5\x03\x0b\x94\x0a\x95\xdb\xf3\x16\x8c\x71\x15\x41\x15\xa4\x09\xac\x8e\x6b\xc3\x03\x89\x73\xdf\x66\xe2\x91\xb0\xa9\x27\x9c\x4e\x3e\x9e\x15\xca\x2c\x85\x5b\xcc\xd4\xa1\xfb\x50\xea\x78\x36\x2a\xd6\xea\xa8\x10\x58\xb7\xdb\xa1\x9a\x89\xf9\xa0\x98\x39\x44\x5c\xd9\x33\x64\xc1\xc3\x32\x7f\x53\x57\x9b\x06\x77\x9c\x4a\x47\x47\xf2\x06\x55\x6d\x0b\x90\x6e\xbf\xdb\xba\xe4\x0a\x66\x2c\x93\xed\xea\x2e\xd6\x24\x30\x8f\x45\xc9\x8c\xb9\x2b\xf5\x29\xe0\x34\xa8\x2e\xef\x38\x09\x2b\x38\x93\x6d\x5e\x02\x63\x19\xd9\xed\x1c\x17\xf2\x89\xad\x3b\xc7\x79\xa6\x68\x0a\x81\x2a\xf1\x49\xa1\xca\x60\x33\xd0\xe1\xe8\x26\x88\x76\xc5\x6e\x9a\x57\x38\xe1\xc3\xc4\x26\xe1\x5d\x6f\x91\x54\xc7\xf4\x47\x62\x1c\x26\xad\x7d\xe3\x64\xd4\x66\x40\xe9\x3a\xba\x40\x1f\xe9\xe9\x1c\x60\x36\x03\x6e\x8b\x5b\xae\xb2\x5b\xf6\x46\x4a\xd9\x57\x2a\x4c\x60\x40\x28\x61\xd8\xec\xa2\x52\xe6\x3c\xd3\x06\x4d\x07\xa4\x1e\x05\x4a\xc1\x97\xa5\x4f\x2f\x92\x04\x95\xc9\xb1\xef\xd1\xa2\xde\xaf\x5e\x3f\x0b\xb7\x81\x1c\x84\xc0\x22\xea\xf6\x35\x4d\xaa\xed\xfa\x4a\x90\xc7\xdd\xd1\x8e\x68\xd9\x67\xe1\x7c\x73\x19\x13\xd8\x6f\x4a\x58\xde\x62\xe2\xa6\xf9\xf1\xbd\xbf\x46\x68\x7e\x20\xd0\xfe\x05\x0f\x28\x2a\xb3\x57\x4d\x5f\xb0\x79\xae\x6a\xa5\x70\x7b\x18\x85\x0e\x79\xbc\xfa\xb6\xdb\x82\x03\x7b\x89\x7a\xf2\xec\x77\xfd\x91\x6f\xa4\x7a\xda\xe7\x5e\x88\xa6\x8c\x0f\x59\x66\x17\x48\xe2\x8f\x3c\xa6\x86\xcb\xb3\x1c\xed\xbe\xcb\xa2\xf2\x32\xf8\x1e\xe5\xa1\xdf\x5c\x7c\x17\xb7\x45\x53\x44\x6b\x2c\x31\xad\x85\x9a\x57\xab\x1f\x94\x10\xdc\x71\x2f\x57\xa4\xe7\xf3\x96\x47\xb7\xf7\x43\x94\xc9\x56\xcc\x35\x56\xc7\xb4\xf8\x48\x98\xe9\x2e\x8a\xe3\xba\x8b\x1b\x70\x6a\x94\xae\x2d\x26\x50\x89\x46\xe1\x76\x74\x7f\xea\xf5\x7c\x26\x91\x74\xde\x6d\x6e\xbf\x4c\x58\x87\x15\xd0\xd4\x33\xbf\x14\xa6\xb3\xad\x3d\x31\xcb\x17\x0d\x49\x3e\x8b\x7e\x53\xb3\xb8\xd4\x7d\xf8\x62\xe6\x60\xdf\x4c\xed\x44\x18\x8e\x2b\xa0\x75\x19\x47\x7f\xce\xbb\x52\xfc\x15\xce\x39\xaa\xbf\xf9\x46\xf9\xe2\x67\xa1\x12\x17\x75\x87\xa5\x8d\x86\xbd\x3c\x53\x37\x2f\x22\x32\x8b\x59\x75\xe5\xf8\xd6\x5f\x66\x7d\xf7\xf9\x07\x25\xdc\xc3\xac\x65\xcd\x12\xa7\xbd\x9e\xab\xdf\x87\xf7\x25\xfa\x03\x94\x31\xd9\xf4\xdf\xc0\x6d\x4f\x3e\xdc\xf1\x55\x50\xb4\xeb\x70\x6d\xe7\xcd\x7d\x07\xd6\x47\x65\xf0\x6c\xa6\xfe\xe4\xa2\xe4\xe8\xe5\xe8\xbf\x01\x00\x00\xff\xff\xfb\xb7\x82\x44\x99\x28\x00\x00") - -func coredns120JsonBytes() ([]byte, error) { - return bindataRead( - _coredns120Json, - "coredns-1.20.json", - ) -} - -func coredns120Json() (*asset, error) { - bytes, err := coredns120JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "coredns-1.20.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0x95, 0x2e, 0x4e, 0x5, 0x56, 0xf8, 0xe4, 0x8, 0xf6, 0xc3, 0xef, 0x2e, 0x9, 0x61, 0xda, 0x19, 0x9e, 0xb8, 0x55, 0xa9, 0xf2, 0x89, 0xb8, 0x37, 0x66, 0x78, 0x3, 0x9d, 0x4, 0xc4, 0xfc}} - return a, nil -} - -var _coredns121Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdf\x6f\x1b\x39\xee\x7f\xcf\x5f\x31\x18\xa0\x6f\xb5\x63\x37\x49\xbf\xd9\xbc\x65\x93\x6c\x37\xf8\x36\x39\x23\x4e\xf7\xe5\xba\x58\xc8\x1a\xda\xd6\x59\x23\xea\x28\x8d\x13\x6f\x91\xff\xfd\x30\xbf\x3c\xbf\xa4\xb1\x9d\x4d\x17\x3d\xe0\xfc\xd0\x3a\x12\x49\x51\xe4\x87\x14\x29\xf9\xdb\x51\x10\x84\x4c\x8b\xdf\x80\x8c\x40\x15\x5e\x04\xe1\x7a\x1c\xbe\x4f\x47\x85\x85\xd8\x84\x17\xc1\x3f\x8f\x82\x20\x08\xbe\x65\xff\xfa\x88\xb3\x99\x95\x50\x51\x3a\x36\x05\x5a\x0b\x0e\xd5\x44\x0c\x96\x45\xcc\xb2\xf0\x62\x2b\x26\x15\xa4\x14\x5a\x66\x05\x2a\xd3\x98\x08\x82\x50\x13\xc6\x60\x97\x90\x98\xa1\xc0\x63\x8d\x64\x53\xb9\x3f\x8d\xcf\x4e\xb6\x42\x1d\x74\x86\x13\xd3\x90\x52\x5a\x4a\x20\xdc\x12\xbe\x54\x3c\xa1\x64\x33\x90\x9d\xf5\x60\x65\x86\x2c\x66\x7f\xa2\x62\x4f\x66\xc8\x31\x3e\xe6\x18\x6b\x54\xa0\xb2\x85\x57\xc9\x0c\x06\x91\x32\xcd\xc5\x57\xe7\x66\xc0\xb4\xee\x21\x48\x66\x40\x0a\x2c\x64\xda\x71\x99\x18\x0b\x34\x30\x85\x75\x4a\x35\x7b\x58\x14\x8b\x33\xba\x2b\x24\xb8\xbe\x9f\xba\x77\x54\x12\x39\x74\xc8\xe6\x8c\x66\xbc\x22\x30\x1b\x63\x21\x2e\x25\x6d\xe5\x84\x46\x03\x6f\xba\x47\xe8\x5f\x58\x2c\xa4\x80\x0a\x03\xc5\xcc\xed\x64\x7d\x5a\xe9\xf2\xfb\xfb\x0e\xcf\x66\x82\x52\xf0\x4d\x86\x05\xa1\x16\x12\xa6\x96\xf1\x55\x5d\xb1\xd4\xa5\x6d\xb9\x75\x8f\xd4\xf6\xd5\x36\x6b\xc1\x1d\x5e\x04\x67\x27\xed\x71\x42\x8b\x1c\x65\xca\xf6\xe5\x7a\xd2\x66\xb3\x8c\x16\x60\x27\x25\x73\x6d\xf2\xe5\xfd\x5e\x7a\x0c\x2c\xd7\xaf\xd1\xe5\xf1\xea\x10\x5d\x9c\x96\x35\x20\x81\x5b\xa4\x36\x72\x5d\x20\x74\xc2\xc4\x80\x49\x63\xf6\x72\x3e\x17\x4a\xd8\xcc\x37\xf7\xa8\xea\xf0\x0b\xed\x26\x8f\x9e\xab\x1c\xa9\xb7\x93\x2d\x4c\x8e\x6a\xd2\x0e\x4f\x04\x97\x9c\x63\xa2\xec\x81\xf9\xe0\x2f\x47\x2d\x47\x82\xbd\x82\xb6\x37\xac\xba\x52\x76\x47\xd5\x81\xe6\xea\x9a\x22\x0d\xf8\xb9\x90\xd9\x02\xc3\x8b\xb3\x93\xe0\xdb\x57\x95\x4e\x00\x11\x92\xc9\xbf\x2f\x81\x49\xbb\xcc\xbf\x57\x69\x23\x28\xd2\xcc\x50\x22\x67\x32\x10\x6a\xc0\xa2\x88\x86\x8c\x34\x0b\x84\xfe\x98\x7f\x29\xa4\x05\x81\xc6\xc8\x04\x42\x19\xe0\x09\x41\x39\x38\x67\x52\xda\x25\x61\xb2\x58\xba\xf9\x73\xc2\x97\xfc\xbf\x2a\x05\x07\x17\x69\x82\xce\x47\xe7\x48\x4f\x8c\xa2\x60\x18\x1c\x83\xe5\xc7\x04\x06\xe5\x7a\xc8\x51\xcd\xf3\x79\xce\xf8\x12\x82\x93\x51\xfe\x97\x44\xd4\xf9\x37\x02\x89\x2c\x2a\x47\x59\x34\x63\x92\x29\x0e\x5f\xd5\xcb\x57\xd5\x4d\x5a\x25\xce\xae\x50\xcd\xc5\xe2\x8e\xe9\xff\x41\xac\x06\x31\xa6\xb5\x39\x76\x85\xe5\x35\x68\x89\x9b\x18\x7e\xe0\x90\x7c\xab\x43\xf1\x35\xa6\xed\x39\x13\x35\xe1\x82\xc0\x98\x6b\x60\x91\x14\x0a\xa6\xc0\x51\x45\xa9\x15\x3e\x8e\x46\xb5\x35\x08\xb4\x14\x9c\xa5\x13\x1f\x1a\xc3\x6b\x91\x7a\xe7\x57\x61\x2c\xd2\xe6\xb3\x88\x45\x6a\x96\xf1\x68\x8f\x44\x1f\x33\xcb\x97\x9f\x5d\x46\x7f\x9d\xd9\x77\x01\xb5\x7e\x10\x35\xce\x11\x4b\xcc\xc2\x62\xd3\xd6\x8f\x50\x4a\xa1\x16\x5f\x74\xc4\x2c\x74\x35\x8c\xd9\xf3\x34\xa1\x45\x66\xf4\x0f\x67\xef\xda\xaa\xc4\xec\xf9\x8b\x62\x6b\x26\x24\x9b\x65\x69\x6f\xec\x3b\x9d\xb7\xa7\xd4\x43\x63\x41\xa7\xae\x16\x62\x2d\xbb\xea\xb8\xc1\x1e\xf4\xd7\xa4\x3d\x76\x4e\x2c\x0c\x4a\xad\x80\x7f\x08\x1b\x5c\x2f\xad\x9d\x3a\xe3\xa6\x47\xf8\x0e\x27\xee\x76\x63\xdd\x91\x6d\x5b\x76\x10\x9e\x1b\xa1\xaa\x11\x3a\x4a\x2a\x8c\xe0\xd2\x3f\x9f\x81\xfc\xdf\x89\x20\x88\xae\x13\x12\x6a\x31\xe5\x4b\x88\x92\xd4\x51\xb7\x0b\x85\xdb\xe1\x9b\x67\xe0\x89\xcd\x13\x55\x57\x46\xb1\xce\xb4\x08\x85\x47\xa0\xb8\x5d\x2c\x56\x1f\x17\x7b\xb0\x8d\x98\x9b\x67\x4d\x79\xe5\xe3\x97\xd0\x27\x25\x93\xb4\x82\x4d\x69\xdd\x2a\x0f\x61\xd7\x15\x0d\x26\xd4\x40\x2c\x0f\xe4\xf0\x56\xf5\xd3\xae\x99\x4c\x3a\x75\xb6\x83\x4e\x0a\x95\x3c\x87\x3d\x34\xbf\x7b\xe7\x5e\xfc\x0a\x1c\xbe\x77\x46\x7c\xf9\xf7\xef\x9e\xc5\xd1\xc7\xd3\x5e\x51\x29\x11\xc5\x1f\x4f\x5f\x69\x22\xcf\x8c\x9b\xc3\x45\xdd\xa5\x6c\x53\x75\xdc\x10\x6a\x8c\x2e\x95\x15\xfd\x41\xa5\x09\xe6\x40\x87\x44\x95\xcb\x96\x6e\x47\x67\x1a\x14\xab\xa7\xa1\xe6\x09\xc9\x60\x9b\xbd\xa6\xee\x23\xaa\x45\x7a\x50\xf8\xf5\x83\xb0\x06\xc3\x22\xd7\xed\x00\xc1\x01\xe8\xdb\x1f\x7f\x81\x2f\xbf\xb6\x3f\x7e\x84\xf9\x31\xe6\xe7\xf2\x06\x6e\x68\x51\xa3\xc4\xc5\xe6\xff\x5d\x21\xba\x44\x63\xb3\x2a\xc8\x0d\x5e\xb7\xd0\xf0\x09\xc4\x62\x99\xd7\x24\x23\x07\x45\x57\xfb\xb6\xd6\x2f\xbd\x87\x1f\x47\x65\x99\x50\x40\x2e\x6b\x3b\x60\xcf\x68\xe1\xf3\x4b\x38\x48\xbb\x09\xa7\x6b\xc3\xac\xe7\x28\xce\xcb\xe3\x6d\x2f\xd5\xd5\xbd\xcb\x1c\x8a\x98\xe5\x45\xca\x3b\x33\x8c\x56\x34\x04\x4e\xc3\x77\x66\xf8\xce\x1c\xc3\xca\x94\x32\x2f\xd6\xe3\xe1\xf9\xf0\x74\x00\x2b\x33\x4b\x84\x8c\x86\x63\x87\x1e\xb9\xa8\x49\x22\x65\x75\x1b\x72\x3b\xbf\x47\x3b\x21\x30\xf5\xda\xbb\xc6\x22\xc5\x1a\x14\x18\x33\x21\x9c\x75\x8b\xa8\x82\x68\xce\x84\x4c\x08\x1e\x97\x04\x66\x89\x32\x2d\xe9\xcf\x9c\x66\x58\x5a\xab\x3f\x81\xf5\x86\x69\xa8\x99\x5d\xa6\x6a\x1d\xe7\xbd\xa4\x27\x4e\xca\x2b\x8e\xf3\xd1\xf9\xc8\x43\x61\xf8\x12\xf2\x82\xfb\xd7\xc7\xc7\x89\x0b\x72\x4e\xc0\x85\x69\xce\x11\x4c\x5e\x83\x64\x9b\x7a\x2d\xed\x24\xd6\x40\x02\xa3\x8a\x6c\xec\x26\x33\x09\xe7\x60\x4c\xdd\x3c\x63\x27\xa1\x15\x31\x60\x62\x2b\x81\x67\xdd\xec\xed\xf0\x91\xbf\xb5\xa8\x34\x75\xdc\x6e\x95\x1f\x8f\x2b\xb6\x91\x31\x71\xdf\x27\x75\x96\x77\x2f\x1d\xb8\xae\xc1\xf6\x75\xc7\x1b\xaa\xe6\xb8\x29\x73\xaa\xf7\x78\xf5\xe6\xea\xfd\x34\xde\xa9\x60\x0c\x96\x04\xdf\xcb\x7e\x3e\x05\xf7\x4a\x26\x04\x2c\x12\xaf\x89\x67\xe7\x06\xfe\x0b\xe2\xf9\xbb\x87\xe8\x78\xaf\x10\x25\x30\x98\x10\x07\x57\x9b\x15\xe4\x79\x36\x16\xd6\x37\x9b\x35\x88\x31\x52\x96\xb1\xc7\xff\x37\xba\x13\xfb\x1b\x20\x6d\x7e\xc0\xf4\x89\xe6\x3a\xc9\xe4\x8e\x46\xb1\xcf\x3f\xd5\xea\xde\xc5\xf7\x32\x43\x76\xad\x27\xec\xe6\x0a\x95\x85\x67\x1f\x6e\x42\x26\x25\x3e\x4d\x48\xac\x85\x84\x05\xdc\x18\xce\x24\x2b\x8a\xc8\x39\x93\x06\x9c\x1b\xe5\x4c\xb3\x99\x90\xc2\x0a\xaf\x95\x53\xd1\x51\xd4\x53\x56\x85\xf7\x37\x8f\x7f\xfc\x7c\x7b\x7f\xfd\xc7\xf4\xe6\xe1\xb7\xdb\xab\x1b\x77\xad\xe2\x88\xac\x8c\x3b\x22\xd4\x7d\xd2\x99\x94\x1e\x81\x07\xb8\x93\x45\xff\x50\x72\xf3\x80\x68\x7f\x11\x12\x8a\x9b\xa2\x8b\xc0\x52\x02\x7b\xf9\xc0\x02\xc5\x42\x65\xf6\xbc\x03\x63\xd2\x8a\xa0\x0c\xd2\x08\xd6\xc7\xb5\xe9\x81\xc4\x85\xeb\x30\x71\x48\xd8\xd6\x13\xa9\x4e\x2e\x9e\x35\xca\x24\x86\x3b\x4c\xd4\xa1\xe7\x50\x9c\xf2\x6c\x55\xac\xd5\x51\x3e\xb0\x56\xc7\xa1\x9a\x8b\xc5\x20\x5f\xd9\x47\x5c\xda\xd3\x67\xc1\xc3\x32\x7f\x53\x57\x1b\x7b\x4f\x9c\x52\xc7\x94\xe4\x0d\xaa\xda\x16\x20\xd3\xf3\xae\x72\xc9\x35\xcc\x59\x22\xdb\xd5\x5d\xa8\x49\x60\x16\x8b\x92\x19\x73\x5f\xe8\x93\xc3\x69\x50\xbe\x0c\x72\x12\x56\x70\x26\xdb\xbc\x04\xc6\x32\xb2\xd5\x1a\x97\xf2\x89\x6d\x3a\xd7\x79\x26\x6f\x0a\x81\x4a\xf1\x51\xae\xca\x60\x3b\xd1\xe1\xe8\x26\x88\x76\xc5\x6e\x9a\x4f\x38\xfe\xcb\xc4\x26\xe1\x7d\x6f\x91\x54\xc7\xf4\x27\x62\x1c\x26\xad\x73\xe3\x64\xd4\x66\x40\x99\x76\x74\x9e\x3e\xd2\xd1\x39\xc0\x7c\x0e\xdc\xe6\xaf\x5c\x45\xb7\xec\x8c\x94\xa2\xaf\x54\x18\xc1\x80\x50\xc2\xb0\xd9\x45\xc5\x2c\xf5\x4c\x1b\x34\x1d\x90\x3a\x14\x28\x04\x5f\x15\x3e\xbd\x8c\x22\x54\x26\xc3\xbe\x43\x8b\x7a\xbf\x7a\xf3\x2c\xd2\x03\xe4\x20\x04\xe6\x51\xb7\xaf\x69\x62\x6d\x37\xd7\x82\x1c\xee\x0e\x76\x44\xcb\x3e\x1b\xe7\xdb\xc7\x18\xcf\x79\x53\xc0\xf2\x0e\xa3\x74\x99\xd3\x0f\xee\x1a\xa1\xf9\xeb\x83\xf6\xc7\x7b\x41\x51\x9a\xbd\x6c\xfa\xbc\xcd\x73\x59\x2b\xf9\xdb\xc3\xc0\x77\xc9\xe3\xd4\xb7\xdd\x16\x1c\xd8\x4b\xd4\x93\x67\xbf\xeb\x8f\x5c\x33\xe5\xb7\x7d\xde\x85\x68\xc6\xf8\x90\x25\x76\x89\x24\xfe\xcc\x62\x6a\xb8\x3a\xcf\xd0\xee\x7a\x2c\x2a\x1e\x83\x1f\x50\x1e\xfa\x83\x8e\x1f\xe2\xb5\x68\x86\x68\x8d\x25\xa6\xb5\x50\x8b\x72\xf7\x83\x02\x82\x3b\xde\xe5\xf2\xf4\x7c\xd1\xf2\x68\xf5\x3e\x44\x89\x6c\xc5\x5c\x63\x77\x4c\x8b\x4f\x84\x89\xee\xa2\x38\xac\xbb\xb8\x01\xa7\x46\xe9\xda\x62\x02\x15\x69\x14\xe9\x89\xee\x4e\xbd\x8e\x9f\x49\x44\x9d\xb1\xed\xeb\x97\xf1\xeb\xb0\x06\x9a\x39\xd6\x97\xc2\x74\x8e\xb5\x27\x66\xf9\xb2\x21\xc9\x65\xd1\xef\x6a\x96\x34\x75\x1f\xbe\x99\x05\xd8\x37\x53\x3b\x12\x86\xe3\x1a\x68\x53\xc4\xd1\x5f\xf3\xae\x14\x7f\x87\x73\x8e\xea\x23\xdf\x29\x5f\xfc\x2c\x54\x94\x46\xdd\x61\x69\xa3\x61\x2f\xc7\xd2\xcd\x87\x88\xc4\x62\x52\x3e\x39\xbe\xf5\xcf\xbe\x7e\xf8\xfc\x83\x12\x1e\x60\xde\xb2\x66\x81\xd3\x5e\xcf\xd5\xdf\xc3\xfb\x12\xfd\x01\xca\x98\x64\xf6\x2f\xe0\xb6\x27\x1f\xee\xf8\x55\x50\xb0\xeb\x72\x6d\xe7\xcb\x7d\x07\xd6\x47\x45\xf0\x6c\x97\xfe\x9c\x46\xc9\xd1\xcb\xd1\x7f\x02\x00\x00\xff\xff\xba\x18\xe8\xd1\xf6\x28\x00\x00") - -func coredns121JsonBytes() ([]byte, error) { - return bindataRead( - _coredns121Json, - "coredns-1.21.json", - ) -} - -func coredns121Json() (*asset, error) { - bytes, err := coredns121JsonBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "coredns-1.21.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x17, 0x85, 0x5c, 0xa4, 0xad, 0xa7, 0x1, 0xa9, 0xb8, 0x6b, 0x7c, 0xa2, 0x47, 0xd7, 0x3d, 0x4, 0x21, 0xb, 0x38, 0xff, 0xc1, 0x25, 0x43, 0x9d, 0x68, 0xa9, 0x44, 0x23, 0x8f, 0xcc, 0x66, 0xf0}} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// AssetString returns the asset contents as a string (instead of a []byte). -func AssetString(name string) (string, error) { - data, err := Asset(name) - return string(data), err -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// MustAssetString is like AssetString but panics when Asset would return an -// error. It simplifies safe initialization of global variables. -func MustAssetString(name string) string { - return string(MustAsset(name)) -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetDigest returns the digest of the file with the given name. It returns an -// error if the asset could not be found or the digest could not be loaded. -func AssetDigest(name string) ([sha256.Size]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) - } - return a.digest, nil - } - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) -} - -// Digests returns a map of all known files and their checksums. -func Digests() (map[string][sha256.Size]byte, error) { - mp := make(map[string][sha256.Size]byte, len(_bindata)) - for name := range _bindata { - a, err := _bindata[name]() - if err != nil { - return nil, err - } - mp[name] = a.digest - } - return mp, nil -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "aws-node.yaml": awsNodeYaml, - "coredns-1.17.json": coredns117Json, - "coredns-1.18.json": coredns118Json, - "coredns-1.19.json": coredns119Json, - "coredns-1.20.json": coredns120Json, - "coredns-1.21.json": coredns121Json, -} - -// AssetDebug is true if the assets were built with the debug flag enabled. -const AssetDebug = false - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"}, -// AssetDir("data/img") would return []string{"a.png", "b.png"}, -// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - canonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(canonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "aws-node.yaml": {awsNodeYaml, map[string]*bintree{}}, - "coredns-1.17.json": {coredns117Json, map[string]*bintree{}}, - "coredns-1.18.json": {coredns118Json, map[string]*bintree{}}, - "coredns-1.19.json": {coredns119Json, map[string]*bintree{}}, - "coredns-1.20.json": {coredns120Json, map[string]*bintree{}}, - "coredns-1.21.json": {coredns121Json, map[string]*bintree{}}, -}} - -// RestoreAsset restores an asset under the given directory. -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively. -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - canonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) -} diff --git a/pkg/addons/default/assets/aws-node.yaml b/pkg/addons/default/assets/aws-node.yaml index acf37ed900..7fae3facb1 100644 --- a/pkg/addons/default/assets/aws-node.yaml +++ b/pkg/addons/default/assets/aws-node.yaml @@ -1,4 +1,10 @@ --- +"apiVersion": "v1" +"kind": "ServiceAccount" +"metadata": + "name": "aws-node" + "namespace": "kube-system" +--- "apiVersion": "rbac.authorization.k8s.io/v1" "kind": "ClusterRoleBinding" "metadata": @@ -28,12 +34,19 @@ - "apiGroups": - "" "resources": - - "pods" - "namespaces" "verbs": - "list" - "watch" - "get" +- "apiGroups": + - "" + "resources": + - "pods" + "verbs": + - "list" + - "watch" + - "get" - "apiGroups": - "" "resources": @@ -51,7 +64,7 @@ - "list" - "watch" --- -"apiVersion": "apiextensions.k8s.io/v1beta1" +"apiVersion": "apiextensions.k8s.io/v1" "kind": "CustomResourceDefinition" "metadata": "name": "eniconfigs.crd.k8s.amazonaws.com" @@ -61,9 +74,14 @@ "kind": "ENIConfig" "plural": "eniconfigs" "singular": "eniconfig" + "preserveUnknownFields": false "scope": "Cluster" "versions": - "name": "v1alpha1" + "schema": + "openAPIV3Schema": + "type": "object" + "x-kubernetes-preserve-unknown-fields": true "served": true "storage": true --- @@ -159,13 +177,16 @@ "value": "1" - "name": "WARM_PREFIX_TARGET" "value": "1" - "image": "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon-k8s-cni:v1.9.1" + "image": "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon-k8s-cni:v1.9.3" "livenessProbe": "exec": "command": - "/app/grpc-health-probe" - "-addr=:50051" + - "-connect-timeout=2s" + - "-rpc-timeout=2s" "initialDelaySeconds": 60 + "timeoutSeconds": 5 "name": "aws-node" "ports": - "containerPort": 61678 @@ -175,6 +196,8 @@ "command": - "/app/grpc-health-probe" - "-addr=:50051" + - "-connect-timeout=2s" + - "-rpc-timeout=2s" "initialDelaySeconds": 1 "resources": "requests": @@ -201,7 +224,7 @@ - "env": - "name": "DISABLE_TCP_EARLY_DEMUX" "value": "false" - "image": "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon-k8s-cni-init:v1.9.1" + "image": "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon-k8s-cni-init:v1.9.3" "name": "aws-vpc-cni-init" "securityContext": "privileged": true @@ -238,10 +261,4 @@ "rollingUpdate": "maxUnavailable": "10%" "type": "RollingUpdate" ---- -"apiVersion": "v1" -"kind": "ServiceAccount" -"metadata": - "name": "aws-node" - "namespace": "kube-system" ... diff --git a/pkg/addons/default/assets_test.go b/pkg/addons/default/assets_test.go index 2f36dffafa..c3dcbb4cc9 100644 --- a/pkg/addons/default/assets_test.go +++ b/pkg/addons/default/assets_test.go @@ -1,8 +1,6 @@ package defaultaddons import ( - "bytes" - "compress/gzip" "strings" ) @@ -10,7 +8,7 @@ func init() { // we must patch the manifest until we can use fake // clientset that supports CRDs - awsNode := string(MustAsset("aws-node.yaml")) + awsNode := string(awsNodeYaml) awsNodeParts := strings.Split(awsNode, "---\n") nonCRDs := []string{} @@ -23,16 +21,5 @@ func init() { awsNode = strings.Join(nonCRDs, "---\n") - var buf bytes.Buffer - zw := gzip.NewWriter(&buf) - - if _, err := zw.Write([]byte(awsNode)); err != nil { - panic(err) - } - - if err := zw.Close(); err != nil { - panic(err) - } - - _awsNodeYaml = buf.Bytes() + awsNodeYaml = []byte(awsNode) } diff --git a/pkg/addons/default/aws_node.go b/pkg/addons/default/aws_node.go index 835034e026..87784f41ce 100644 --- a/pkg/addons/default/aws_node.go +++ b/pkg/addons/default/aws_node.go @@ -14,6 +14,9 @@ import ( "github.com/weaveworks/eksctl/pkg/addons" "github.com/weaveworks/eksctl/pkg/kubernetes" + + // For go:embed + _ "embed" ) const ( @@ -24,6 +27,9 @@ const ( awsNodeInitImageFormatPrefix = "%s.dkr.ecr.%s.%s/amazon-k8s-cni-init" ) +//go:embed assets/aws-node.yaml +var awsNodeYaml []byte + // DoesAWSNodeSupportMultiArch makes sure awsnode supports ARM nodes func DoesAWSNodeSupportMultiArch(rawClient kubernetes.RawClientInterface, region string) (bool, error) { clusterDaemonSet, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) @@ -76,7 +82,7 @@ func UpdateAWSNode(rawClient kubernetes.RawClientInterface, region string, plan } // if DaemonSets is present, go through our list of assets - list, err := LoadAsset(AWSNode, "yaml") + list, err := newList(awsNodeYaml) if err != nil { return false, err } diff --git a/pkg/addons/default/aws_node_test.go b/pkg/addons/default/aws_node_test.go index 19cbed95b7..2aeb90d008 100644 --- a/pkg/addons/default/aws_node_test.go +++ b/pkg/addons/default/aws_node_test.go @@ -29,15 +29,15 @@ var _ = Describe("default addons - aws-node", func() { for _, item := range sampleAddons { rc, err := rawClient.NewRawResource(item) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } ct = rawClient.Collection Expect(ct.Updated()).To(BeEmpty()) - Expect(ct.Created()).ToNot(BeEmpty()) + Expect(ct.Created()).NotTo(BeEmpty()) Expect(ct.CreatedItems()).To(HaveLen(10)) } It("reports that 1.15 sample needs an update", func() { @@ -45,7 +45,7 @@ var _ = Describe("default addons - aws-node", func() { rawClient.AssumeObjectsMissing = false needsUpdate, err := DoesAWSNodeSupportMultiArch(rawClient, "eu-west-1") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(needsUpdate).To(BeFalse()) }) It("reports that sample with 1.6.3-eksbuild.1 doesn't need an update", func() { @@ -53,7 +53,7 @@ var _ = Describe("default addons - aws-node", func() { rawClient.AssumeObjectsMissing = false needsUpdate, err := DoesAWSNodeSupportMultiArch(rawClient, "eu-west-1") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(needsUpdate).To(BeTrue()) }) It("reports that sample with 1.7.6 doesn't need an update", func() { @@ -61,7 +61,7 @@ var _ = Describe("default addons - aws-node", func() { rawClient.AssumeObjectsMissing = false needsUpdate, err := DoesAWSNodeSupportMultiArch(rawClient, "eu-west-1") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(needsUpdate).To(BeTrue()) }) }) @@ -81,15 +81,15 @@ var _ = Describe("default addons - aws-node", func() { for _, item := range sampleAddons { rc, err := rawClient.NewRawResource(item) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } ct = rawClient.Collection Expect(ct.Updated()).To(BeEmpty()) - Expect(ct.Created()).ToNot(BeEmpty()) + Expect(ct.Created()).NotTo(BeEmpty()) Expect(ct.CreatedItems()).To(HaveLen(10)) }) @@ -97,7 +97,7 @@ var _ = Describe("default addons - aws-node", func() { rawClient.ClientSetUseUpdatedObjects = false // must be set for initial verification, and for subsequent UpdateAWSNode awsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1)) Expect(awsNode.Spec.Template.Spec.Containers[0].Image).To( Equal("602401143452.dkr.ecr.eu-west-1.amazonaws.com/amazon-k8s-cni:v1.5.7"), @@ -109,11 +109,11 @@ var _ = Describe("default addons - aws-node", func() { rawClient.AssumeObjectsMissing = false preUpdateAwsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = UpdateAWSNode(rawClient, "eu-west-1", false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(rawClient.Collection.UpdatedItems()).To(HaveLen(3)) - Expect(rawClient.Collection.UpdatedItems()).ToNot(ContainElement(PointTo(MatchFields(IgnoreMissing|IgnoreExtras, Fields{ + Expect(rawClient.Collection.UpdatedItems()).NotTo(ContainElement(PointTo(MatchFields(IgnoreMissing|IgnoreExtras, Fields{ "TypeMeta": MatchFields(IgnoreMissing|IgnoreExtras, Fields{"Kind": Equal("ServiceAccount")}), })))) Expect(rawClient.Collection.CreatedItems()).To(HaveLen(10)) @@ -121,9 +121,9 @@ var _ = Describe("default addons - aws-node", func() { rawClient.ClientSetUseUpdatedObjects = true // for verification of updated objects awsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1)) - Expect(awsNode.Spec.Template.Spec.Containers[0].Image).ToNot( + Expect(awsNode.Spec.Template.Spec.Containers[0].Image).NotTo( Equal(preUpdateAwsNode.Spec.Template.Spec.Containers[0].Image), ) Expect(awsNode.Spec.Template.Spec.InitContainers).To(HaveLen(1)) @@ -137,16 +137,16 @@ var _ = Describe("default addons - aws-node", func() { rawClient.ClientSetUseUpdatedObjects = false // must be set for subsequent UpdateAWSNode preUpdateAwsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = UpdateAWSNode(rawClient, "us-east-1", false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) rawClient.ClientSetUseUpdatedObjects = true // for verification of updated objects awsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1)) - Expect(awsNode.Spec.Template.Spec.Containers[0].Image).ToNot( + Expect(awsNode.Spec.Template.Spec.Containers[0].Image).NotTo( Equal(preUpdateAwsNode.Spec.Template.Spec.Containers[0].Image), ) Expect(awsNode.Spec.Template.Spec.InitContainers).To(HaveLen(1)) @@ -159,16 +159,16 @@ var _ = Describe("default addons - aws-node", func() { rawClient.ClientSetUseUpdatedObjects = false // must be set for subsequent UpdateAWSNode preUpdateAwsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = UpdateAWSNode(rawClient, "cn-northwest-1", false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) rawClient.ClientSetUseUpdatedObjects = true // for verification of updated objects awsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), AWSNode, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1)) - Expect(awsNode.Spec.Template.Spec.Containers[0].Image).ToNot( + Expect(awsNode.Spec.Template.Spec.Containers[0].Image).NotTo( Equal(preUpdateAwsNode.Spec.Template.Spec.Containers[0].Image), ) Expect(awsNode.Spec.Template.Spec.InitContainers).To(HaveLen(1)) @@ -180,7 +180,7 @@ var _ = Describe("default addons - aws-node", func() { It("detects matching image version when determining plan", func() { // updating from latest to latest needs no updating needsUpdate, err := UpdateAWSNode(rawClient, "eu-west-2", true) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(needsUpdate).To(BeFalse()) }) }) diff --git a/pkg/addons/default/coredns.go b/pkg/addons/default/coredns.go index eed642188b..204f65639b 100644 --- a/pkg/addons/default/coredns.go +++ b/pkg/addons/default/coredns.go @@ -2,6 +2,7 @@ package defaultaddons import ( "context" + "embed" "fmt" "strings" @@ -16,6 +17,9 @@ import ( api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/fargate/coredns" "github.com/weaveworks/eksctl/pkg/kubernetes" + + // For go:embed + _ "embed" ) const ( @@ -25,6 +29,9 @@ const ( KubeDNS = "kube-dns" ) +//go:embed assets/coredns*.json +var coreDNSDir embed.FS + func IsCoreDNSUpToDate(rawClient kubernetes.RawClientInterface, region, controlPlaneVersion string) (bool, error) { kubeDNSDeployment, err := rawClient.ClientSet().AppsV1().Deployments(metav1.NamespaceSystem).Get(context.TODO(), CoreDNS, metav1.GetOptions{}) if err != nil { @@ -165,9 +172,12 @@ func loadAssetCoreDNS(controlPlaneVersion string) (*metav1.List, error) { for _, version := range api.SupportedVersions() { if strings.HasPrefix(controlPlaneVersion, version+".") { - return LoadAsset(fmt.Sprintf("%s-%s", CoreDNS, version), "json") + manifest, err := coreDNSDir.ReadFile(fmt.Sprintf("assets/%s-%s.json", CoreDNS, version)) + if err != nil { + return nil, err + } + return newList(manifest) } } - return nil, errors.New("unsupported Kubernetes version") } diff --git a/pkg/addons/default/coredns_test.go b/pkg/addons/default/coredns_test.go index 5f54477cf1..5ff1bcc296 100644 --- a/pkg/addons/default/coredns_test.go +++ b/pkg/addons/default/coredns_test.go @@ -42,7 +42,7 @@ var _ = Describe("default addons - coredns", func() { It("updates coredns to the correct version", func() { _, err := da.UpdateCoreDNS(rawClient, region, controlPlaneVersion, false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) updateReqs := []string{ "PUT [/namespaces/kube-system/serviceaccounts/coredns] (coredns)", @@ -68,7 +68,7 @@ var _ = Describe("default addons - coredns", func() { BeforeEach(func() { createCoreDNSFromTestSample(rawClient, ct, kubernetesVersion) _, err := da.UpdateCoreDNS(rawClient, region, controlPlaneVersion, false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) Context("when CoreDNS is NOT up to date", func() { @@ -99,9 +99,9 @@ func createCoreDNSFromTestSample(rawClient *testutils.FakeRawClient, ct *testuti for _, item := range sampleAddons { rc, err := rawClient.NewRawResource(item) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } createReqs := []string{ @@ -128,8 +128,8 @@ func createCoreDNSFromTestSample(rawClient *testutils.FakeRawClient, ct *testuti func coreDNSImage(rawClient *testutils.FakeRawClient) string { coreDNS, err := rawClient.ClientSet().AppsV1().Deployments(metav1.NamespaceSystem).Get(context.TODO(), da.CoreDNS, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - Expect(coreDNS).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(coreDNS).NotTo(BeNil()) Expect(coreDNS.Spec.Template.Spec.Containers).To(HaveLen(1)) return coreDNS.Spec.Template.Spec.Containers[0].Image diff --git a/pkg/addons/default/generate.go b/pkg/addons/default/generate.go deleted file mode 100644 index f05cf36e4a..0000000000 --- a/pkg/addons/default/generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package defaultaddons - -//go:generate ${GOBIN}/go-bindata -pkg ${GOPACKAGE} -prefix assets -nometadata -o assets.go assets diff --git a/pkg/addons/default/helpers.go b/pkg/addons/default/helpers.go index 017260baaf..3f1e1fefaa 100644 --- a/pkg/addons/default/helpers.go +++ b/pkg/addons/default/helpers.go @@ -7,14 +7,10 @@ import ( ) // LoadAsset return embedded manifest as a runtime.Object -func LoadAsset(name, ext string) (*metav1.List, error) { - data, err := Asset(name + "." + ext) - if err != nil { - return nil, errors.Wrapf(err, "decoding embedded manifest for %q", name) - } +func newList(data []byte) (*metav1.List, error) { list, err := kubernetes.NewList(data) if err != nil { - return nil, errors.Wrapf(err, "loading individual resources from manifest for %q", name) + return nil, errors.Wrapf(err, "loading individual resources from manifest") } return list, nil } diff --git a/pkg/addons/default/helpers_test.go b/pkg/addons/default/helpers_test.go index 2229f7ce53..5aff765cf9 100644 --- a/pkg/addons/default/helpers_test.go +++ b/pkg/addons/default/helpers_test.go @@ -19,17 +19,17 @@ var _ = Describe("default addons", func() { clientSet, _ := testutils.NewFakeClientSetWithSamples("testdata/sample-1.16.json") nsl, err := clientSet.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(nsl.Items).To(HaveLen(0)) dl, err := clientSet.AppsV1().Deployments(metav1.NamespaceAll).List(context.TODO(), metav1.ListOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(dl.Items).To(HaveLen(1)) Expect(dl.Items[0].Spec.Template.Spec.Containers).To(HaveLen(1)) kubeProxy, err := clientSet.AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), KubeProxy, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - Expect(kubeProxy).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(kubeProxy).NotTo(BeNil()) Expect(kubeProxy.Spec.Template.Spec.Containers).To(HaveLen(1)) }) }) diff --git a/pkg/addons/default/kube_proxy_test.go b/pkg/addons/default/kube_proxy_test.go index 700e54c8ec..c48a4aea88 100644 --- a/pkg/addons/default/kube_proxy_test.go +++ b/pkg/addons/default/kube_proxy_test.go @@ -25,14 +25,14 @@ var _ = Describe("default addons - kube-proxy", func() { It("can update to multi-architecture image based on control plane version", func() { _, err := UpdateKubeProxy(clientSet, "1.16.0", false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(kubeProxyImage(clientSet)).To(Equal("602401143452.dkr.ecr.eu-west-1.amazonaws.com/eks/kube-proxy:v1.16.0-eksbuild.1")) Expect(kubeProxyNodeSelectorValues(clientSet)).To(ConsistOf("amd64", "arm64")) }) It("can dry-run update based on control plane version", func() { _, err := UpdateKubeProxy(clientSet, "1.16.1", true) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(kubeProxyImage(clientSet)).To(Equal("602401143452.dkr.ecr.eu-west-1.amazonaws.com/eks/kube-proxy:v1.15.11")) }) }) @@ -41,8 +41,8 @@ var _ = Describe("default addons - kube-proxy", func() { func kubeProxyImage(clientSet *fake.Clientset) string { kubeProxy, err := clientSet.AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), KubeProxy, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - Expect(kubeProxy).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(kubeProxy).NotTo(BeNil()) Expect(kubeProxy.Spec.Template.Spec.Containers).To(HaveLen(1)) return kubeProxy.Spec.Template.Spec.Containers[0].Image @@ -51,8 +51,8 @@ func kubeProxyImage(clientSet *fake.Clientset) string { func kubeProxyNodeSelectorValues(clientSet *fake.Clientset) []string { kubeProxy, err := clientSet.AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), KubeProxy, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - Expect(kubeProxy).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(kubeProxy).NotTo(BeNil()) for _, nodeSelector := range kubeProxy.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions { if nodeSelector.Key == "beta.kubernetes.io/arch" { diff --git a/pkg/addons/device_plugin.go b/pkg/addons/device_plugin.go index 694668ad8b..557a8fc69c 100644 --- a/pkg/addons/device_plugin.go +++ b/pkg/addons/device_plugin.go @@ -8,7 +8,6 @@ import ( "github.com/kris-nova/logger" "github.com/pkg/errors" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" - "github.com/weaveworks/eksctl/pkg/assetutil" "github.com/weaveworks/eksctl/pkg/kubernetes" appsv1 "k8s.io/api/apps/v1" @@ -16,8 +15,20 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/watch" clientappsv1 "k8s.io/client-go/kubernetes/typed/apps/v1" + + // For go:embed + _ "embed" ) +//go:embed assets/efa-device-plugin.yaml +var efaDevicePluginYaml []byte + +//go:embed assets/neuron-device-plugin.yaml +var neuronDevicePluginYaml []byte + +//go:embed assets/nvidia-device-plugin.yaml +var nvidiaDevicePluginYaml []byte + func useRegionalImage(spec *v1.PodTemplateSpec, region string, account string) error { imageFormat := spec.Spec.Containers[0].Image dnsSuffix, err := awsDNSSuffixForRegion(region) @@ -137,7 +148,7 @@ func (n *NeuronDevicePlugin) PlanMode() bool { } func (n *NeuronDevicePlugin) Manifest() []byte { - return assetutil.MustLoad(neuronDevicePluginYamlBytes) + return neuronDevicePluginYaml } func (n *NeuronDevicePlugin) SetImage(t *v1.PodTemplateSpec) error { @@ -178,7 +189,7 @@ func (n *NvidiaDevicePlugin) SetImage(t *v1.PodTemplateSpec) error { } func (n *NvidiaDevicePlugin) Manifest() []byte { - return assetutil.MustLoad(nvidiaDevicePluginYamlBytes) + return nvidiaDevicePluginYaml } // Deploy deploys the Nvidia device plugin to the specified cluster @@ -202,7 +213,7 @@ func (n *EFADevicePlugin) PlanMode() bool { } func (n *EFADevicePlugin) Manifest() []byte { - return assetutil.MustLoad(efaDevicePluginYamlBytes) + return efaDevicePluginYaml } func (n *EFADevicePlugin) SetImage(t *v1.PodTemplateSpec) error { diff --git a/pkg/addons/generate.go b/pkg/addons/generate.go deleted file mode 100644 index 20e61b6872..0000000000 --- a/pkg/addons/generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package addons - -//go:generate ${GOBIN}/go-bindata -pkg ${GOPACKAGE} -prefix assets -nometadata -o assets.go assets diff --git a/pkg/addons/vpc_controller.go b/pkg/addons/vpc_controller.go index 4af6c3ab57..e61306b020 100644 --- a/pkg/addons/vpc_controller.go +++ b/pkg/addons/vpc_controller.go @@ -21,8 +21,29 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + + // For go:embed + _ "embed" ) +//go:embed assets/vpc-admission-webhook-config.yaml +var vpcAdmissionWebhookConfigYaml []byte + +//go:embed assets/vpc-admission-webhook-csr.yaml +var vpcAdmissionWebhookCsrYaml []byte + +//go:embed assets/vpc-admission-webhook-dep.yaml +var vpcAdmissionWebhookDepYaml []byte + +//go:embed assets/vpc-admission-webhook.yaml +var vpcAdmissionWebhookYaml []byte + +//go:embed assets/vpc-resource-controller-dep.yaml +var vpcResourceControllerDepYaml []byte + +//go:embed assets/vpc-resource-controller.yaml +var vpcResourceControllerYaml []byte + const ( vpcControllerNamespace = metav1.NamespaceSystem vpcControllerName = "vpc-resource-controller" @@ -112,7 +133,7 @@ func (v *VPCController) generateCert() error { return errors.Wrap(err, "generating CSR") } - manifest := assetutil.MustLoad(vpcAdmissionWebhookCsrYamlBytes) + manifest := vpcAdmissionWebhookCsrYaml rawExtension, err := kubernetes.NewRawExtension(manifest) if err != nil { return err @@ -258,22 +279,22 @@ func (v *VPCController) deployVPCResourceController() error { return err } } - if err := v.applyResources(assetutil.MustLoad(vpcResourceControllerYamlBytes)); err != nil { + if err := v.applyResources(vpcResourceControllerYaml); err != nil { return err } - return v.applyDeployment(assetutil.MustLoad(vpcResourceControllerDepYamlBytes)) + return v.applyDeployment(vpcResourceControllerDepYaml) } func (v *VPCController) deployVPCWebhook() error { - if err := v.applyResources(assetutil.MustLoad(vpcAdmissionWebhookYamlBytes)); err != nil { + if err := v.applyResources(vpcAdmissionWebhookYaml); err != nil { return err } - if err := v.applyDeployment(assetutil.MustLoad(vpcAdmissionWebhookDepYamlBytes)); err != nil { + if err := v.applyDeployment(vpcAdmissionWebhookDepYaml); err != nil { return err } - manifest := assetutil.MustLoad(vpcAdmissionWebhookConfigYamlBytes) + manifest := vpcAdmissionWebhookConfigYaml rawExtension, err := kubernetes.NewRawExtension(manifest) if err != nil { return err diff --git a/pkg/ami/auto_resolver.go b/pkg/ami/auto_resolver.go index 790bfa68e9..f0f0c398f1 100644 --- a/pkg/ami/auto_resolver.go +++ b/pkg/ami/auto_resolver.go @@ -6,7 +6,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2/ec2iface" "github.com/kris-nova/logger" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" - "github.com/weaveworks/eksctl/pkg/utils" + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" ) const ( @@ -26,7 +26,8 @@ func MakeImageSearchPatterns(version string) map[string]map[int]string { ImageClassARM: fmt.Sprintf("amazon-eks-arm64-node-%s-*", version), }, api.NodeImageFamilyUbuntu2004: { - ImageClassGeneral: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*20.04*", version), + ImageClassGeneral: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*20.04-amd64*", version), + ImageClassARM: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*20.04-arm64*", version), }, api.NodeImageFamilyUbuntu1804: { ImageClassGeneral: fmt.Sprintf("ubuntu-eks/k8s_%s/images/*18.04*", version), @@ -40,6 +41,9 @@ func MakeImageSearchPatterns(version string) map[string]map[int]string { api.NodeImageFamilyWindowsServer2004CoreContainer: { ImageClassGeneral: fmt.Sprintf("Windows_Server-2004-English-Core-EKS_Optimized-%v-*", version), }, + api.NodeImageFamilyWindowsServer20H2CoreContainer: { + ImageClassGeneral: fmt.Sprintf("Windows_Server-20H2-English-Core-EKS_Optimized-%v-*", version), + }, } } @@ -71,7 +75,7 @@ func (r *AutoResolver) Resolve(region, version, instanceType, imageFamily string imageClasses := MakeImageSearchPatterns(version)[imageFamily] namePattern := imageClasses[ImageClassGeneral] - if utils.IsGPUInstanceType(instanceType) { + if instanceutils.IsGPUInstanceType(instanceType) { var ok bool namePattern, ok = imageClasses[ImageClassGPU] if !ok { @@ -80,7 +84,7 @@ func (r *AutoResolver) Resolve(region, version, instanceType, imageFamily string } } - if utils.IsARMInstanceType(instanceType) { + if instanceutils.IsARMInstanceType(instanceType) { var ok bool namePattern, ok = imageClasses[ImageClassARM] if !ok { diff --git a/pkg/ami/auto_resolver_test.go b/pkg/ami/auto_resolver_test.go index 8d7a6f2b19..596fb70115 100644 --- a/pkg/ami/auto_resolver_test.go +++ b/pkg/ami/auto_resolver_test.go @@ -8,7 +8,6 @@ import ( "github.com/stretchr/testify/mock" . "github.com/weaveworks/eksctl/pkg/ami" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" - "github.com/weaveworks/eksctl/pkg/eks" "github.com/weaveworks/eksctl/pkg/testutils/mockprovider" ) @@ -77,7 +76,7 @@ var _ = Describe("AMI Auto Resolution", func() { BeforeEach(func() { imageState = "available" - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockDescribeImages(p, "amazon-eks-node-1.15-v*", expectedAmi, imageState, "2018-08-20T23:25:53.000Z", api.NodeImageFamilyAmazonLinux2) resolver := NewAutoResolver(p.MockEC2()) resolvedAmi, err = resolver.Resolve(region, version, instanceType, imageFamily) @@ -101,7 +100,7 @@ var _ = Describe("AMI Auto Resolution", func() { imageState = "available" imageFamily = "Ubuntu1804" - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockDescribeImages(p, "ubuntu-eks/k8s_1.15/images/*18.04*", expectedAmi, imageState, "2018-08-20T23:25:53.000Z", api.NodeImageFamilyUbuntu1804) resolver := NewAutoResolver(p.MockEC2()) @@ -125,7 +124,7 @@ var _ = Describe("AMI Auto Resolution", func() { BeforeEach(func() { imageState = "pending" - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockDescribeImagesMultiple(p, "amazon-eks-node-1.15-v*", []returnAmi{}) resolver := NewAutoResolver(p.MockEC2()) @@ -150,7 +149,7 @@ var _ = Describe("AMI Auto Resolution", func() { imageState = "available" expectedAmi = "ami-5678" - _, p = createProviders() + p = mockprovider.NewMockProvider() images := []returnAmi{ { createdDate: "2018-08-20T23:25:53.000Z", @@ -193,7 +192,7 @@ var _ = Describe("AMI Auto Resolution", func() { BeforeEach(func() { imageState = "available" - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockDescribeImages(p, "amazon-eks-gpu-node-1.15-*", expectedAmi, imageState, "2018-08-20T23:25:53.000Z", api.NodeImageFamilyAmazonLinux2) resolver := NewAutoResolver(p.MockEC2()) resolvedAmi, err = resolver.Resolve(region, version, instanceType, imageFamily) @@ -216,16 +215,6 @@ var _ = Describe("AMI Auto Resolution", func() { }) }) -func createProviders() (*eks.ClusterProvider, *mockprovider.MockProvider) { - p := mockprovider.NewMockProvider() - - c := &eks.ClusterProvider{ - Provider: p, - } - - return c, p -} - func addMockDescribeImages(p *mockprovider.MockProvider, expectedNamePattern string, amiID string, amiState string, createdDate string, instanceFamily string) { p.MockEC2().On("DescribeImages", mock.MatchedBy(func(input *ec2.DescribeImagesInput) bool { diff --git a/pkg/ami/ssm_resolver.go b/pkg/ami/ssm_resolver.go index 792b0d1f75..4cec1ada8e 100644 --- a/pkg/ami/ssm_resolver.go +++ b/pkg/ami/ssm_resolver.go @@ -3,6 +3,8 @@ package ami import ( "fmt" + "github.com/pkg/errors" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/eks" "github.com/aws/aws-sdk-go/service/ssm" @@ -10,8 +12,8 @@ import ( "github.com/kris-nova/logger" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" - "github.com/weaveworks/eksctl/pkg/utils" + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" ) // SSMResolver resolves the AMI to the defaults for the region @@ -65,6 +67,16 @@ func MakeSSMParameterName(version, instanceType, imageFamily string) (string, er return fmt.Sprintf("/aws/service/ami-windows-latest/Windows_Server-2019-English-Full-EKS_Optimized-%s/%s", version, fieldName), nil case api.NodeImageFamilyWindowsServer2004CoreContainer: return fmt.Sprintf("/aws/service/ami-windows-latest/Windows_Server-2004-English-Core-EKS_Optimized-%s/%s", version, fieldName), nil + case api.NodeImageFamilyWindowsServer20H2CoreContainer: + const minVersion = api.Version1_21 + supportsWindows20H2, err := utils.IsMinVersion(minVersion, version) + if err != nil { + return "", err + } + if !supportsWindows20H2 { + return "", errors.Errorf("Windows Server 20H2 Core requires EKS version %s and above", minVersion) + } + return fmt.Sprintf("/aws/service/ami-windows-latest/Windows_Server-20H2-English-Core-EKS_Optimized-%s/%s", version, fieldName), nil case api.NodeImageFamilyBottlerocket: return fmt.Sprintf("/aws/service/bottlerocket/aws-k8s-%s/%s/latest/%s", version, instanceEC2ArchName(instanceType), fieldName), nil case api.NodeImageFamilyUbuntu2004, api.NodeImageFamilyUbuntu1804: @@ -86,7 +98,7 @@ func MakeManagedSSMParameterName(version, imageFamily, amiType string) (string, // instanceEC2ArchName returns the name of the architecture as used by EC2 // resources. func instanceEC2ArchName(instanceType string) string { - if utils.IsARMInstanceType(instanceType) { + if instanceutils.IsARMInstanceType(instanceType) { return "arm64" } return "x86_64" @@ -94,11 +106,11 @@ func instanceEC2ArchName(instanceType string) string { func imageType(imageFamily, instanceType string) string { family := utils.ToKebabCase(imageFamily) - if utils.IsGPUInstanceType(instanceType) { + if instanceutils.IsGPUInstanceType(instanceType) { return family + "-gpu" } - if utils.IsARMInstanceType(instanceType) { + if instanceutils.IsARMInstanceType(instanceType) { return family + "-arm64" } return family diff --git a/pkg/ami/ssm_resolver_test.go b/pkg/ami/ssm_resolver_test.go index a9d745760f..dbf332b89e 100644 --- a/pkg/ami/ssm_resolver_test.go +++ b/pkg/ami/ssm_resolver_test.go @@ -42,7 +42,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and AL2 ami is available", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockGetParameter(p, "/aws/service/eks/optimized-ami/1.12/amazon-linux-2/recommended/image_id", expectedAmi) resolver := NewSSMResolver(p.MockSSM()) resolvedAmi, err = resolver.Resolve(region, version, instanceType, imageFamily) @@ -64,7 +64,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and ami is NOT available", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockFailedGetParameter(p, "/aws/service/eks/optimized-ami/1.12/amazon-linux-2/recommended/image_id") resolver := NewSSMResolver(p.MockSSM()) @@ -94,7 +94,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and ami is available", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockGetParameter(p, "/aws/service/eks/optimized-ami/1.12/amazon-linux-2-gpu/recommended/image_id", expectedAmi) resolver := NewSSMResolver(p.MockSSM()) resolvedAmi, err = resolver.Resolve(region, version, instanceType, imageFamily) @@ -122,7 +122,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and ami is available", func() { BeforeEach(func() { version = "1.14" - _, p = createProviders() + p = mockprovider.NewMockProvider() }) It("should return a valid Full image for 1.14", func() { @@ -156,11 +156,38 @@ var _ = Describe("AMI Auto Resolution", func() { Expect(err).To(HaveOccurred()) }) }) + + Context("Windows Server 20H2 Core", func() { + var p *mockprovider.MockProvider + + BeforeEach(func() { + p = mockprovider.NewMockProvider() + }) + + It("should return a valid AMI", func() { + addMockGetParameter(p, "/aws/service/ami-windows-latest/Windows_Server-20H2-English-Core-EKS_Optimized-1.21/image_id", expectedAmi) + + resolver := NewSSMResolver(p.MockSSM()) + resolvedAmi, err = resolver.Resolve(region, "1.21", instanceType, "WindowsServer20H2CoreContainer") + + Expect(err).NotTo(HaveOccurred()) + Expect(resolvedAmi).To(BeEquivalentTo(expectedAmi)) + Expect(p.MockSSM().AssertNumberOfCalls(GinkgoT(), "GetParameter", 1)).To(BeTrue()) + }) + + It("should return an error for EKS versions below 1.21", func() { + resolver := NewSSMResolver(p.MockSSM()) + _, err := resolver.Resolve(region, "1.20", instanceType, "WindowsServer20H2CoreContainer") + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError(ContainSubstring("Windows Server 20H2 Core requires EKS version 1.21 and above"))) + }) + }) + }) Context("and Ubuntu family", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() }) It("should return an error", func() { @@ -180,7 +207,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and ami is available", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockGetParameter(p, "/aws/service/bottlerocket/aws-k8s-1.15/x86_64/latest/image_id", expectedAmi) resolver := NewSSMResolver(p.MockSSM()) resolvedAmi, err = resolver.Resolve(region, version, instanceType, imageFamily) @@ -201,7 +228,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and ami is NOT available", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockFailedGetParameter(p, "/aws/service/bottlerocket/aws-k8s-1.15/x86_64/latest/image_id") resolver := NewSSMResolver(p.MockSSM()) @@ -229,7 +256,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and ami is available", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockGetParameter(p, "/aws/service/bottlerocket/aws-k8s-1.15/arm64/latest/image_id", expectedAmi) resolver := NewSSMResolver(p.MockSSM()) resolvedAmi, err = resolver.Resolve(region, version, instanceType, imageFamily) @@ -250,7 +277,7 @@ var _ = Describe("AMI Auto Resolution", func() { Context("and ami is NOT available", func() { BeforeEach(func() { - _, p = createProviders() + p = mockprovider.NewMockProvider() addMockFailedGetParameter(p, "/aws/service/bottlerocket/aws-k8s-1.15/arm64/latest/image_id") resolver := NewSSMResolver(p.MockSSM()) @@ -278,7 +305,7 @@ var _ = Describe("AMI Auto Resolution", func() { }) }) -func addMockGetParameter(p *mockprovider.MockProvider, name string, amiID string) { +func addMockGetParameter(p *mockprovider.MockProvider, name, amiID string) { p.MockSSM().On("GetParameter", mock.MatchedBy(func(input *ssm.GetParameterInput) bool { return *input.Name == name diff --git a/pkg/apis/eksctl.io/v1alpha5/assets/schema.json b/pkg/apis/eksctl.io/v1alpha5/assets/schema.json index 99f1f2383b..1a832da7c0 100755 --- a/pkg/apis/eksctl.io/v1alpha5/assets/schema.json +++ b/pkg/apis/eksctl.io/v1alpha5/assets/schema.json @@ -125,10 +125,16 @@ "type": "array", "description": "Types of logging to enable (see [CloudWatch docs](/usage/cloudwatch-cluster-logging/#clusterconfig-examples)). Valid entries are: `\"api\"`, `\"audit\"`, `\"authenticator\"`, `\"controllerManager\"`, `\"scheduler\"`, `\"all\"`, `\"*\"`.", "x-intellij-html-description": "Types of logging to enable (see CloudWatch docs). Valid entries are: "api", "audit", "authenticator", "controllerManager", "scheduler", "all", "*"." + }, + "logRetentionInDays": { + "type": "integer", + "description": "sets the number of days to retain the logs for (see [CloudWatch docs](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutRetentionPolicy.html#API_PutRetentionPolicy_RequestSyntax)) . Valid values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653.", + "x-intellij-html-description": "sets the number of days to retain the logs for (see CloudWatch docs) . Valid values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653." } }, "preferredOrder": [ - "enableTypes" + "enableTypes", + "logRetentionInDays" ], "additionalProperties": false, "description": "container config parameters related to cluster logging", @@ -481,9 +487,9 @@ }, "version": { "type": "string", - "description": "Valid variants are: `\"1.17\"`, `\"1.18\"`, `\"1.19\"`, `\"1.20\"` (default), `\"1.21\"`.", - "x-intellij-html-description": "Valid variants are: "1.17", "1.18", "1.19", "1.20" (default), "1.21".", - "default": "1.20", + "description": "Valid variants are: `\"1.17\"`, `\"1.18\"`, `\"1.19\"`, `\"1.20\"`, `\"1.21\"` (default).", + "x-intellij-html-description": "Valid variants are: "1.17", "1.18", "1.19", "1.20", "1.21" (default).", + "default": "1.21", "enum": [ "1.17", "1.18", @@ -914,8 +920,8 @@ }, "amiFamily": { "type": "string", - "description": "Valid variants are: `\"AmazonLinux2\"` (default), `\"Ubuntu2004\"`, `\"Ubuntu1804\"`, `\"Bottlerocket\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2004CoreContainer\"`.", - "x-intellij-html-description": "Valid variants are: "AmazonLinux2" (default), "Ubuntu2004", "Ubuntu1804", "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2004CoreContainer".", + "description": "Valid variants are: `\"AmazonLinux2\"` (default), `\"Ubuntu2004\"`, `\"Ubuntu1804\"`, `\"Bottlerocket\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2004CoreContainer\"`, `\"WindowsServer20H2CoreContainer\"`.", + "x-intellij-html-description": "Valid variants are: "AmazonLinux2" (default), "Ubuntu2004", "Ubuntu1804", "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2004CoreContainer", "WindowsServer20H2CoreContainer".", "default": "AmazonLinux2", "enum": [ "AmazonLinux2", @@ -924,7 +930,8 @@ "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", - "WindowsServer2004CoreContainer" + "WindowsServer2004CoreContainer", + "WindowsServer20H2CoreContainer" ] }, "asgSuspendProcesses": { @@ -1218,8 +1225,8 @@ }, "amiFamily": { "type": "string", - "description": "Valid variants are: `\"AmazonLinux2\"` (default), `\"Ubuntu2004\"`, `\"Ubuntu1804\"`, `\"Bottlerocket\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2004CoreContainer\"`.", - "x-intellij-html-description": "Valid variants are: "AmazonLinux2" (default), "Ubuntu2004", "Ubuntu1804", "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2004CoreContainer".", + "description": "Valid variants are: `\"AmazonLinux2\"` (default), `\"Ubuntu2004\"`, `\"Ubuntu1804\"`, `\"Bottlerocket\"`, `\"WindowsServer2019CoreContainer\"`, `\"WindowsServer2019FullContainer\"`, `\"WindowsServer2004CoreContainer\"`, `\"WindowsServer20H2CoreContainer\"`.", + "x-intellij-html-description": "Valid variants are: "AmazonLinux2" (default), "Ubuntu2004", "Ubuntu1804", "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", "WindowsServer2004CoreContainer", "WindowsServer20H2CoreContainer".", "default": "AmazonLinux2", "enum": [ "AmazonLinux2", @@ -1228,7 +1235,8 @@ "Bottlerocket", "WindowsServer2019CoreContainer", "WindowsServer2019FullContainer", - "WindowsServer2004CoreContainer" + "WindowsServer2004CoreContainer", + "WindowsServer20H2CoreContainer" ] }, "asgMetricsCollection": { diff --git a/pkg/apis/eksctl.io/v1alpha5/cloudwatch.go b/pkg/apis/eksctl.io/v1alpha5/cloudwatch.go index 94af1a98d3..5c1c0c1b25 100644 --- a/pkg/apis/eksctl.io/v1alpha5/cloudwatch.go +++ b/pkg/apis/eksctl.io/v1alpha5/cloudwatch.go @@ -17,6 +17,8 @@ const ( wildcardLogging = "*" ) +var LogRetentionInDaysValues = []int{1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653} + // ClusterCloudWatchLogging container config parameters related to cluster logging type ClusterCloudWatchLogging struct { @@ -24,9 +26,14 @@ type ClusterCloudWatchLogging struct { // Valid entries are `CloudWatchLogging` constants //+optional EnableTypes []string `json:"enableTypes,omitempty"` + // LogRetentionInDays sets the number of days to retain the logs for (see [CloudWatch docs](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutRetentionPolicy.html#API_PutRetentionPolicy_RequestSyntax)) . + // Valid values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, + // 1827, and 3653. + //+optional + LogRetentionInDays int `json:"logRetentionInDays,omitempty"` } -// SupportedCloudWatchClusterLogTypes retuls all supported logging facilities +// SupportedCloudWatchClusterLogTypes returns all supported logging facilities func SupportedCloudWatchClusterLogTypes() []string { return []string{apiLogging, auditLogging, authenticatorLogging, controllerManagerLogging, schedulerLogging} } diff --git a/pkg/apis/eksctl.io/v1alpha5/defaults.go b/pkg/apis/eksctl.io/v1alpha5/defaults.go index 92d0600509..1bd25fd46b 100644 --- a/pkg/apis/eksctl.io/v1alpha5/defaults.go +++ b/pkg/apis/eksctl.io/v1alpha5/defaults.go @@ -259,12 +259,15 @@ func setBottlerocketNodeGroupDefaults(ng *NodeGroupBase) { if ng.Bottlerocket == nil { ng.Bottlerocket = &NodeGroupBottlerocket{} } + if ng.Bottlerocket.Settings == nil { + ng.Bottlerocket.Settings = &InlineDocument{} + } // Use the SSH settings if the user hasn't explicitly configured the Admin // Container. If SSH was enabled, the user will be able to ssh into the // Bottlerocket node via the admin container. - if ng.Bottlerocket.EnableAdminContainer == nil && ng.SSH != nil { - ng.Bottlerocket.EnableAdminContainer = ng.SSH.Allow + if ng.Bottlerocket.EnableAdminContainer == nil && ng.SSH != nil && IsEnabled(ng.SSH.Allow) { + ng.Bottlerocket.EnableAdminContainer = Enabled() } } diff --git a/pkg/apis/eksctl.io/v1alpha5/defaults_test.go b/pkg/apis/eksctl.io/v1alpha5/defaults_test.go index fd777f2b2c..3b6f9d38ca 100644 --- a/pkg/apis/eksctl.io/v1alpha5/defaults_test.go +++ b/pkg/apis/eksctl.io/v1alpha5/defaults_test.go @@ -144,6 +144,20 @@ var _ = Describe("ClusterConfig validation", func() { Expect(*testNodeGroup.Bottlerocket.EnableAdminContainer).To(BeTrue()) }) + It("leaves EnableAdminContainer unset if SSH is disabled", func() { + testNodeGroup := NodeGroup{ + NodeGroupBase: &NodeGroupBase{ + AMIFamily: NodeImageFamilyBottlerocket, + SSH: &NodeGroupSSH{ + Allow: Disabled(), + }, + }, + } + + SetNodeGroupDefaults(&testNodeGroup, &ClusterMeta{}) + Expect(testNodeGroup.Bottlerocket.EnableAdminContainer).To(BeNil()) + }) + It("has default NodeGroup configuration", func() { testNodeGroup := NodeGroup{ NodeGroupBase: &NodeGroupBase{ @@ -153,8 +167,8 @@ var _ = Describe("ClusterConfig validation", func() { SetNodeGroupDefaults(&testNodeGroup, &ClusterMeta{}) - Expect(testNodeGroup.Bottlerocket).ToNot(BeNil()) - Expect(*testNodeGroup.Bottlerocket.EnableAdminContainer).To(BeFalse()) + Expect(testNodeGroup.Bottlerocket).NotTo(BeNil()) + Expect(testNodeGroup.Bottlerocket.EnableAdminContainer).To(BeNil()) }) }) diff --git a/pkg/apis/eksctl.io/v1alpha5/generate.go b/pkg/apis/eksctl.io/v1alpha5/generate.go index 3aa9d55505..2695d4193c 100644 --- a/pkg/apis/eksctl.io/v1alpha5/generate.go +++ b/pkg/apis/eksctl.io/v1alpha5/generate.go @@ -1,4 +1,12 @@ package v1alpha5 +import ( + // For go:embed + _ "embed" +) + //go:generate go run ../../../../cmd/schema assets/schema.json -//go:generate ${GOBIN}/go-bindata -pkg ${GOPACKAGE} -prefix assets -nometadata -o schema.go assets + +//SchemaJSON contains the schema +//go:embed assets/schema.json +var SchemaJSON string diff --git a/pkg/apis/eksctl.io/v1alpha5/gpu_validation_test.go b/pkg/apis/eksctl.io/v1alpha5/gpu_validation_test.go new file mode 100644 index 0000000000..db0f7bf3ea --- /dev/null +++ b/pkg/apis/eksctl.io/v1alpha5/gpu_validation_test.go @@ -0,0 +1,99 @@ +package v1alpha5_test + +import ( + "fmt" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/ginkgo/extensions/table" + . "github.com/onsi/gomega" + + api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" +) + +var _ = Describe("GPU instance support", func() { + + type gpuInstanceEntry struct { + gpuInstanceType string + amiFamily string + + expectUnsupportedErr bool + } + + assertValidationError := func(e gpuInstanceEntry, err error) { + if e.expectUnsupportedErr { + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError(ContainSubstring(fmt.Sprintf("GPU instance types are not supported for %s", e.amiFamily)))) + return + } + Expect(err).NotTo(HaveOccurred()) + } + + DescribeTable("managed nodegroups", func(e gpuInstanceEntry) { + mng := api.NewManagedNodeGroup() + mng.InstanceType = e.gpuInstanceType + mng.AMIFamily = e.amiFamily + mng.InstanceSelector = &api.InstanceSelector{} + assertValidationError(e, api.ValidateManagedNodeGroup(mng, 0)) + }, + Entry("AL2", gpuInstanceEntry{ + gpuInstanceType: "asdf", + amiFamily: api.NodeImageFamilyAmazonLinux2, + }), + Entry("Bottlerocket", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyBottlerocket, + gpuInstanceType: "g4dn.xlarge", + expectUnsupportedErr: true, + }), + Entry("Ubuntu2004", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyUbuntu2004, + gpuInstanceType: "g4dn.xlarge", + expectUnsupportedErr: true, + }), + ) + + DescribeTable("unmanaged nodegroups", func(e gpuInstanceEntry) { + ng := api.NewNodeGroup() + ng.InstanceType = e.gpuInstanceType + ng.AMIFamily = e.amiFamily + assertValidationError(e, api.ValidateNodeGroup(0, ng)) + + }, + Entry("AL2", gpuInstanceEntry{ + gpuInstanceType: "g4dn.xlarge", + amiFamily: api.NodeImageFamilyAmazonLinux2, + }), + Entry("AMI unset", gpuInstanceEntry{ + gpuInstanceType: "g4dn.xlarge", + }), + Entry("Bottlerocket", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyBottlerocket, + gpuInstanceType: "g4dn.xlarge", + expectUnsupportedErr: true, + }), + Entry("Ubuntu2004", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyUbuntu2004, + gpuInstanceType: "g4dn.xlarge", + expectUnsupportedErr: true, + }), + Entry("Windows2004", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyWindowsServer2004CoreContainer, + gpuInstanceType: "p2.xlarge", + expectUnsupportedErr: true, + }), + Entry("Windows2019Core", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyWindowsServer2019CoreContainer, + gpuInstanceType: "g3.8xlarge", + expectUnsupportedErr: true, + }), + Entry("Windows2019Full", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyWindowsServer2019FullContainer, + gpuInstanceType: "p3.2xlarge", + expectUnsupportedErr: true, + }), + Entry("Windows20H2Core", gpuInstanceEntry{ + amiFamily: api.NodeImageFamilyWindowsServer20H2CoreContainer, + gpuInstanceType: "g4dn.xlarge", + expectUnsupportedErr: true, + }), + ) +}) diff --git a/pkg/apis/eksctl.io/v1alpha5/instance.go b/pkg/apis/eksctl.io/v1alpha5/instance.go new file mode 100644 index 0000000000..407de19633 --- /dev/null +++ b/pkg/apis/eksctl.io/v1alpha5/instance.go @@ -0,0 +1,32 @@ +package v1alpha5 + +import ( + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" +) + +// SelectInstanceType determines which instanceType is relevant for selecting an AMI +// If the nodegroup has mixed instances it will prefer a GPU instance type over a general class one +// This is to make sure that the AMI that is selected later is valid for all the types +func SelectInstanceType(np NodePool) string { + var instanceTypes []string + switch ng := np.(type) { + case *NodeGroup: + if ng.InstancesDistribution != nil { + instanceTypes = ng.InstancesDistribution.InstanceTypes + } + case *ManagedNodeGroup: + instanceTypes = ng.InstanceTypes + } + + hasMixedInstances := len(instanceTypes) > 0 + if hasMixedInstances { + for _, instanceType := range instanceTypes { + if instanceutils.IsGPUInstanceType(instanceType) { + return instanceType + } + } + return instanceTypes[0] + } + + return np.BaseNodeGroup().InstanceType +} diff --git a/pkg/apis/eksctl.io/v1alpha5/instance_selector_test.go b/pkg/apis/eksctl.io/v1alpha5/instance_selector_test.go index 2e2f719b1c..c7c39c8c19 100644 --- a/pkg/apis/eksctl.io/v1alpha5/instance_selector_test.go +++ b/pkg/apis/eksctl.io/v1alpha5/instance_selector_test.go @@ -16,7 +16,7 @@ var _ = Describe("Instance Selector Validation", func() { SetNodeGroupDefaults(n.ng, &ClusterMeta{Name: "cluster"}) err := ValidateNodeGroup(0, n.ng) if n.errMsg == "" { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return } Expect(err).To(HaveOccurred()) diff --git a/pkg/apis/eksctl.io/v1alpha5/managed_nodegroup_test.go b/pkg/apis/eksctl.io/v1alpha5/managed_nodegroup_test.go index 84738467bf..8b9f2792dd 100644 --- a/pkg/apis/eksctl.io/v1alpha5/managed_nodegroup_test.go +++ b/pkg/apis/eksctl.io/v1alpha5/managed_nodegroup_test.go @@ -17,7 +17,7 @@ var _ = Describe("Managed Nodegroup Validation", func() { SetManagedNodeGroupDefaults(n.ng, &ClusterMeta{Name: "managed-cluster"}) err := ValidateManagedNodeGroup(n.ng, 0) if n.errMsg == "" { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return } Expect(err).To(HaveOccurred()) @@ -189,7 +189,7 @@ var _ = Describe("Managed Nodegroup Validation", func() { SetManagedNodeGroupDefaults(mng, &ClusterMeta{Name: "managed-cluster"}) err := ValidateManagedNodeGroup(mng, 0) if e.valid { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } else { Expect(err).To(HaveOccurred()) } diff --git a/pkg/apis/eksctl.io/v1alpha5/nodegroups.go b/pkg/apis/eksctl.io/v1alpha5/nodegroups.go index 00382c7ca2..51de68cebb 100644 --- a/pkg/apis/eksctl.io/v1alpha5/nodegroups.go +++ b/pkg/apis/eksctl.io/v1alpha5/nodegroups.go @@ -1,5 +1,7 @@ package v1alpha5 +import "fmt" + // HasInstanceType returns whether some node in the group fulfils the type check func HasInstanceType(nodeGroup *NodeGroup, hasType func(string) bool) bool { if hasType(nodeGroup.InstanceType) { @@ -44,14 +46,28 @@ func ClusterHasInstanceType(cfg *ClusterConfig, hasType func(string) bool) bool return false } -// HasNodegroup returns true if this clusterConfig contains a managed or un-managed nodegroup with the given name -func (c *ClusterConfig) FindNodegroup(name string) *NodeGroup { +// FindNodegroup checks if the clusterConfig contains a nodegroup with the given name +func (c *ClusterConfig) FindNodegroup(name string) (*NodeGroupBase, error) { + var foundNg []*NodeGroupBase for _, ng := range c.NodeGroups { if name == ng.NameString() { - return ng + foundNg = append(foundNg, ng.NodeGroupBase) } } - return nil + + for _, ng := range c.ManagedNodeGroups { + if name == ng.NameString() { + foundNg = append(foundNg, ng.NodeGroupBase) + } + } + + if len(foundNg) == 0 { + return nil, fmt.Errorf("nodegroup %s not found in config file", name) + } else if len(foundNg) > 1 { + return nil, fmt.Errorf("found more than 1 nodegroup with name %s", name) + } + + return foundNg[0], nil } // GetAllNodeGroupNames collects and returns names for both managed and unmanaged nodegroups diff --git a/pkg/apis/eksctl.io/v1alpha5/schema.go b/pkg/apis/eksctl.io/v1alpha5/schema.go index d54abeb327..3b7e464b53 100644 --- a/pkg/apis/eksctl.io/v1alpha5/schema.go +++ b/pkg/apis/eksctl.io/v1alpha5/schema.go @@ -1,6 +1,6 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: -// assets/schema.json (88.669kB) +// assets/schema.json (88.451kB) package v1alpha5 @@ -69,7 +69,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _schemaJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x7b\x73\x1b\xb9\xf1\xe0\xff\xf9\x14\x28\x6e\xea\x17\x3b\xc5\x11\x2d\x6f\xb2\xd9\x6c\xf6\x54\x47\x4b\xb2\x97\x67\x4b\xe2\x89\xf2\xee\xdd\x5a\xae\x18\x9c\x01\x49\x44\x43\x60\x02\x60\x24\x71\x7f\xde\xfb\xec\x57\x78\xcd\x13\x33\x9c\x97\x6c\xa5\x4a\x7f\x59\x1e\xce\x34\x1a\x8d\x46\xbf\xd0\xdd\xf8\xef\x3f\x00\x30\xfa\x23\x43\xab\xd1\x0f\x60\xf4\xcd\x24\x40\x2b\x4c\xb0\xc0\x94\xf0\xc9\x71\x18\x73\x81\xd8\x31\x25\x2b\xbc\x1e\x8d\xe5\x8b\x62\x17\x21\xf9\x22\x5d\xfe\x0b\xf9\x42\x3f\xfb\x23\xf7\x37\x68\x0b\xe5\xe3\x8d\x10\xd1\x0f\x93\xc9\xbf\x38\x25\x9e\x7e\x7a\x40\xd9\x7a\x12\x30\xb8\x12\xde\x8b\xbf\x4d\xf4\xb3\x6f\xf4\x77\x99\xa1\x46\x3f\x00\x89\x07\x00\xa3\xe9\xaf\x8b\x78\x49\x90\x38\x83\x51\x84\xc9\x3a\xf9\x01\x80\x11\x0c\x02\xf5\x36\x0c\xe7\x8c\x46\x88\x09\x8c\x78\xe6\xf7\xca\x69\x58\x90\x8b\x08\xf9\x23\xf3\xf2\xef\x63\x0b\xd5\x31\x23\xf5\x3c\x40\xdc\x67\x38\x92\x20\xd4\xcc\x68\x18\x70\xc0\x15\x20\x20\x28\x98\xfe\x0a\xb6\x1a\x45\x7e\x00\x66\x2b\x20\x36\x08\xdc\xa0\x1d\xc0\x1c\x40\x02\xa6\xbf\x8e\x81\xd8\x40\x01\x60\xc8\x29\x58\x22\x9f\x6e\x11\x57\xef\x10\xb8\x45\x80\xea\xf7\x0d\x34\x2a\x36\x88\xdd\x61\x8e\x40\xcc\x51\x02\x48\x50\xc0\xd0\x0a\x31\xf9\x87\xd8\x60\x3b\xf6\x41\x8a\xe1\xbd\x87\x89\x40\x61\x88\xff\xe5\x6d\xc4\x36\xf4\x1e\x3f\xc6\x01\x5a\xc1\x38\x14\x12\xbb\xff\xfe\x5d\x2f\x85\x59\x88\x51\x6e\x91\x32\x8b\x1e\x55\x2c\x35\xfc\x2d\xf7\xff\xcc\x42\x72\xc1\x24\xe3\x8c\xb3\xbf\x15\x48\xe3\x43\x02\x96\x08\xd0\x2d\x16\x02\x05\x00\x97\x89\x91\xff\x7c\x0f\xa5\x1b\x80\x4b\xa0\xfd\x9e\x02\x1e\xf9\x38\x60\xc5\x59\xb8\x59\x78\x8d\xc5\x26\x5e\x1e\xf8\x74\xfb\xf9\x0e\xc1\x5b\x74\x47\xd9\x0d\xff\x8c\x6e\xb8\x2f\xc2\xcf\xd1\xcd\xfa\x73\x2c\x70\xc8\x3f\xe3\x48\xd2\x7b\x36\x3f\x47\xc2\x3d\x22\x0e\xf6\x50\x2d\xfd\xaa\xb4\x51\x22\xb5\xb8\x0c\x05\x17\x2c\x40\x12\xef\x0f\x39\xb8\xe3\xdc\xda\x14\x67\x69\xfe\xfb\x71\xbc\x67\x33\xaf\x60\xc8\x51\x9e\x31\x82\x40\x51\x39\xe1\x08\x86\xfe\x1d\x63\x86\x82\x3c\x06\x92\x4b\xcb\xa3\x54\x72\x8f\x10\xd0\xdf\xcc\x69\x88\xfd\x5d\xb3\x15\x98\x91\x10\x13\x74\x42\xfd\x78\x8b\x88\xa8\xe5\x2e\xbd\xf1\x20\x88\x14\x78\x10\x98\x6f\xe4\xb6\xd0\xe3\xb6\x62\xae\xfd\xd0\x9c\x2b\x9d\x9d\xe1\xf4\xf2\x9c\x17\x67\x89\x05\xda\x16\x1f\xd6\xb0\x43\x0e\x78\xe6\x3d\xc8\x18\xdc\xd5\x52\x23\xc4\x5c\x48\xf1\x21\x91\xb0\x62\x64\x36\x3d\xd3\xf3\xc1\x52\xc6\x74\x22\x4b\x0b\xb0\x4e\xfa\x28\x7e\x69\xba\x17\x32\xdf\x45\x88\x6d\x31\xe7\x92\x27\x5e\xd1\x98\x04\x90\x95\x18\xa8\x85\x20\x9a\x5e\x9e\x5b\xe4\x33\x80\xc1\xd2\x40\x56\x93\xe0\x9c\xfa\x18\x0a\xd4\x8a\x3c\xad\x00\x3b\x27\xca\x11\xbb\xc5\x3e\x9a\xfa\x3e\x8d\x89\xb8\xa4\x21\x9a\x5e\x9e\x77\xa1\x98\x80\xeb\x12\xf7\xed\x55\xe5\x9d\x98\xb1\xa0\xc2\x5d\x04\xbf\xda\x20\xb0\x45\x02\x06\x50\x40\x45\x84\x28\x0a\x77\x5a\x61\x21\xe0\x6b\x7b\xc7\x10\x47\x32\xd8\x1d\x16\x1b\xe0\x43\x81\xd6\x94\xe1\xdf\xa0\x84\x02\x20\x09\x00\x65\x6b\x48\xcc\x83\x03\x70\x0a\xfd\x0d\x10\x70\x0d\x7c\x4a\xe4\x67\x8a\x21\xa1\x52\x00\xf2\x65\x48\x00\x8d\xf4\x6c\xc1\x2d\x0c\x63\x34\x06\x4b\x2a\x36\xf2\xa5\xbb\x0d\xf6\x37\x60\x47\x63\xa0\x64\x0d\x3a\x68\xb5\xc8\xff\x59\x93\x71\x28\xff\x22\xab\xdc\x22\xc6\x71\x4e\xda\x37\xe6\xb2\x3b\x14\x86\x6f\x09\xbd\x23\x73\x23\x00\x9a\x89\xf5\x5f\x4a\x9f\xd5\x71\xcf\x8a\x32\x23\x54\x30\x91\x04\xda\x6e\x29\xc9\x49\x9d\x56\xcb\xb7\x1f\x5a\x47\x6d\xac\x64\x9b\x83\xac\x7b\x77\x77\x9d\xfe\xa8\xf8\x6d\xb4\x47\x36\xd6\x2e\x51\x51\x4a\xb4\xb2\x12\xea\x2d\x75\xb9\x05\x4e\xdf\x2e\x00\x94\xe6\x83\xe4\xe5\x15\x5e\xc7\x4c\xf1\x78\x4b\x0b\xba\x0e\x52\xce\x52\xb1\xee\x52\x48\xe3\xe0\x17\x28\xfc\x4d\x13\x3b\xd6\x6c\xd3\x77\x74\xbd\xce\xbb\x3b\x35\x4c\x5b\x1a\xc8\x7e\xdd\x91\x5f\x0a\x38\x0c\xb2\x0a\x3e\x25\x02\x62\xc2\x0d\xc1\x40\x04\x19\xdc\x22\x81\x18\x07\x0c\x85\x50\xda\xc9\x82\x82\x0c\xad\x9a\x2e\x4a\x6b\xc0\xf5\x6b\x54\x26\x7c\xe5\x52\x21\x02\x97\x21\xba\xda\x45\x65\xe1\xd2\xcc\x9a\x1a\xe7\x7f\x45\x24\xde\xe6\x16\xc2\x92\x3b\xc2\x85\x57\xe5\xc3\x38\xc0\xc2\xf5\x58\x6c\x10\x11\xd8\x87\x82\xb2\xf2\xcf\x92\x58\x8c\x86\x21\x62\x67\x90\xc0\x35\x72\xbc\x22\x5d\xf2\x20\x0e\x5d\x3f\xc1\x30\x2c\x3f\xfc\xf3\x28\xf7\xe4\xe3\x00\x26\xa2\x22\xa9\xd4\x20\xa1\x5e\x0c\xb9\x80\x9a\xd8\xe0\x19\x47\x08\x7c\x48\x97\x4b\xda\xbf\xfc\xe3\xb3\x49\xcc\xe1\x1a\x4d\x7c\xf9\xfc\x4e\x3e\xf7\x0c\x0f\x7b\x06\xc4\xe4\x1b\xf3\x40\x73\x89\x87\xee\xe1\x36\x0a\x11\x7f\xfe\xfc\x00\xfc\x0c\x43\x1c\x00\x44\x04\x93\x76\x22\x64\xe8\x07\xf0\xe9\x5a\x52\xfd\x7a\xf4\x69\xac\xfe\x94\xb4\x4e\xff\x93\xa1\xb0\x7d\x58\xa2\xab\xfd\x21\xa1\x66\xf2\x79\x18\xda\x3f\xff\x7c\x3d\xfa\xd4\x52\xc1\xef\x21\xcc\x8f\x10\x6c\x18\x5a\xfd\x8f\xeb\x51\x67\x82\x5c\x8f\x8e\x0a\xd4\xfd\x71\x02\x8f\xdc\x54\xfa\xd1\xa7\x01\x3a\xfa\xaf\x7f\xc7\x54\xfc\x03\x46\x58\xff\xf1\xe3\x44\x3d\x1d\xe7\x7f\x95\x14\xac\xfd\x3d\x43\xd4\x9a\xf7\x4a\x74\xae\x79\x37\x21\x7d\xdd\xb8\x61\x58\xf3\xeb\x9f\x73\xbf\x1d\x74\x15\xa7\x59\x39\x31\xa4\x2c\x45\xac\x5e\xe6\x59\x8b\xcf\xac\x78\x5b\x89\xda\x16\xbc\x53\xae\xea\x50\xe1\x5e\x6f\xdd\x5a\xad\x59\x0b\xe0\x06\x93\x7c\x14\x21\xc2\x3f\x1b\xc3\xa5\xb9\x5f\x2f\x75\x74\x53\xe9\x5c\x11\x2d\x54\xf1\x86\x86\x52\xcd\xed\x7a\xa7\x88\xb7\xf0\x0c\x9d\xda\x60\xa4\x43\x3c\x07\x98\x4e\x6e\x0f\x61\x18\x6d\xe0\x5f\xb3\xa8\x7d\x74\x8f\x7f\x0b\x71\x08\x97\x38\xc4\x62\xf7\x2b\x25\x5d\xb5\x55\x1f\x12\xf8\x2e\x1b\xa8\x86\xe8\x65\xd3\xa9\x4e\x5f\x2c\x0a\x3a\x81\xc7\x51\x44\x99\x68\xa2\x16\x9e\xb7\x92\xbf\x8b\x96\x32\x36\x2f\x4c\x0d\x5a\x52\x9e\xba\xa9\xb4\x82\x6c\x0d\x05\x9a\x33\xba\xc2\x61\xe3\x65\x72\x53\xf0\x75\x0e\x56\xaf\xc5\x5b\x63\xd1\x6c\xd5\xde\xe0\x7a\x67\xfb\xf5\xbb\xf7\xff\x07\xfc\x7c\x08\x4e\x4e\xe7\x97\xa7\xc7\xd3\xab\xd9\xc5\x39\x38\xbf\xb8\x9a\x1d\x9f\x1e\x80\x8d\x10\x11\xff\x61\x92\x89\x6c\x4e\xd2\xc8\xe6\x44\xb3\xfd\x04\x73\x1e\x23\x3e\x79\xf9\xf7\xef\xbe\x05\x6f\xb0\x00\xe8\x3e\xa2\x1c\xf1\xbc\x11\x0e\xa4\x1f\xf5\x3a\x8c\xef\xc1\xed\xa1\x75\x51\x11\x64\x21\x46\x0c\x60\x81\xcc\x4b\x74\x05\xd6\x58\xd0\xa8\x9d\x8b\xf6\x38\x67\x50\xb5\x6a\xf2\xb7\xa6\x0b\x77\x51\xa4\x44\x61\xe6\xfb\x10\x7d\xa9\x10\xbd\xc3\x61\x28\x5f\x11\x98\xc4\x48\x2a\x89\xa5\x3a\x12\x08\x00\x26\x60\x15\x8b\x98\x21\x83\x33\x88\x42\x48\xf8\x18\x30\x14\x85\xd0\x57\xa6\xcc\x06\x29\x8a\xe4\x07\x80\x4b\x7a\xdb\x2e\xd2\xf5\x55\x11\x75\xae\x04\x86\xdb\x56\x52\x6f\x36\x3d\xab\x8a\xd6\x4b\x1b\x49\xec\xe6\x8c\xde\xe2\x00\xb1\x7e\x12\x62\x56\x80\xd6\x4b\x46\x28\x65\xdd\x5b\xbb\xe5\xad\x86\xbd\x8a\xed\x26\x5e\x22\x46\x90\x40\xfc\x1c\x09\xb9\xcd\x4a\xe6\x46\xcd\xf4\xdf\x56\x7c\xec\x1c\x69\xab\xac\xcd\xe0\x9c\x06\xe8\x0d\xa3\x71\x79\x5f\xb5\xa2\xfc\x59\x01\xda\x10\x61\x75\xa5\x03\x25\xc4\xb5\xc2\x0f\x28\xdd\x94\x68\x40\x85\x3f\x26\x6b\x8f\x24\x6f\x3c\x57\xfb\xe0\x83\x99\x19\x48\x7f\x48\x3e\x42\x37\xdc\x33\x3f\xab\xef\xf8\x10\xda\xd2\x81\xc9\xf5\xe8\xa8\x88\xb8\xd4\x91\x0a\xbf\xd2\xf7\x65\xa4\xae\x47\x47\xe5\x49\x54\x2b\xd9\xc4\xd4\x6c\xb3\x25\xcf\x90\x80\x15\xe7\x06\xc3\xb0\xc4\xa0\xbc\xf0\x9a\x32\x80\xc9\x8a\xb2\x6d\x1a\xd4\xb5\xfe\x1d\x50\x0e\xb4\x63\xb5\x5d\x2c\xd2\x4e\x37\xee\x1b\xb5\x21\x2f\x34\x59\xc4\x88\xe1\x5b\x28\x90\x59\x9d\x66\x4b\x39\xcf\x7f\x53\x47\x40\x18\x86\xf4\x2e\x55\x21\x52\xea\x43\xb0\x8a\xc3\x70\xe7\x99\x91\x13\xef\x07\x13\x13\xe7\x26\x54\xb1\x1f\xd8\x40\x0e\x68\x2c\xd4\xc9\x0a\x90\x04\x93\x42\x06\x40\xdf\x47\x9c\x8f\x15\x51\x2c\x08\xfd\x4c\x1d\xc5\xff\xb2\x00\x26\x02\xcb\x01\xe6\xc6\xa7\x0f\xc0\x2d\x86\xe0\xe7\xf9\x31\x40\x24\x88\x28\x26\xa2\x9d\xb1\xf2\x78\x67\xe1\x5c\x53\x8e\x7c\x86\x04\x3f\x25\x3e\xdb\xd9\x39\x34\x58\xd6\x45\xe9\x33\x27\xf4\xdb\xc8\x6f\xb5\xe3\x7f\x9e\x1f\x77\xf5\xf7\x6b\x1c\x57\x97\x1c\x6a\xa0\xd0\x0a\xc6\x44\xad\x49\x50\x98\xf3\xb8\xe4\x0c\x57\x6f\x23\xb7\x58\xab\x55\x83\x35\xde\x4b\xad\x07\xea\xf6\x0d\x6b\xb9\xa1\xe0\x91\x94\x4d\xdd\x41\x62\x2b\x10\x70\x2c\x45\x96\xd9\x36\x63\x63\x1b\x6a\xf3\x0f\x05\xfa\xd0\xcc\x10\x0c\x4c\xe7\xb3\xc6\x51\x95\x3e\x80\x53\xbe\xf0\x94\x64\xf4\xcc\x09\x8e\x67\xcc\xae\x94\xf9\x72\x0c\xae\xde\x55\x36\xb1\x8d\x1a\xe4\xe5\x47\x7a\xbc\x36\x4a\xa2\x09\xb9\x17\x0c\xf8\x2a\xbb\xcc\x6e\x8b\x8f\xae\xd0\xcf\x69\xb2\xdb\x1b\x84\xd2\x0d\x23\x4e\x95\x2c\xa9\xb2\x23\x97\x94\x86\x08\x56\xec\xef\x28\x5e\x86\xd8\x6f\x0b\xa0\xd5\xbe\xce\x23\x59\x35\xf6\x20\x5c\xa8\x4f\x9a\xac\x74\x86\x11\x56\x82\x15\xb1\x44\x86\x5a\xb1\x9b\x51\xb8\x2d\x8f\xb1\x5a\x02\x77\x2d\xb1\x74\x54\x1a\x2c\xae\x15\x0c\x34\x38\xbd\x47\x7e\x2c\xc1\x35\x4b\x1f\xa8\x53\xd1\x8c\x86\xc6\x63\x5b\xee\x40\x44\x03\x9d\xe0\xa1\xf1\x96\x8a\x68\x3a\x9f\xf1\x03\x70\xb5\xc1\x1c\xa8\x57\x31\x07\x30\x08\x74\xe4\x52\x7a\x70\xa9\xf9\x0f\x2e\x5f\x4d\x8f\x95\x83\x08\x63\xb1\x49\x8e\xc2\x0f\x80\x32\xa9\xe7\x34\x00\x09\xda\x40\xe2\xfd\xf1\x99\xf5\xf4\x03\xea\xf3\x03\x78\xc7\x0f\xe0\x16\xfe\x46\x89\x72\xf9\xd1\x0d\x9f\x84\x50\x20\x2e\x26\x31\x47\x6c\x1d\xe3\x00\x4d\x22\x1a\x78\xc8\x02\xf1\x24\x3e\x07\x72\x61\xda\xd9\x57\x5f\x68\xc6\xa9\x95\x36\xd4\x34\xaf\x47\x47\x65\x2a\xee\x8f\x82\x15\xd8\x65\x3e\x68\xa2\x8d\x33\x09\x46\x52\x44\x52\xca\x60\x20\x89\x0c\x92\xf9\x28\xa2\x7e\x32\x5c\x71\xfa\x76\x01\x4c\x84\x0d\x2c\x0a\xd1\x46\xf3\xb5\x67\xc2\x7d\x2d\x9d\xa6\x7e\x88\x95\x4c\xec\x22\x32\xd7\xa3\x23\x07\xee\xd5\x8b\x91\xcf\x0b\xe8\xe7\xe3\xa4\x52\x63\x91\x83\x3a\x84\xcb\x63\xf0\x94\xfb\x41\x21\xaa\x0e\x28\x18\x92\x73\xc4\x24\x9b\xff\x62\x16\x70\x36\x3d\x03\x06\x0b\x60\x27\xf7\xf1\xd9\x04\xc3\xad\x81\x64\x01\x4d\xbe\x51\x84\xf4\xa4\x7a\xf6\xcc\x59\x99\xb2\x6f\xda\x2d\x6b\x4b\xfc\x32\xeb\xd8\x02\xa5\xeb\xd1\x91\x6b\x5e\x7b\x57\xb7\x47\x32\x57\x06\xc2\x17\xda\xa0\x30\x0c\x81\xb5\x7a\xbd\x25\x94\xf2\x50\xfd\x07\x23\x6e\x28\xaa\x04\xa4\x31\x79\xf4\x6a\x4b\xf1\x98\xa2\x07\x2c\x7a\xf5\x92\x7c\x36\x3d\xb3\x22\xee\x3d\x47\xec\x8d\x12\x71\x5a\xde\xfe\xd3\x66\xe4\xfc\xd3\xa0\x86\x11\xef\x20\xd1\x87\x9c\x63\x33\xb1\xdd\x65\x4e\xd7\xa3\xa3\x0a\xfa\x55\x33\xd6\x6d\xe4\x5f\x22\x4e\x63\xe6\xa3\xe3\xe4\xc8\xd6\x9d\x5e\x5b\x34\xce\x6a\xfd\x72\x95\x68\x64\xf2\xd0\x93\xcc\xa8\x1d\x20\x48\xce\xc0\xe4\x31\xb2\x58\x6f\x28\xe9\x72\xa6\xe7\xc5\xc9\x36\xd3\x4f\x54\x58\xb7\x5d\x60\xf9\x61\x07\x4f\xb3\xe1\x04\x8b\x91\x93\xa8\x72\xbf\x5f\xcc\x4e\x8e\xfb\x50\x50\xfb\xe4\xe9\x1c\x24\x3c\x10\x19\xe7\x11\x40\x0e\xee\x50\x18\xca\x7f\x67\x97\x8b\x69\xa2\x77\xa6\x8a\x83\xc0\xf1\xf9\x0c\x44\x61\xbc\xc6\xa4\x5d\x44\x7e\xa0\x31\x3b\x9a\xed\x05\x21\xd7\x5c\x78\xed\xb7\x49\x0a\xf0\x5a\x58\x2e\xae\x65\xad\x51\xbb\x0d\xb7\xd6\x80\xbe\x87\x14\x41\x72\xb1\xa0\x10\x0c\x2f\x63\x81\x4c\xde\xa7\x5f\x88\x15\x34\x4c\x57\xdf\x03\xad\xc2\xbb\x50\x61\xd7\x26\xc5\x1f\x84\x50\x01\xf3\x95\x43\xf5\x14\x78\x90\xcc\xe2\xbd\xf9\xac\x21\x5c\xa2\xf0\x71\xa3\xd8\x35\x0f\x5e\x7e\xc7\x23\xe8\x37\xff\xb8\xd5\x26\x2e\xa6\xb0\xa6\xc3\x95\xc9\x3b\x76\x33\xc6\x80\x9b\x23\x1b\xe6\xbe\x43\xc0\x87\x44\x17\x3e\x25\x36\xdd\x85\x22\xbe\x64\x5f\x25\xcf\x8a\xd6\x5f\xcb\xdd\xd3\x7b\xb8\x8a\xed\x55\x30\xc3\x9b\x6c\xb4\xaf\x5a\x27\x93\x16\x92\xe5\x27\x38\x6c\xfd\x4c\xe5\x28\x4e\xbe\x7f\xaa\xab\x69\x52\x77\xd4\x3f\xde\x93\x29\x60\x51\xd1\x8d\xc2\x72\xa1\x5e\x3c\xd1\x1a\xb8\x73\xaa\x9d\x4e\x16\xad\x96\x73\x07\x35\xbf\x5a\x71\x91\x0e\x47\x0f\x48\xd7\x1e\x23\x3a\x49\x23\xd7\xe9\x7c\xbf\xae\xaa\x3d\x32\x8f\x90\x8f\x57\xd8\xd7\x6b\xae\xca\x5a\x31\xe1\x02\xc1\xc0\x22\xad\x92\xb7\x12\xd9\xeb\xad\x11\x41\x4c\x39\x5f\xc9\x17\xed\x0e\xc4\x87\x18\xb0\x92\x1a\x17\x24\xec\xe5\x5c\x69\xec\x76\x00\xaf\x00\x25\xe1\x2e\xd9\xe9\x85\x70\x82\x46\x85\x6f\x68\x1c\x06\x60\x89\x12\x7f\x54\x2e\x1f\x8d\x85\xfe\x3f\x26\xeb\x89\xd5\xbd\x26\x65\xa6\x0f\x1f\x7d\x61\xd4\xdc\x91\x0e\x01\x45\xdc\x30\x9f\xaa\x4a\xc5\x2e\x34\x0c\x27\xfc\x47\x55\x16\x27\x1d\x7e\x89\x50\xe2\x8d\xf5\x92\x02\xad\x80\x35\xb0\x51\x07\xab\xed\xea\x68\x8c\xba\x8e\x6e\xeb\xea\xa3\x6a\x0b\x9d\xaa\x8a\xa7\xf2\x8a\x73\x8f\x52\x28\xf3\xa9\x4b\x54\xba\x04\x46\x91\x03\x87\x74\x21\x75\xf5\x5a\x61\xb5\xd3\x0a\x45\x48\x82\x5e\x85\x58\xed\xe1\x37\xb2\x83\x17\xc5\x8d\x5e\x69\x0d\xb3\x96\x71\xd3\x56\x4c\x66\x81\x0f\xb8\x20\x9a\x35\xb2\x56\x5c\xd5\x4e\x6c\xd8\x4b\x62\x2f\x3c\x17\xc1\x8b\x4e\x7d\x4d\xfd\x7e\x96\x61\xd1\xba\x5d\xe6\xff\xe3\x08\x09\xe4\x23\x88\x6c\x89\x05\x93\x86\x4f\xc2\xa3\x78\x4d\x28\xd3\xd1\xdc\x4f\x3a\x9c\xdb\xb2\x24\xa8\x1e\xa6\xae\x66\xd1\x80\x93\x32\x96\x07\x08\x09\xd4\xcd\xda\xb0\x47\x31\x70\xd4\x64\x72\x85\x4f\xdd\xa6\x8f\x66\x8c\xee\xf8\xa9\x60\xe3\x2f\x0b\xa0\x01\x81\x0d\xe5\xc6\x30\xc0\xbc\x13\xd2\x4d\xe0\x3d\x7e\x0b\x40\x1d\x34\x4b\xef\x07\xae\xcd\x6c\x74\xcc\xd1\x71\x00\xd1\x8a\x3a\x9d\xe1\x0e\x56\x2e\x5e\x37\x6b\x5d\xe4\x76\x0b\x19\x86\x44\xa4\xb5\x80\x87\x07\x87\x7f\xb3\x55\x7b\x87\x07\x87\xdf\x67\xfe\xfe\x7b\xfa\xf7\xcb\x17\xd7\xa3\x4f\xe0\x99\x41\xf4\xb9\x7d\x7a\xd8\xba\xcc\xcf\x85\x45\xb6\x2e\x4d\xa2\x53\x53\xb6\x26\x31\xac\xff\xf9\xef\xb5\x3f\xbf\x7c\x91\xfb\x39\x3b\xa3\xc2\x8b\x87\x85\x02\xb9\xaa\x05\x93\x30\x9b\xe4\x7f\xcb\x89\x15\xab\x62\xe5\x6c\x1c\xcf\xfe\x5e\x7e\x56\x18\x43\x3f\x3b\xac\x48\x23\x6f\xa5\x8b\x2b\x94\x91\x83\xf5\x8a\xdb\xf9\x21\x63\x91\x49\xe5\xb3\x76\x13\xc3\x4c\x36\x67\xfb\xa4\xa0\x46\xc0\x5c\xea\xfc\x7c\x7a\xd5\xc4\x56\x5a\x43\x81\xee\x60\x9f\xf0\x45\xc5\xde\xfc\x09\xaf\x37\xe1\x6e\xaa\x33\x0c\x43\x24\xb7\xa0\x35\xfa\x10\x07\x10\x6c\xd4\xef\x00\xda\x17\xc0\xf9\xf4\x0a\x18\x6c\xd4\x16\x5d\x60\xb2\x76\x7c\xc7\xd5\xe3\xec\xdb\x85\xad\x7d\x82\xb9\x1d\x30\xd0\x7f\x72\xf9\xf6\xb0\x5b\xbd\x30\xbb\xfc\xc6\x6c\x31\xcf\x2c\x4c\x3d\xe1\x1a\x50\xf5\x53\xcf\x82\x32\x34\xc8\xc3\xaa\xa1\x46\x46\x26\x68\x2c\x9a\x48\x85\x02\x0d\x8a\x9b\xdc\x01\x08\x00\xbb\x3a\x43\xec\x7e\xcb\xba\x83\x6c\x5a\x49\x54\x3f\x9f\xd5\xbb\x8f\x47\x32\x9f\xb8\x36\xa0\xee\x93\xd6\x26\xcd\xb2\x99\xbb\x5c\xec\xbc\xe7\x54\xb9\x3a\xf5\xb1\x2f\xc0\x56\xcb\x61\x27\x51\xc6\x62\x40\x57\x29\xc9\x6e\x27\x01\xd0\xd0\x4d\xf7\xba\xb6\x67\x37\x35\x80\x5c\x8b\xf9\xf3\xfc\xb8\xd1\x39\x4c\x2c\xe8\x34\x0c\xa9\x0f\x05\x9a\xcd\x6f\xbf\xeb\x13\xf7\x9b\xe6\x60\xfd\xfc\x1d\x90\x0e\x19\xe2\x42\x3b\xd8\xf3\xdb\xef\xc0\xf1\xec\xe4\x12\x2c\x43\xea\xdf\xe8\x20\xed\xe4\xaf\xdf\x01\xb9\x42\xf8\x3e\x09\xe9\x48\xbc\x5b\xc5\x84\x86\x1a\xd4\xc9\x95\x5f\xbe\x91\x9e\x5f\x9d\xf4\x5c\x33\x7a\x29\x55\xba\x36\x3e\x8b\x90\x29\xd7\x52\x95\x1c\x69\xd9\xc5\x7c\x96\xe4\x1e\xde\x46\xbe\x47\x74\xe9\x80\xea\xf1\x90\x54\xd8\xe8\xd7\x3d\x41\x3d\xb1\x41\xd9\x7c\x72\x18\x61\x4f\xa7\xff\x7a\x49\x7d\xc6\x00\x65\x5e\xc3\x20\x62\x4b\xbb\x4a\x13\xae\xce\x3c\x42\xf7\x82\x41\xc9\x3b\x5f\xef\x24\x4e\x65\x70\x25\x92\x47\x33\xb2\x3d\xe6\x90\xcb\x3e\x06\xe8\x60\x7d\x00\xa0\xfe\x45\xbe\x6d\x85\x84\x91\x0c\x40\x02\x20\x3b\x00\x03\x6f\x43\xcb\x82\xa7\xc9\xa2\x3c\x14\x0e\xd5\x34\x97\x9b\xf6\x51\xd1\x3d\x95\x22\x5f\x99\xf8\xc3\x22\xe2\x5c\x81\x16\x7d\x3c\xb3\x5f\x45\xaf\xe1\x16\x57\x9f\x1a\x75\x37\xca\x67\xf3\xdb\xbf\x28\xc3\x58\x35\x7e\x33\x42\x1d\xac\xd4\x68\x80\xae\xc0\xed\x5f\xb2\x35\xd7\x77\x1b\x44\x92\xc3\x19\x00\x01\x41\x77\x52\xb6\x1f\x8c\x0d\xa8\xef\x6a\x41\x7d\xd7\x04\xd4\xb0\x56\xb9\x9c\x5e\xc1\xe6\xed\x39\xd1\x02\xf4\xef\x1a\x42\xef\x32\x77\xb7\x91\x2d\xa7\x54\xb4\xa1\x95\x65\xe1\x36\xa0\xb3\xc7\xde\xaa\x28\x6c\xb1\x81\x4c\x57\x86\x2d\x90\x1f\x33\x2c\x76\xaa\x42\xec\x32\x76\x34\xb2\x68\x6b\x9d\x48\xef\xd3\x87\xa1\xf4\x6e\x82\x00\x70\x03\x1f\xa8\xf2\x26\xc0\xe2\xd0\x64\x21\x90\x00\xac\x18\xdd\x2a\xd3\xc0\x38\x1a\x89\x17\x5b\xf8\x48\xbe\xab\x4e\xa2\x14\xd6\xba\xe4\x31\xff\x8a\xa9\xa4\x30\x35\x94\x31\xc9\x96\x18\xeb\xec\x6d\xba\xdd\xc6\x04\xfb\xb9\xa3\xeb\x5c\x82\xa7\x1a\x25\xf7\x9d\x01\xaa\x1b\x26\x02\x5f\x45\x04\xe4\xf2\x19\x8f\xc9\x2c\x61\x2c\xfd\x2f\x13\x03\x4b\xa2\x62\x79\xec\x78\x3b\x7e\x7e\x22\x62\x13\x22\x36\x48\xc1\x25\xb0\x61\x2b\x94\x4c\x70\xa4\xc6\x6f\xd2\x25\x63\x5f\x57\x6b\xea\xba\xdf\xd4\xda\xd6\x6c\x20\x57\x2c\x63\x72\x19\xcf\xe5\xe6\x7b\x2e\xad\xaf\xa4\x50\xac\x15\x13\xf6\x1a\xc8\x49\x44\x9e\x95\x34\x3d\x94\xd8\x33\x78\x03\x75\xfa\x85\xe6\xbc\xb9\x64\xbc\x9c\x18\x7b\xae\x14\x74\xca\xad\x92\xf3\x96\x48\xdc\x21\x44\x1c\xec\xaa\xd8\xb4\x15\x6d\x1e\x06\x03\x37\xd1\xdc\x82\xba\x07\xf9\xb4\xed\x82\x3c\xad\xa5\x82\x9c\x3c\x58\xbc\x69\x6d\x39\xd5\x80\x72\x4f\xa8\x14\xff\x00\x7b\xf7\xe5\xc2\x65\xd5\x15\x70\xb9\x41\x3b\x7d\x1a\x31\xfd\xd5\xd0\x9e\xdc\x22\x82\x11\xf1\x91\x29\x2b\x51\x47\x3a\xa6\xc5\xc1\xc7\x67\x13\xdb\xec\x60\xc2\x90\x92\x3e\x1e\x86\x5b\x0f\x92\xc0\xbb\x8d\xfc\xc9\xf3\x6c\xa2\xfb\x07\x23\x9d\xee\xb1\x3e\x1b\xfa\x79\x7e\xcc\x2b\x7d\xb8\x98\x23\xcf\xbe\x29\x41\x79\xaa\xdb\xbe\xe7\xc7\x5c\xd0\xad\x97\x3b\xe0\x7e\xde\x4e\x2d\xec\x9d\x61\xc6\xad\xab\x9d\xdc\xf5\xe8\x28\x4b\x0b\xdd\xbd\x23\x9d\xee\x5e\xef\xb0\xc5\x14\xaf\x47\x47\x0e\xe2\xc9\x11\x3b\xf7\xe7\xcb\x37\xab\x57\xb1\x03\x97\x91\x5c\x29\x78\x1c\xbc\xe8\x76\x48\xab\x5d\xa6\x06\xfb\xb3\x9d\xc5\x35\xae\x89\x15\x15\xf4\x59\x5d\x14\xa3\x56\x63\x0d\x18\x6e\x5b\x87\x74\x09\x43\x7b\x9d\x84\x6a\x79\x15\x86\xc0\xdf\xe0\x30\xe8\x18\x77\x6b\x02\x31\x17\x80\x2b\x34\x4c\x1b\xf8\x82\x81\x61\xce\xd0\x6d\xd9\x66\xa4\x91\x6c\xb7\xdb\xab\x60\xb8\xed\x93\x41\x8b\xb5\x67\xd3\x33\x95\x9b\xf7\x27\x0e\xa6\x97\xe7\x52\xcf\x9b\xfc\x75\x16\x13\x5d\xca\x4c\x89\xa0\x16\xb5\x76\xd3\x6a\x0b\xbb\xc2\x92\x08\x91\x2f\x68\xcf\x8e\x5a\x79\x16\x5a\x18\x98\x43\x18\x69\x5a\x1f\xea\x04\x65\x6b\xaa\x6b\x9c\x81\x14\xa2\x21\x85\xea\x50\xdd\xb6\x3c\xed\x41\xce\x7e\x23\xb9\x89\xeb\xcc\x9c\x6c\xc1\x3e\x57\xd2\x29\x88\x19\x43\x44\x14\x72\x8e\x7a\x6d\x88\x16\x60\xdb\x18\x1e\x5f\xd8\x72\xb7\xb8\x9a\xb4\x57\xc3\xfc\x01\x05\x46\xc1\x02\xd5\x5f\x44\x95\x38\xd8\x4b\x7b\xd4\x72\x4a\x47\xc9\x2c\xa8\xba\xfe\x87\x50\x82\x6c\x55\x5e\x30\x56\xd2\xd2\x06\xa2\x6c\xbc\xdd\xfa\x81\xaa\x79\x9e\x89\x3a\xb4\x23\xf9\x23\x41\xd9\xb9\x9c\x8f\x2a\xfd\xe6\x7d\x26\x4d\x26\x4d\x28\x32\xa9\x32\xad\x48\xde\x02\x52\x55\x8a\x4d\x2b\x6b\xaa\x98\x2b\xe1\xd2\x24\x4e\xc9\x5b\x6f\x46\x15\xb3\x29\x78\x2e\x95\xba\x9f\x0d\x62\xc3\x6b\x9a\xd3\x84\xb4\x2a\x39\xb0\x89\x4a\x89\xa4\x4b\xc4\x9f\x5b\xb8\x36\x13\xac\x1d\x07\xa9\xb1\x54\x12\x35\xd3\xc8\x62\xd1\x35\x73\x8d\xcd\x96\xaf\x5f\xb0\x98\xa3\x61\xa6\x85\x89\xc2\x0c\x24\xdc\x93\xd1\xfb\x05\x6d\xd5\x4e\x40\x0d\x30\x42\xc3\x8c\xca\x26\xc5\x92\x0d\x69\x91\x80\xd3\xa1\x3b\x2d\x64\x07\xa4\x44\x63\xf8\x3d\x44\x46\x55\x31\xe7\xa0\x1b\xbc\x87\xed\xd4\x74\x7b\x77\x35\x9a\x92\xcd\x1d\xc6\xf7\x8d\x9a\x2a\x85\x0e\x75\x55\x61\x96\x86\xf1\xfd\xeb\x30\x2f\x3f\x1d\xc9\xc9\x04\x64\x72\x89\x61\x24\x55\xaf\x66\x43\x85\x7a\xf2\x57\x04\x39\x57\xe7\x52\x0a\x03\xf9\x44\xf5\xd5\x5d\x52\x2a\xb8\x60\x30\x52\xed\xfe\x4c\xdc\x95\x23\x94\xb4\x45\x5e\x85\xf1\xbd\x1f\x1c\x60\xaa\x1a\x53\x4c\x94\x86\xce\x16\xb6\x52\xa2\x14\xf8\xaa\x8c\xe8\xbe\x0c\xe8\xc7\x84\xb8\x73\xbb\xaf\xb1\x48\x9a\xec\xf6\xb3\x82\x19\x8a\x28\xc7\x82\xb2\x5d\x92\x57\x6c\x52\xee\x0f\xc0\xb1\xbe\x75\x10\x61\xb1\x41\x0c\xbc\x51\x89\x0d\x80\xaa\xbf\x42\xb8\x6c\x6f\x1a\xf7\x19\xab\xa3\x20\xc8\x12\x6a\x5c\xe4\xf5\x41\x24\x81\x69\x32\x0b\x75\xf7\xe7\x4c\xff\x66\x7d\x9c\x90\xbb\xe0\x00\xaa\x36\xcf\x19\x32\x28\x6d\xbd\xd2\xd3\xbc\x88\x38\xb8\xa2\x34\xbc\xc1\x02\x3c\x33\x9d\xa5\x9f\x37\x17\x17\x0f\x8d\x47\x49\xa6\xbc\x2e\xc8\x8b\x06\xb7\xa7\xba\x15\x78\xeb\x9b\x52\x61\x61\x53\xaa\x18\x2f\xe4\x2a\x88\x97\x6e\xdc\x8a\x4d\xd9\x98\xa0\x03\x8d\x52\x73\x23\xe9\x1b\xdc\xa8\x44\x3e\x01\x5a\x8e\x24\xd5\xc8\x68\xfb\x72\x9d\x00\xd0\x81\x2d\xcb\x20\x82\xaa\xe2\x51\xc9\x41\x10\xbc\x2a\x0c\x2a\x85\x52\xae\xa9\x94\x6d\x58\x7f\x7a\xd2\x4e\x10\x0c\x35\xa6\x53\x2e\x4a\x02\xc2\xbc\xe9\x5a\x43\xa2\x0b\xfb\x76\x2b\x1a\x25\x89\xad\x0a\xb7\x9f\x50\xb8\x05\x16\x10\xc0\xea\xe8\xe4\x5f\x31\xf1\xd5\xd6\x53\x07\x90\x30\x69\xbc\x6f\x66\x6a\x5a\xe3\x0d\x46\xc0\x87\x40\xc8\x49\x5d\x29\x30\x9a\x51\xf6\x52\xbe\xd9\x8a\xaa\xe6\xd2\x21\x8b\x19\x25\x60\x47\x63\xf6\x00\xec\xd6\x66\xa0\x8e\x4a\x87\xe5\x67\x9f\x72\xe5\xb8\x66\x53\x7f\x71\x65\xa4\x08\x21\x85\x99\x91\xf9\xd2\xea\x48\x7b\x78\x92\x00\x84\x98\xdc\xc8\xdf\xb1\x70\xe9\x8c\x03\xf0\xe1\x8d\xbe\xcf\x40\xf5\xfc\xfa\xf8\x6c\xa2\x9b\xe6\x7a\xff\x8e\xb1\x7f\xc3\x05\xcc\x35\x2a\x1c\x52\x7b\xf5\x46\x3c\x73\x7a\x54\xc6\xf9\x7a\x74\x94\x9d\x57\x9a\x17\x98\x91\xda\x17\x51\xa3\xe4\xe8\x55\xde\xf2\xae\xd9\x2f\xca\x46\xef\xbe\x5f\x5e\x16\xd9\x78\xc0\x2d\x52\x86\xdd\x71\x57\x28\x6a\x7c\x75\x2e\xb7\x96\x4d\x6b\xa6\x39\xa7\x02\xfd\xa0\x6b\xee\x54\xe8\xcf\xb4\x59\x56\x32\x97\x86\x81\x36\x5a\x81\x50\x77\x72\x7d\x09\xae\xff\x22\x13\xc9\x31\x7e\xe9\x7a\x8f\xbd\xf1\x21\x65\xcf\x35\x0e\x0d\x19\xeb\x6f\xe0\xc4\x41\x8a\x03\xff\x7a\xf4\xe9\x07\xdd\x24\xce\xf6\x40\x4c\xba\xc5\x0d\x9a\xc5\x27\xc7\xca\xe5\xd9\x35\x1b\xd5\x9d\x3f\x27\x81\x0d\x51\x6c\xe2\x5e\x04\x4a\xd0\xc5\xaa\xba\xd1\x77\x85\xc1\x34\x3b\x39\xae\xbe\xe4\xe5\xf7\xd2\x20\x55\x45\xf6\x25\x7a\xe4\xd9\x3f\x49\x86\x40\xf6\xfc\x3f\x49\xbb\x52\xaf\xa5\x5d\x36\x6b\x6f\x46\x5a\x86\x74\x39\xd9\x42\x4c\xd2\x54\x83\x97\x7f\xf3\x24\x59\x3d\x3b\xee\xc1\x0e\x6e\xc3\x16\x4e\x56\xbb\x19\x94\x3b\x68\x0e\x82\xaf\xca\x8d\xa8\x20\x4d\x26\x6d\x21\xd9\xb6\xf9\x7e\x59\x0d\x1c\xb6\xd6\x0e\x99\x25\xcb\x2e\xe3\x18\xfd\xaf\xc5\xc5\xf9\xe4\xff\x4e\xcf\xde\x25\x0d\xb1\xf8\x18\xf0\xd8\xdf\x00\xc8\x81\x4a\x56\x70\x5c\x06\x48\x99\xfb\xb2\xe3\xa6\xeb\xf2\x70\x08\xd4\xb8\x71\x33\x69\x45\x13\xdf\x19\x37\xaf\xbc\x94\x37\x8a\xa7\xcc\xdf\x60\x81\x7c\x11\xb3\x3e\x62\xef\x78\xfe\x1e\x64\x41\xd9\x03\xae\xd3\xe3\x97\xda\xbe\x27\x52\xb6\xef\x22\x64\x2f\xdc\x2c\x49\xc8\xfb\xef\xbf\xfb\xe7\x77\x2a\xb9\xfa\xd3\xf5\x08\x6e\x83\xf4\x6f\xb6\x55\x7f\xb7\x92\x91\x3d\xf1\xc9\x8a\x53\x8d\x58\x3e\x71\x39\x77\xd7\xa6\xc4\xb5\xe6\x67\x89\x7e\xee\xe7\x26\x62\x57\x0f\x5a\x4c\x5c\x56\x43\x95\x1e\xca\x01\xf6\xa7\x33\xaf\xa3\xea\xb3\x6a\x49\xca\xe2\xa5\xb9\xa5\x4e\xd4\xba\xc9\x93\x39\xe9\x21\xf1\x76\x89\x98\xa4\xea\x9b\xf9\x7b\x7e\x00\x66\x42\xb5\xef\x5b\xaa\x33\x20\xa9\xf1\x5f\x64\x62\xc5\x84\x12\xef\xcd\xfc\x7d\x9e\xf0\x2d\x53\x7d\x1f\x60\x78\x27\x99\xb6\x68\x4b\x7b\x75\x23\xcb\x23\xaa\xc1\x81\xab\x0d\x02\x31\xc1\xc2\xa6\x1e\x2b\x03\xf7\x0d\x7e\xd5\x83\x04\xfb\x20\x3b\x67\x77\x7b\x3c\x7f\xff\x20\x5c\xa0\x01\x0f\xb1\xa0\x1a\x52\x47\x2b\xa3\x88\x86\x5d\xce\xe2\x3e\x18\x57\xcb\xc0\x41\x7c\x03\xad\x09\x72\xc2\xc6\x1e\xb8\x59\xab\xba\xa5\x56\xa9\x87\x95\xd3\x04\x55\x37\xc0\x35\x50\x08\x26\x10\x3e\x9b\xdf\xfe\xe5\x78\x76\x72\xd9\x47\x21\xcc\x4e\x2e\x01\x83\x64\x9d\x1c\xae\x21\x86\xc0\x27\xdb\x9c\x68\xfe\x49\x49\x5a\x00\x39\xc7\x6b\x82\x82\x76\xc2\xdd\x09\x5b\x0b\xdd\x64\x00\x23\x6c\x0b\xc3\x74\xe4\xab\x22\x5d\x06\x61\x92\xf4\x86\x77\xe3\x37\xa5\xa9\xa3\xad\x99\xa4\x09\xac\x1c\x93\xbc\x83\x31\xf1\x37\x57\x68\x1b\x85\xf9\xca\xe9\x0a\x27\x0a\x07\xcd\x5d\xa8\xbd\x55\x5b\x75\x8c\xa3\x11\x03\xc2\x60\x06\x66\x27\xad\x78\xc3\xf1\xb9\x5b\x12\xf6\xee\xa9\x52\x1c\xc9\x40\x04\x27\x19\x41\x9c\xad\x36\x09\x2b\xde\xbf\xba\x38\xb9\xb0\x77\xe8\x82\x3f\x9a\xaf\xc7\xe0\x8f\xef\x54\x3f\xfb\x5e\x93\x7f\x20\x94\x3a\x6e\xa2\x7c\x3e\xf2\x6d\xd5\x9d\xd7\x75\x5b\x29\xc7\xc2\xa5\xeb\x26\x07\xce\x6d\x85\x5b\xdc\xbb\x0b\xe7\x0e\x7c\xd0\xd9\xde\x60\x7a\x36\xcb\x5c\xe8\xaf\x33\xc0\xe1\x16\xa7\xd7\xa9\x8c\xc1\x27\x18\x0b\xea\x71\xbe\xfd\x64\xfe\xfe\x34\x96\xae\xc0\x27\x2e\xa0\xc0\x7e\x3b\x03\xd8\x0e\x5f\xbe\xd6\xb9\x3c\xf4\xf5\xe8\x28\x83\xa4\x74\xde\x6c\xe1\x9e\x45\xa8\xd0\x51\x47\x3e\x4e\x1e\x51\x66\x9e\x6a\x34\xad\x91\xeb\xdc\x75\x70\x8b\x1f\xaa\x34\x53\xf7\xd5\x7f\x87\x49\x7c\xff\xb2\xdc\xaf\xe8\xfd\x32\x26\x22\x7e\xf9\xe2\xc5\x5f\x6c\x5f\x23\xfd\xe4\xf0\xfb\xf4\xc9\x2b\x2a\x44\x88\x18\xf5\x6f\x90\xb0\xcf\x7e\xc1\x24\xa0\x77\x7c\xa1\x0a\xb8\x5f\xbe\x38\xfc\xfb\x31\x65\xaa\x3f\xbd\xba\x48\xbe\xf2\xad\xd7\x71\x18\xee\x7b\xeb\xc5\x5f\x8a\xb0\x86\x2d\xe6\xcc\x12\xa4\x51\xe3\xa3\x94\x46\x35\x6d\x94\x52\xb2\xd5\xbc\x94\xa5\x64\xcd\x6b\xf5\xc4\x6d\xf3\x61\x8e\xde\xcd\x3f\x2c\x2c\x41\xc3\xae\x4f\x59\xc2\x36\xf1\xe5\x2a\xdf\x07\x20\xc3\x97\xee\x5f\x24\xa1\x8b\xbf\x64\xa9\x5b\xfc\xad\x9e\xa4\x7b\xdf\xce\xd1\x71\xcf\xdb\x05\xe2\xed\xf7\x40\x21\x5f\x2f\x62\x1e\x21\x12\xcc\x19\xf5\x11\xe7\x0f\x7c\x63\x7f\xad\x74\x46\x08\x7c\x60\x28\x44\xb7\x90\x08\x95\x3b\x1a\x50\x9f\xd7\x5f\x9c\x33\xfd\x65\xa1\xfa\x18\xbf\xb6\x29\x32\x8e\x2b\x67\xee\xb8\x97\xdc\x05\xe1\xc5\x51\x00\x05\xd2\x0d\xd9\xd5\x95\x33\xdf\xf8\x2b\x92\xfe\xce\x73\x2f\x78\x8c\x86\x21\x26\x6b\xfd\xcc\xe3\x9a\x52\x91\xa5\x54\x9f\xde\x15\x8f\x76\x52\xd7\xa3\xa3\xd2\x1a\x54\xb7\xc0\x28\xdf\xb6\xf9\xb5\xb8\xe7\x1d\xde\x62\xa1\x6f\x1b\xd6\x39\x71\xb6\x01\xf6\xf4\xd7\x54\xc7\x4b\x25\xc9\x7d\x18\xaa\x4a\xb0\xdf\x28\x41\x1e\xbc\x83\x0c\x79\x5a\xa7\xea\x1f\xda\xad\xaa\x1e\xb6\xa4\xd1\x9b\x0c\x64\xee\x1f\x2e\x61\x5b\x4d\xed\x65\x56\xca\x34\x3a\x3e\x4c\x0c\xb1\x4a\x01\x55\x1d\x4d\x48\x32\x87\x57\x94\x81\xec\xf7\x1d\x8a\x4e\x9b\x43\x75\x4e\x3c\x40\x5c\x5a\x8e\xc7\x30\x82\x3e\x16\x95\x96\x8a\x8d\x96\xb8\x61\xe8\x9a\xed\xd9\xd9\xc9\xe2\xf6\xb0\x4f\x9b\x00\x63\xc7\xf2\xb4\x8f\x90\x31\xe1\x93\xae\xa8\xb6\x35\xad\x49\xe3\x55\x43\xbe\x04\x82\xde\x20\xd2\x8e\x6c\x43\x0e\x95\x6a\xcb\xd4\x6c\xaf\xa0\xd1\x9c\x06\x12\x50\x1f\x22\x99\xb2\x6b\x75\x19\xcf\xd9\xc9\x22\x9d\x80\x8a\x0e\x10\xd3\xac\x34\xeb\x12\x47\x34\x68\x47\x9c\x21\x86\x68\x42\x14\xb4\xe4\x17\x91\xc0\x5b\xfc\x1b\xaa\x74\xa2\xdb\xdc\x87\xf5\xe1\xf4\xd5\x42\x05\x00\xb6\xe6\x32\xcc\xbd\x2a\xee\xf4\xf8\x65\x59\x05\xa0\x25\xf7\xa8\xc5\xab\xc3\x8d\x70\x16\x9d\xc6\x3a\xa9\x21\x16\xd7\xa3\xa3\xe2\x04\x6b\x5a\x28\xad\xe0\xa9\xbe\xba\xbb\x0f\x65\x75\xcf\x05\x13\x83\x85\xf7\x78\x1b\x6f\x75\xb5\x3f\x0a\x32\x51\xcc\xd3\xd7\x53\xcf\xde\x13\x6e\xab\x7f\x7c\xc8\x54\xd5\x9e\x69\x13\xa1\xee\x4e\xc3\xdc\x74\x94\x68\x45\xce\x87\xc2\xc1\x4d\x36\x05\xe2\x04\x09\x88\x43\x14\x9c\x51\x82\x05\x55\x8a\xb4\x07\x11\xf5\x3a\xa8\xa0\x66\x60\x00\x83\x6d\x0a\xb9\x0d\x2d\xf6\x80\x72\x4e\x09\xc3\x6d\x4b\x95\x36\x9b\x9e\x55\x80\x32\x31\xd9\x06\x77\x76\xd4\x7e\x3f\x57\x2d\xe0\xfa\x40\x70\x1c\xfc\xd5\xcc\xac\x74\x5c\xd8\x4c\x4f\xdb\x94\x10\xa9\x50\x9d\x21\xe9\x8e\x9a\x7a\x3f\xdc\xda\xb9\x5f\xed\x4f\xda\xd8\xfb\xfd\xd7\x33\x27\x53\x32\x40\x60\xef\x25\xca\x1f\x56\x75\xa4\x6a\x25\x38\x27\x31\xbe\x7e\x51\x54\x83\x8b\xe6\x2a\xa2\xd6\xa0\x9a\xd3\x0b\x91\xee\x86\x0b\x41\xd2\x46\x0c\xc5\x28\xa9\x31\x7f\x6c\x29\xa6\x94\xa4\xeb\x42\x2b\x83\x56\x8b\xd4\x65\x28\x27\x75\xb6\xf0\x7e\x4e\x03\x3e\x47\x4c\xca\xad\x4e\x86\xeb\x16\xde\x2f\xf0\x6f\x1d\xbf\xc5\xa4\xf3\xb7\x5d\xaf\xe7\xa3\xb7\x88\x31\x1c\xa0\x24\x69\xfb\x98\x6e\xb7\x90\xf4\x39\x80\xb8\x30\x20\x93\x8b\x0b\xfe\xc4\xd3\x8c\xfa\x48\x95\x8b\xa8\xd7\x5b\x2d\x77\x02\xd4\x71\x73\x41\x15\x7c\xe7\x84\x93\x12\xe2\x86\xf9\xf7\xc9\xeb\xcd\x4f\x75\xd3\x2a\x65\xdd\x0f\x0b\x13\x53\x1a\xa7\x6d\x86\xf4\x1e\x22\x1e\xc1\xbb\xb6\x67\x77\x3d\x87\x72\xd3\x84\x95\xd6\xff\xeb\x09\x73\x7d\x7f\x39\x92\x58\xaf\x28\x43\x85\xa5\xb5\x72\x38\x71\xae\xba\xa4\xca\x76\x1c\xa2\x82\x76\xaa\x39\xe3\x79\xe2\xb8\x0c\x60\xd6\x7d\xb0\x1d\x1f\x53\x77\xa8\xb6\x0b\x90\x79\xdd\x33\xe5\xd1\xde\x8a\x32\x4f\x71\x30\x0c\xbd\x44\xe4\xe9\x46\x51\xdd\x84\xad\xc1\xab\x51\xbf\x9e\x46\xc8\x5c\x8f\x8e\xca\x73\x54\xed\x81\x6a\x90\xcc\xe8\x37\xe5\x00\x56\x95\x37\x84\x08\x72\xf4\x73\xef\xf3\x49\x55\x14\x7f\x36\x4b\x0e\xf5\x6c\x06\xd4\xdb\xc4\x5f\x42\x81\x7a\x41\x2b\x99\x56\x04\x6d\x0b\xdb\x39\xd3\x5c\xb7\xa1\x86\x35\x9f\x89\x41\xbe\x78\x53\xd5\x07\x2c\xa2\x25\xd9\xd8\xc5\xbf\x83\x40\x42\xea\xc8\x70\xcd\x80\x34\x63\x08\xce\x37\x6d\x69\xb3\xf8\xa9\x7e\x8a\x69\x53\x7c\xce\x37\xb6\x4b\x9d\x36\x32\x30\xef\x3a\xe5\xa6\x40\xdd\x93\xfc\xca\x3d\x47\x74\x68\xb5\x1c\x22\xed\xd2\x26\x77\x1f\x2c\x27\x01\x1e\x55\x97\x8e\x69\x14\x85\xd8\xb4\xd7\x90\x3b\x3d\x0d\x30\x83\x37\x69\x8b\x4c\x5a\xca\xa8\xe4\xe0\x59\xd2\x0c\xf3\xf9\x18\x14\xc0\x48\xe9\x70\x6e\xd9\x20\xe9\xd5\x51\x03\xcb\x42\x6a\x45\xfd\x47\x8d\x7b\x03\x17\x47\x40\x57\x9f\xf5\x56\xfd\x9a\x12\x41\x70\x05\x73\x3d\x26\xbb\x6f\x0f\x8d\x94\xaa\xe4\x88\xa2\x70\x67\xe7\xdc\x4d\x52\xec\x05\xe6\xa4\x8b\x3e\x42\x2a\xa5\xb2\x35\x21\xc3\xfb\xec\xa7\x0d\x05\xe3\x86\xde\x29\xe5\xa5\x3e\x05\x09\xa8\x96\x59\xab\x8d\x00\x3a\xa7\x7b\x4b\xc3\x78\x8b\x4e\x89\xcf\x76\x91\xd8\x1f\xb1\xac\x81\x31\xbb\x98\x57\x46\xd7\x6b\x7d\x32\xfd\xf9\xdb\x2d\x7f\x8b\x76\xb3\x93\x2e\xde\x99\x86\xd0\x35\x34\xa6\xbf\x6e\xe2\x52\xd6\xad\xe9\x1a\xaf\xe1\x72\x27\x5a\xc6\x50\x2a\xbe\x4a\xf7\xef\xf7\x2f\x6a\x70\xbe\xda\x30\x1a\xaf\x37\x51\x5c\x69\x89\x34\x20\x7c\x83\x98\x56\x87\x34\x99\x75\xa4\xb2\x63\x30\x07\x6f\xcc\x85\x48\xf3\x98\x45\x94\x23\xb0\x58\x9c\x8c\xf5\x1b\xdf\x56\xbf\x61\xdc\x33\x93\x6c\xad\x6d\x3d\x5b\xb5\xbf\xc1\xeb\x0d\x10\xc9\xd4\x0b\x19\x38\x98\x1e\x1a\xb0\xaa\x66\x47\x9a\x8d\x28\x00\x92\x39\x93\x91\xb9\x6f\x5f\x39\xa6\x61\x00\x7e\x3a\x31\x8f\x85\x7d\x9c\xd2\x15\x24\xa7\x24\xf2\xb5\x61\x13\x67\xd6\x51\x21\x5f\xa6\x8a\x58\xf9\x8f\xbe\x6d\xf2\x51\x47\xfa\x65\x47\xc2\xf4\xb0\x34\x92\x9b\xa4\xd9\xaf\xb8\x5f\xfe\x2a\xa5\x72\xee\x4d\x51\x7e\xb3\x21\xe1\x33\xea\x6d\x1d\x7d\xdb\x24\x37\x66\x1d\x95\x52\x62\x8a\x5f\x4a\xed\x47\x0f\x8b\x8f\xb8\x5f\x7e\x24\x1e\xe4\x52\xb4\x34\x67\xad\x2a\xf0\x5c\x9b\xa3\xe0\x30\x72\xab\xc3\xff\x55\x07\x0b\x35\xc7\xd3\x8e\x00\x9c\x23\x9e\xe7\x16\xab\x05\x2f\xa3\x1c\x0b\xae\x0d\x14\x14\xad\xd7\xc2\x01\x4b\x9e\x84\xa3\x6a\xc7\xaf\x3a\x82\xb9\x27\x79\xa8\xea\xdc\xd4\x2d\x4a\xdd\x7a\xa9\x46\xe5\x56\xab\x42\xb7\x8e\xad\x53\x03\xfb\xa2\x55\x4d\x42\x9a\x95\xf9\x05\xd5\x87\xea\xce\xc0\xa1\xfb\x48\xb4\xee\x44\x29\xf3\xdb\xd2\x9d\xdb\x51\x7d\x4a\x58\x79\xda\x52\xf4\xd9\xcb\x36\x70\x95\xf5\x57\x7d\x20\x50\x1d\x47\x31\x3f\xf4\xcb\xd8\x67\x28\x62\x88\x23\xa2\xaf\x73\x3a\x7d\xbb\xf0\xb2\x1d\xfc\xb5\x6f\xa0\x72\xa7\x95\x8a\x91\x76\x9e\x94\xeb\xd2\xad\x88\x22\x29\xe4\x31\xd2\x05\x82\x81\x12\xf3\x77\x2a\xf4\xcf\x58\x86\xc0\xfb\x73\x34\x1e\x08\x01\x35\x7e\x92\x58\x8d\x04\xc3\x3e\x3f\xa6\xa1\x5c\xff\x7c\x14\xaa\x22\xb3\x7a\xcd\x20\x89\x43\x28\x77\x75\xf3\x04\xeb\xec\x47\x1d\xec\xc3\xad\x46\xf3\x41\x63\x06\x1d\x75\x48\x76\x66\x0e\x8c\x07\x61\x46\xd5\x2d\x69\xb9\xd3\x8d\x17\x8d\x87\xab\xfd\x8d\xb1\xea\xf3\xf5\xc1\x0f\x69\x1c\xa4\xfd\xbc\x06\x4b\x70\x4c\x97\xd3\x83\xdc\x33\x73\xf2\x13\x66\x29\xa4\x87\x34\xba\x38\xb7\x66\x1a\x83\xa6\x31\x36\x41\xfd\x7a\x74\xe4\xa0\x5c\xb9\x03\xc7\x53\xdd\xc1\x53\xdd\xc1\x53\xdd\xc1\x53\xdd\xc1\x53\xdd\xc1\xe3\xaf\x3b\xa8\xb3\x68\x40\xeb\xf8\x6a\x19\x5a\x6b\x6b\x62\x8f\x67\xf3\x54\x16\xf1\x54\x16\xf1\x54\x16\xd1\x70\x55\x9f\xca\x22\x1a\x91\xa9\x67\x59\x84\x1f\x42\xce\xb1\xff\x8e\xc2\xe0\x15\x0c\xa5\x1b\xcf\xce\xe1\xf6\x2b\x72\xdb\xd4\x5c\x3a\x8a\x80\xea\x43\xbd\x34\x48\x71\xd3\x5e\x32\x56\x8d\xa9\xb5\x3f\xd1\xfe\x8c\xaa\x35\xf0\x0a\x9a\xa9\xcc\x9b\x93\xf3\xca\x03\x98\x06\x76\xe7\x87\x63\x6d\x23\xc3\x20\x60\x88\x57\xdf\xa7\x65\x6f\x95\xd2\x63\x7a\x01\xe1\x9e\xf9\xe4\x79\xda\x59\xf7\xe4\x7c\x01\x42\x4a\x6f\xf2\x71\xb7\xfd\xf4\xd8\x9b\x3a\x53\x3d\xfa\xf5\xe8\x28\x3f\x03\x95\x27\xe3\xc4\xc8\x4d\x44\xab\xe9\x2f\x63\x22\x70\xaf\xeb\x86\xb2\x77\x15\x30\x0d\x0d\x3c\x3b\xbe\x9c\x3d\xcf\x26\x5a\x26\xe3\x71\xdb\xf9\x95\xe4\x63\x91\xed\xee\x44\x68\x3b\x8e\x9b\x06\x51\x7c\xcc\x50\x80\xcb\x07\xc3\x2d\x66\x9f\x39\x8c\xfc\x70\xf5\x2d\x78\x4f\x42\x29\x38\x51\xd0\xad\x24\x64\x19\x33\x2e\xe0\x32\x44\x5e\x84\x98\xf2\x95\x89\x8f\xbc\xe4\x04\xdc\x8b\x2d\x78\x6f\x4b\x03\xa4\x83\x02\x63\x70\xab\x9c\x07\x4a\xc2\x9d\xa2\xc1\x95\x27\xf1\x4f\xcf\xcd\xbb\x1e\xae\xf6\xab\x2b\xe9\x30\x95\xeb\xd1\x51\x96\x84\xda\x77\xdd\x37\x39\xe7\xd2\x3e\x95\x9b\x3d\x95\x9b\x3d\x95\x9b\x3d\x95\x9b\x55\x50\xf6\xa9\xdc\xec\xa9\xdc\xac\xea\x54\xf8\xa9\xdc\xec\x3f\xb4\xdc\x8c\x9f\x60\xae\x03\x03\x8e\x50\xd4\x3e\xd6\x70\xc2\x70\x0e\x77\x13\x2f\x51\x88\xc4\xa9\xba\xa9\xb5\x45\xe2\x5c\xa1\x57\x6b\x03\xe7\x04\xff\x86\xc0\x27\x33\xdc\xa7\xa4\x3f\x6e\x2e\xf2\x8f\x7f\xc3\x64\xed\x89\x0d\xf2\xcc\x7b\x93\x76\x32\xbd\xe2\x40\xa1\x0c\x36\xf1\x37\x24\x52\x3a\x08\x6b\x7e\xb2\x71\xe8\xb4\x49\xed\x7f\x6c\x21\xdc\x53\xa9\xd7\x53\xa9\xd7\x53\xa9\xd7\x53\xa9\xd7\x53\xa9\xd7\x7f\x70\xa9\xd7\x03\x15\x40\x3d\xd5\x0b\x3d\xd5\x0b\x3d\xd5\x0b\x35\xa5\xfe\xa3\xc6\xbd\x73\xbd\x90\x7b\xc7\xeb\x77\x7f\x91\xea\x63\x4f\xd5\xc4\x23\x28\xf8\x11\x90\xad\x91\x50\x6b\x30\xbd\x3c\x7f\x0c\xe7\x4c\x1a\x23\x63\xbf\x0c\x7b\xca\xd4\x08\xb4\x93\x4c\x4f\x75\x51\x75\x26\x4c\x0d\x8c\xa7\xba\xa8\xa7\xba\xa8\xa7\xba\xa8\xa7\xba\xa8\xa7\xba\xa8\xa7\xba\x28\xf0\x54\x17\x05\x9e\xea\xa2\x32\x64\xfb\x2a\x75\x51\xf9\x90\x7e\x7e\x91\xcb\x39\xa7\x99\xdf\x33\xe9\x21\xd9\xa7\x55\x19\x5b\x35\x46\x76\xd9\xb1\xa8\x32\x35\x73\x03\x25\x69\x4e\xf5\xa7\x0f\xd9\x6f\x8a\x59\x3d\xe6\xa7\x21\xee\xdd\xc9\xdf\x62\x99\xe6\x60\x02\xb1\x81\x42\xdd\x07\x93\xf8\xd8\xea\x6e\xca\xb2\x57\xd3\xec\x4e\x9e\xee\xe3\xa8\x61\x4a\x85\x24\xaf\xdc\xb9\x85\x95\x85\x22\x9a\xb7\xa6\xc1\x16\x93\x34\x1d\xba\x8b\x41\x6c\x13\x02\x07\x3f\x1e\x4a\xae\xa5\x81\x64\x07\x3e\x64\xf7\x48\x92\x84\xe8\xbc\x46\x31\xfb\xa6\x47\x79\xee\xff\x93\x6f\x32\x83\x78\x74\xe5\x59\x48\xed\xfc\xfe\x1c\x6a\xb5\x77\x24\x76\x42\xe6\x7a\x74\xe4\x9c\x6e\xe1\xd4\xa9\x95\x06\x76\xae\xb7\x6b\x19\x07\xdc\x4b\x2a\xaa\x9c\xe3\xf3\x52\xd2\xe8\x12\x4a\x4b\xcd\xe5\x0a\x36\xdb\x46\x9d\x86\x70\xef\xa0\xd9\xf4\xac\xc9\xc6\x81\x42\x40\x7f\x33\x57\xb9\xd8\x0f\x1e\x5b\x70\xee\xb8\xd4\xbe\x51\xf7\x6e\x4f\x2f\xcf\xfb\x9c\x27\x5f\xd2\x41\x40\xf4\x4d\x2a\x90\x30\xe6\x88\x6d\x31\x97\x26\x37\x7f\x45\x63\x12\xc0\xbd\x97\xe9\x39\x41\xde\x61\xb1\x99\x06\x01\x25\x73\x7b\x07\x66\xeb\x04\x8a\xfc\xe7\x1d\xb7\x5c\x89\x53\xea\xd7\xb0\x66\x6d\xea\x68\xde\x82\x96\xb5\x34\x1a\x70\xdf\xab\xd4\xb3\xe9\x59\x56\xab\xd1\x15\x80\xe9\x1e\x6c\xb9\xc9\xf7\xc3\xab\xdc\xd1\x55\x7c\x50\xbd\xbd\xc3\xe5\x8c\xac\x19\xe2\x95\xd9\xb2\xb5\xda\x10\x46\xd1\x19\x2a\x1f\xa2\x74\xc9\x87\x5b\xc5\x61\x68\x8f\x36\x04\x05\x53\x03\xb9\xd5\x09\x60\x3d\xa8\xba\x19\xcc\x19\xba\xc5\xe8\xee\xe1\x26\x02\xec\x08\xc3\x4d\x28\x01\xe9\x9e\x58\x2c\xe8\xc2\x87\xe1\x7e\x3b\xa7\xc9\xa4\x92\x3b\x76\x75\xbe\xae\xcd\x5d\xb7\x85\x23\x6d\x8f\x6a\x1b\x43\x75\x4e\xcd\x47\x4c\xe8\x1b\xcd\x06\x99\x9b\x54\xaa\xc6\xdf\x56\xc6\x67\x10\x00\x86\x7c\xca\x02\x45\xec\x4b\x1a\x0b\x04\xfe\xfa\x2d\xc0\x04\x50\x29\xf5\xd4\xc1\x13\x0d\x6f\xf5\x05\xec\x27\xe7\x8b\x17\x87\xc0\xdf\xc0\x30\x44\x64\x8d\x0e\xc0\x19\x65\x08\x60\x92\x96\x44\x9b\x40\xcd\x4a\x8a\x25\xf0\x61\x83\x18\x4a\xed\x38\x39\x13\xd3\x97\x80\x1d\x60\xaa\x72\x2e\x27\x39\x05\x3f\x81\xfe\x16\x4d\x02\xc2\x5f\x1c\x4e\x98\x44\xe5\xaf\xdf\x4e\xbe\xe1\x48\x78\x71\xe4\x41\x0f\xc3\xad\xc7\x68\x88\xba\xe5\x7c\x7e\xc9\x89\x97\xcd\xc6\xa1\xe6\x7e\x3d\x3a\x92\x44\xad\xce\x51\x52\x25\xea\xbf\x40\xe1\xef\x95\x53\xce\xcf\xd1\x72\xaf\x6c\x6c\xca\x65\x04\xdd\x81\xd3\x57\x0b\x70\xbc\x98\x81\x67\xa7\x21\xe4\x02\xfb\xe0\x55\x48\xfd\x1b\xb0\x10\x92\x7c\x89\xad\xaa\xfe\x0f\xd7\x08\xcc\x88\x40\x6c\x05\x7d\xf4\x1c\x04\x0c\xdf\x76\xdc\x68\x83\x0d\xee\xa6\xd0\xaa\x9b\xf6\x40\xf7\x02\x31\x02\xc3\x9a\xa2\x9f\x26\x14\x86\x81\xb1\x8c\x2d\x3c\x2f\x20\x1c\x44\x8c\xfe\x0b\xf9\x22\xb9\x19\x5c\x49\x18\x5d\xe7\x9b\xb0\x76\x2b\x5a\xf6\x18\xc6\x39\xfb\x15\xaf\x4c\x2a\xad\xa5\x1a\xde\xc2\x35\x7a\x15\xe3\x30\xe8\x27\xfe\x54\x5a\xb2\xc6\x57\xe9\x97\xd3\xe3\xcb\x94\x2f\x52\x5e\xb8\x44\x6b\xcc\x05\xdb\x3d\x37\x0a\xe8\x00\x5c\x6d\x30\x07\x98\x83\x98\xa3\x55\x1c\x2a\x00\x4b\x89\x0e\x26\xeb\xb1\xfa\x9f\xb9\xe8\x7e\x0c\x20\x38\x9e\xa9\xda\x04\x29\x3c\xa4\xa3\x4f\x10\xd2\xc2\x25\x8a\xf9\x06\xa8\x99\xa8\xff\x9e\x1e\x5f\xb6\x5b\x8b\x47\x86\xbb\x73\xa1\xee\x2f\x61\xa5\x41\x5f\x5e\xe1\x56\xb6\x76\x8e\x07\xdc\x4a\xbf\x62\x9f\x55\xa8\x51\x87\x4d\x57\x6d\x24\x15\x84\x63\x81\xa7\x0b\x82\x61\xec\x34\x36\x8b\x64\x72\x8b\xeb\x87\x30\xd2\xa5\x85\x9c\xec\xd6\xae\x96\x79\x1e\x48\x85\x39\xbe\x27\x83\xb9\xea\xf6\xe0\x5c\xe7\xa7\x12\x05\xaa\x0c\x79\xdf\x04\xf3\x2f\x91\x29\xc0\x1c\x22\x63\xcd\x02\x05\xcc\x40\x55\x39\x6b\x75\x05\x22\xd9\x4a\x62\xe4\xbf\x9c\xc4\x1c\xb1\xb5\x2a\x11\xb1\xb0\x3c\x0b\xcb\x14\xba\xa9\x5d\xa7\x5a\x3f\x77\x2b\x6d\x2b\x65\xb1\x0d\x8a\xde\xf5\xe8\xc8\x45\x84\x24\xa9\xad\x0e\xf1\x66\x99\x6d\x5f\xee\x5e\x15\xe7\xf0\x5b\x78\x3f\x67\xb8\x9a\x5d\x74\xd1\x4a\xe5\xc4\x28\x01\x01\xda\x42\x12\x80\x48\x41\x71\x8e\x41\xc9\x89\x7a\xe7\x15\xe4\xa8\x69\xf1\x5e\xc5\x80\xee\x23\x73\x3b\xc0\x1c\x31\x1f\x11\x01\xd7\x68\xba\xa4\xb7\xa8\xc7\x78\x39\x16\xbb\x54\xf7\xa7\x7f\x78\xe1\x1d\xbe\x78\xf1\xb1\x15\x73\xd6\x7c\x99\xce\xe9\xf0\x85\x7b\x56\x92\xb7\xa6\x61\x48\x7d\x65\x0c\x2f\x04\x83\x02\xad\x3b\x85\x88\x24\x24\x2b\x8e\xe6\x94\x96\x13\xf6\x3b\x50\xe3\xd0\x7b\xd9\x8d\x18\x8e\x0f\x53\x5a\xbc\xec\xaa\x10\xab\xfa\xe5\x25\xfc\xbd\x8f\x1f\x5b\xb2\x53\x2d\x75\xf7\x2f\xe2\xb8\x4e\x72\x0f\xa8\xf6\xdc\x01\xe3\x0f\x79\xb1\x95\xa4\x21\xcb\xc7\x69\x31\xef\xa4\x79\x67\xb2\xba\xc1\x4a\xf9\xc5\x85\x51\xae\x47\x47\x79\x74\x6a\xfa\x87\x2d\xde\x34\x8b\x6a\xa9\x50\xe4\xec\xe4\xeb\x65\xc2\x69\x0c\x10\x07\xe9\xd2\x01\x7b\x66\xad\x53\xd4\x78\xbf\x44\xc1\x4e\x03\x38\x85\xc3\x1d\x16\x9b\x77\xd4\x87\x61\x2f\x67\x42\xa1\x03\x60\x01\x07\x20\x19\x3f\xd4\x88\x64\x33\x95\xc1\x39\x15\xf6\xd6\x7c\x93\xba\x52\xea\xce\xd8\xce\x0c\x78\x78\x04\x52\x21\x25\x58\xec\xae\x11\x96\xa4\x5c\x6c\x20\xeb\x57\xc7\x6a\xa6\xa2\xba\xfc\xe5\x27\xc3\x15\x6c\x00\xb7\x94\xac\x95\x31\x9a\xe2\xaa\x0b\x46\xbb\x55\x4e\x0c\x3f\x60\x15\xad\x5a\xc9\xf4\x74\x17\xbb\x49\xec\xe4\xe1\x41\x64\xa7\x4f\x89\x60\x34\xe4\xa5\x1d\x55\x93\xc8\xdf\xe4\x10\xb5\x29\xcc\x0a\xe1\xb7\xf8\xa9\x59\x48\x3f\xa4\xbd\x02\xd9\xb3\x15\x90\x1a\xeb\x4e\xfa\xc9\x72\xf9\xd4\x32\x2f\x16\x3f\x15\x64\x7b\xc4\xe8\x2d\x0e\x50\x60\xdc\xe9\x60\x0c\xa8\xd8\x20\x76\x87\x39\x02\x58\xc8\xa7\x78\x4d\x28\x43\xc1\x01\xb8\x20\xe1\x0e\x50\x82\x00\x5d\x81\x79\xbc\x0c\xb1\xff\x16\xed\xe6\x50\x6c\xc6\xe9\x7f\x55\xc2\x77\xf2\xbf\x73\xb8\x45\x36\x80\x98\x64\xc0\xb6\xab\xa9\x7a\xc4\xd3\x70\x47\xc3\x94\x23\xb3\xe0\xa5\x02\xe8\xf6\x9e\x5b\x29\xb4\xfb\x41\xce\x9b\x12\x41\x4d\xed\x44\xcc\x31\x59\x83\xc5\xe2\xec\xe3\xb3\x09\x96\x7c\x19\xc4\x2a\x53\xe6\x1b\xce\x37\x9e\x8e\x95\xb4\x0b\x29\x57\x8c\x9b\xd1\xfd\x15\xc3\x5c\x8f\x8e\xaa\x70\xab\x8e\xe8\x46\x96\xbe\x3d\x92\x5b\xf5\x1a\x81\x1b\xa4\x10\x5d\x22\xa9\x48\xd3\xa2\x04\x8d\x8a\xc4\xec\x06\xed\xfc\x0d\xc4\xe4\x00\x64\x19\x4a\x89\x0f\xbd\x6d\x6f\x61\x18\xa3\x2c\x9f\xb4\x22\xdc\x03\xa2\x51\x4f\xba\x06\x27\xd8\x0d\xc9\x47\x24\x93\x63\xa2\xca\x34\x1e\x09\x29\x1f\x12\xa5\x7a\xb2\x4a\x71\xd0\x83\xac\x57\x1b\x04\x22\x28\x36\x16\x53\x89\x63\xd4\x8b\x45\x8c\xe8\x4b\xa6\x62\x54\xb3\xb2\x0e\xaf\x47\xff\x6f\x72\xc0\xf9\x66\x82\x83\x7f\x32\x0e\x0f\xa2\x78\x79\x3d\xca\x0a\x40\x39\x40\xbf\x45\xf9\xb2\x13\xd2\x59\xc7\xa5\x49\xe9\xc7\xfb\x27\xe6\x76\x9e\x55\x3d\xd2\x22\x9b\x70\x3a\x7b\xe0\x4a\xda\xae\x06\x93\xd2\xfc\x95\x5c\xe9\x14\xa0\x95\xa2\x61\x3f\x05\x9c\xba\x6b\x40\xdf\x55\xda\x9b\xca\x26\x4d\x6b\x1e\xf3\xaa\x5b\x65\x0a\xf6\xc9\xb2\x68\x03\xdd\x6d\x93\xe9\x6b\xa3\x9a\x24\x20\xae\x56\xc8\x6f\x58\x9e\x7e\xf3\x3d\x3f\xc0\xf4\x33\x8c\xf0\x67\x9f\x32\xf4\xf9\xf6\xf0\x40\x8d\x73\xaa\x61\x38\xb9\xf4\x66\xaf\x32\x74\x7e\xa6\xf6\x40\xe3\x0f\x5b\x71\xe3\x4d\x9e\xbb\xf4\x48\xe3\x12\x45\x06\x61\x98\x6c\xb3\x7f\xf0\x36\x5e\x22\x46\x90\xca\x2e\x55\xcb\xd3\x94\x31\xea\xa1\xb8\x19\xe0\xbd\xbb\xa6\xac\x92\x0f\xb6\xf0\xfe\x3d\x31\x29\xfe\x61\xaf\xaa\x24\x8e\x44\xd2\x67\x28\xd3\x5b\xc8\x14\xc7\x6e\xa0\x30\x86\xa7\x4f\xb7\x08\xc4\xe9\x98\xe0\x6e\x83\x88\x2e\x22\x93\x86\x56\x26\xd7\x16\x3c\xb3\x7d\x08\x02\x00\xb9\x81\xd9\xce\x0e\xfc\x62\x48\x39\xb9\x39\x4f\xdc\x34\x7c\xf7\xa8\xc9\x1c\x25\x68\x3e\x32\x52\x67\x11\xeb\x28\x03\x0a\xdc\xde\x64\xa9\x06\x73\xe0\x55\xc6\xb2\x3b\x24\x99\x4c\xbe\x4b\x26\x6e\x17\xd8\x39\xd9\x71\x31\x3b\x39\x9e\x05\x88\x08\x2c\x76\x73\xed\x7d\xb2\x86\x17\x23\x64\xcf\x8d\x38\x8f\x11\x7b\x7f\xf9\x2e\x7f\x76\x8a\x11\x11\xb3\x93\x16\xe7\x86\xf6\x8b\x0e\xca\x43\x07\x30\x8e\x43\x88\x2b\x7d\xd6\xfd\x9f\xf7\x68\xaf\x95\x50\xa0\xc3\xc7\x5d\x5b\xeb\xd8\xc5\x51\xb3\x7e\xdc\x8d\x8f\xbe\x76\xdf\x83\xbd\x08\xc6\x1c\x31\xb9\x0e\x9d\x39\xc8\x02\x68\xc9\x43\xad\x44\x58\xbb\x7d\x57\x39\xbb\x6a\xac\x2b\x36\x54\xd5\x46\xa9\xe6\xc5\xe2\xd2\x0f\x68\x8a\x2b\x43\x39\x42\xbe\x4a\x44\x26\x40\x4a\x30\x1b\x38\x63\xd9\x46\xbd\xa7\x6f\x17\x00\xc6\x62\xf3\x1b\xe9\x70\x74\xd4\x72\x80\xbc\x4c\x8d\x10\x83\xf9\x16\x7b\xd5\x01\xd2\x84\x0c\xaf\xc3\xf8\x7e\xca\xca\xbb\xe4\xcb\x35\x4c\x48\x0f\x6f\x7c\x5d\xa2\x07\x42\x4c\x10\x80\x6c\xad\x2a\x86\x6c\x74\x18\x01\x89\x2a\x08\x20\xda\x52\x02\x4e\x4e\xe7\x97\xa7\xc7\xd3\xab\xd3\x93\x56\x06\x43\xef\xc1\x9c\x7b\x30\xa5\xe6\x4f\x28\xdc\xda\x75\xf8\x0f\xa1\xaa\x44\x19\x58\x9c\x1f\x9e\xae\x95\xc3\x39\x29\x2b\x81\x61\x61\x5f\x3f\x83\x04\xaf\x10\xaf\x6e\x6b\xdd\x24\x3c\x7c\xac\x40\xaa\x18\xb5\xca\x62\x53\x0b\xbd\xb5\x90\x6d\x04\xe6\x0d\x16\xe0\x12\x45\x14\x50\xa2\x4f\x65\xc3\xb0\x2b\x6d\x06\x19\xd0\x49\x1d\x55\x5e\xdc\x23\xd2\x26\xc7\x54\x30\x24\x12\x37\x08\x45\x40\x30\xe8\xdf\x48\x01\x24\x91\xfc\x13\x07\x7c\x47\x7c\x29\x84\x54\xc6\xda\x3f\x74\xc8\x09\x73\x20\x85\xee\x2d\x0c\x11\x11\xf2\x4b\x53\x6a\x2b\x0d\x3e\xcf\x5b\x63\xe1\xc9\xaf\x3c\x01\xd7\x6a\xce\xfa\x11\xa1\x02\x71\x8f\xa1\x15\xc0\x44\x53\xa0\x23\x35\x1f\x0b\xce\x95\x16\x15\x8f\x60\x75\x2a\x51\x83\x45\x39\xd6\x87\x89\x20\x81\x25\x9d\x15\xa6\xfa\x5a\x5b\xbe\x50\xb8\xe8\x6b\xf9\x8a\x1b\x0a\x1d\xac\x0f\xc0\xaa\x07\x7d\x1f\x60\xf8\x0a\x23\x12\x06\x17\xa4\xfa\x8a\xad\x46\xa7\x74\x84\x0b\x16\xfb\x42\x63\x24\x28\x90\x40\x3d\xd5\x51\x7d\x4b\x03\xdd\x3f\x49\x77\x23\x56\xa8\x06\x28\x0a\xe9\x4e\xc5\x5c\x21\xcf\xbc\xdb\x91\x52\x0f\x3c\x7a\xb3\xd4\xb9\x3b\x2c\x36\x72\x09\xfa\x92\xd1\x86\x02\x07\xd1\x06\x8d\x00\x76\xb4\x45\xab\x34\x42\x49\x2c\x3a\xb7\xa5\x8b\x72\x2e\xa6\x74\x2a\xf7\xc4\x54\x6a\xa6\xfa\x07\xb1\x3d\xcd\x01\xb9\xa4\x66\xde\xcf\xb6\x3d\x89\x19\x0a\xa1\x48\x4f\x0e\xa8\xa5\xb4\xba\x31\x23\x11\x91\x69\x92\x42\xb2\x71\xa5\x20\x65\x28\xa2\x1c\x0b\xca\x76\x52\xc4\x49\x11\xd8\x3c\x06\xf0\xe5\x31\xcb\x59\xbb\x73\x47\xbb\xd3\x9a\xab\x43\x69\x1c\xb5\xaa\x57\x6d\xc5\x93\x29\xf8\x41\xd6\x3c\xed\x84\x5a\xee\x82\x9a\x94\x16\x35\x5e\xa7\x66\xd0\xf2\xb4\xd5\x4d\x4a\x8c\x2a\x68\xe7\x4f\x9c\x92\x20\xa2\x98\x88\x85\xbe\x8e\xa1\xa3\x05\x3c\xce\xff\xea\xec\x7a\x63\xf3\xe4\xcb\x24\x49\xd1\x4a\x73\x9d\xcb\x3f\x86\x74\xcd\x47\xb9\x87\x1f\x07\x30\xbc\x53\x72\x67\xb2\xd2\x90\x21\x8a\xbd\xa4\xc2\x04\x27\xb7\x31\x17\x60\x89\x80\xed\x83\x2f\x6d\x64\xdb\x3d\xd4\x56\x6b\xe8\x36\x4b\x88\x08\xa6\x60\x9a\xfe\x53\xf9\x89\xdb\xab\x1b\x33\xd3\xb5\x8f\xe4\x24\x5b\xdf\xd9\xf8\x05\xe6\x90\x6d\x95\x94\x9f\x4c\xcd\xbd\x88\x99\xf9\xd5\xbc\x25\xa7\x5c\xb8\x23\xd1\xa9\x3a\x51\xff\xeb\x16\x6c\x6d\x99\x52\xf3\x4a\xf6\xad\x00\x54\xe5\x38\x3b\xdb\x2e\xb6\x5b\x1f\xdf\xae\x70\x6b\x8c\x86\x56\x12\x0d\x95\xdb\xd9\xd4\x6c\xf1\x41\xa4\x5e\xf6\x16\xa4\x72\x48\x79\xdf\xec\xdb\xdc\xb1\xd4\x1c\x7a\x41\x2a\xaa\xc2\xfd\x26\xe2\x90\xc6\x22\x8a\x45\xcf\x3c\x88\x0b\x05\x04\x04\x98\xa9\xf6\x41\xbb\xc4\x85\xb6\x37\xff\x05\xf2\x2f\x89\x12\x10\xe6\x46\x73\x0e\x9e\xad\x55\xb7\x34\x81\x92\xdf\x8c\x3f\xde\xee\x60\xe5\x41\xc7\xce\x30\xe9\xc1\xe4\xc7\x7f\xc7\xd8\xbf\xe1\x02\x32\xe1\x49\xa5\xef\x49\x63\xad\x22\xe7\x89\x21\xdd\x9e\xad\x07\x51\xe9\x4a\x4d\xe3\x7f\xcb\x41\xc1\x42\x8e\x6a\x91\x3d\x00\xc7\x3a\x49\x0d\x82\x25\x83\xc4\xdf\x8c\x81\x74\x07\xd5\xd5\x5b\xca\x81\xdf\x40\xbe\xc9\x18\xb0\xed\x44\xea\x90\xe3\x3a\x69\xa3\x13\x14\x7a\x50\x46\xe5\xe9\x51\x06\xde\x5f\xbe\x03\xd5\xd8\xb6\x9a\x74\x17\x90\xa6\xf8\x90\x97\x9b\xdc\xc1\x28\xf2\x02\x74\x3b\x44\x73\x3a\x43\x2c\x17\x6b\x8d\x9d\xbb\x78\x68\x5b\x5e\x5f\x06\xa3\xee\xba\x81\x20\xdd\x01\xe9\xa6\xa2\x46\xa1\xda\xcb\xde\xb2\x36\x32\x0c\x82\x6c\xd4\x28\x35\x95\x3b\x19\xef\x0f\x85\x4a\x4e\x76\x5e\xa2\x88\x36\x11\x9c\x7a\x07\xf4\x4c\x1e\x5b\x63\x61\xb6\x12\x88\x49\x80\x98\xed\x16\x69\xf0\x2e\x88\x7f\x2c\x15\xed\x1d\x0e\x43\x9d\xa0\x2a\xb7\x9c\xf4\x5a\xfe\x4b\x05\xeb\x50\x30\xd6\x31\x8d\x2d\x54\xdf\x76\x74\x88\x87\xc3\x0a\x6e\xa3\x7f\xec\xc3\xcc\x6d\xed\x6c\x21\xee\x1b\x2b\x54\x30\x0c\xde\x16\x37\xeb\xcd\x19\x61\xe5\x6f\x20\x59\x23\xde\x27\xba\xd7\x6d\x14\xe7\xa4\x57\x61\x7c\x3f\x40\x36\x62\xaa\x06\xb3\x2b\xa7\xc2\x3e\x75\xcb\x76\xc7\xe4\xa2\x91\x71\x1a\x15\x9b\xf4\x61\xa0\x87\xc1\xc2\x49\xb7\x08\x8a\xcd\xd7\x3b\xbb\xb8\x44\x21\x14\xf8\x56\x27\x4d\xea\x3b\x54\x4d\xa1\x45\x21\x32\xa0\x29\x60\x7e\xb8\x88\x78\x1a\x63\x50\x93\x37\x17\x6d\x49\xbe\x59\x61\x12\x64\xd3\x99\x72\xe1\x77\xd5\x66\xdc\xd0\xe7\xc3\xb5\xea\x44\xe8\xf1\x1d\x17\x68\x7b\x3d\x1a\x83\xeb\xd1\x12\x72\x74\x3d\xfa\xd8\x75\xed\xbe\xea\x74\xb4\x23\x94\x99\x92\xcd\x03\xd5\xff\xca\xa9\xe9\xbf\x3e\xee\x67\x0a\x6d\x1c\x2f\x16\x3f\xf5\xcf\xf1\x9d\x67\xd2\x61\xad\xd1\x6d\xd2\x5d\xed\x51\xa7\x9c\x49\x2c\x36\x88\x08\xec\xcb\x9f\x3b\x52\xbf\xdf\x48\x4e\x42\xc4\xac\x8f\x20\xbd\x32\x0b\x2f\x91\x90\x86\x91\xc1\xad\xc4\x07\x6a\xcd\x4d\xa2\x4d\x4e\xef\xe6\x36\x7b\x6b\x29\xf2\x50\x43\x57\xdb\x6d\x6b\x2c\xfe\x67\xda\x1f\xf1\x07\xca\xd6\x13\x39\x62\x85\x1d\x57\x48\x12\xe8\xa9\xb1\x24\x88\x07\x57\x58\x9d\x06\xe9\x68\xb9\x4a\xde\x1b\x97\xec\xa5\x92\xe8\x76\xe9\xc0\x22\x65\x4b\xc6\x41\xed\x5e\x1f\xda\x02\xde\x1b\x33\x86\x45\xf1\x98\xdc\x01\xad\xa5\xe3\xc3\x44\xaa\xf7\x8f\x9a\xb3\x6b\x17\xc8\x67\x48\x70\xd3\xed\xb8\x51\x73\x8b\x1b\xb4\x9b\x5e\x9e\x37\xcf\x4e\x33\xef\x3f\x54\x7e\xb2\x13\x97\xe1\xe3\x37\x6f\xcf\x16\x00\x25\x54\x4a\xf2\x5a\x06\x8a\xdf\x54\x41\xcf\xad\xd5\x2f\x28\x0c\xdf\x12\x7a\xd7\xae\x39\xe0\x20\x2d\xe4\x54\xdf\xa4\x5c\x7b\xa4\x72\x9f\xb7\x03\xb0\x40\x08\x7c\x48\x1f\x80\xe9\x2f\x0b\x10\x50\x9f\xd7\xb7\x1b\x41\x37\xdc\x5e\x46\x9b\x69\xe5\x51\x06\xaf\x3a\x8d\xb4\x0b\x5a\x34\x47\xbb\x59\xeb\x91\x36\xa8\x5e\x8f\x8e\x1c\xa4\xf8\x71\x02\x8f\xaa\xbb\xe5\xd7\x9c\x93\xc2\x3b\x9e\xed\x6c\x7d\xac\x2b\x51\x07\x5f\x56\x5d\xb8\xa7\x2a\x00\xef\xb8\x17\x52\x18\x78\xa6\xa3\x01\xf3\xfc\x64\x4c\xb3\xd4\x12\x21\x60\x31\xea\xba\xd2\xb5\xe3\x0c\xb2\xe6\x6d\xe6\xd4\x83\x0f\xf6\x4e\xe4\x7a\x74\x54\xa6\x58\x67\x86\x18\xa8\x81\xa2\x22\x57\xb6\x8d\x5f\x42\x3b\xb3\xc8\xb9\xdf\xf2\x6b\xdc\xa9\xfb\x5f\x97\xe5\xac\xc1\x6f\xa0\x9e\x84\xd7\xa3\xa3\xd2\x44\x3b\x2f\x0d\x5a\xf2\xe3\xc5\xec\xe1\xb7\x28\x5a\x72\xcf\xe7\xb8\xbc\x31\x25\x2b\xda\x1f\x75\xd3\xbf\xc2\xca\x65\xda\x7d\xdf\x24\x5e\x98\xc7\xf1\x9a\x4f\xca\xdf\xda\x76\x8d\xfa\x7f\x5e\x94\xb4\xe9\x1d\x70\x67\x56\x4d\xa5\xb6\x53\x79\x0f\xd4\xa5\x74\x76\x13\xa9\xfb\xaa\xaf\xbe\xd0\xaa\xaf\xea\x56\x7d\x55\xb3\xea\x05\x29\xb6\x0c\xe9\x5a\xed\x0c\xdd\x69\x8f\x27\xe5\xdd\x98\xac\x53\x40\x3b\x02\xb7\xd8\xf7\x22\x7b\xb5\x0c\x26\xeb\x21\xd7\xbd\x62\x32\xe5\x75\x1f\x0a\x79\xbb\xf2\x65\x42\x75\x5f\xf9\x01\x7b\x60\xe6\x1b\x53\xd6\x34\xa4\x34\x8b\x9e\x7b\xbf\xf1\x26\xcf\x7e\x25\x49\xb9\x9c\xe8\x28\xac\x16\x96\x22\x16\x94\x61\x18\xaa\x1d\x75\xb0\x0d\xba\xac\x77\xcb\x79\xb4\xda\xe7\xed\xb0\xbf\x1e\x1d\x95\x88\xd4\x79\xa9\xbf\x76\xe3\xce\x76\x0b\x31\xc8\x20\x43\x1d\xc9\xb7\xeb\x77\x59\x6d\xef\x56\x6c\xbc\x0a\xd3\xa8\x4e\x2d\xd7\x09\xef\x41\x5c\x4a\x75\x34\xaf\x3a\xe0\x48\x79\xe7\xd3\xed\x96\x92\xb4\x61\x76\x9b\xde\x95\xfb\x21\xe5\x5c\xc5\x74\xf3\x7c\xbe\x43\xf0\x16\xdd\x51\x76\xc3\x3f\xeb\xbb\xb9\x3f\x47\x37\xeb\xcf\xb1\xc0\x21\xff\x8c\x23\x82\xc4\xc1\x6c\x7e\x9e\xbf\x80\xa5\x22\x46\x55\xe2\x61\x02\x66\x73\x00\x83\x80\x21\xae\x5a\x09\x1d\xcf\x4e\x2e\x01\xa1\xa2\x5d\x7e\xd7\x1e\x30\xb9\x79\xed\xa9\xaa\xae\x9e\x43\x0e\x4a\xfe\x5e\xd0\xcc\x47\xe5\x13\x82\x7d\x17\x2f\x5c\xa5\x65\xc5\xd9\x7d\xe0\x3e\x2b\x28\xd5\xe5\x40\x12\x84\x88\x83\x98\x6c\x21\xe3\x1b\x18\xaa\xcb\x2f\x97\x54\x6c\xc0\x16\x46\x1f\x34\xea\x1f\xf5\x3f\xea\xb4\xf2\xc3\xc7\xc2\xc0\x4d\x69\xdc\x7f\xa4\x3f\xd8\x0d\xff\xfb\x1f\x7e\xff\xc3\xff\x0f\x00\x00\xff\xff\x23\x1b\x33\x4d\x5d\x5a\x01\x00") +var _schemaJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6d\x73\x1b\x37\xd2\xe0\xf7\xfd\x15\x28\x66\xeb\x59\x7b\x8b\x23\x5a\x76\x92\x4d\xb2\x39\xd5\xd1\x92\xec\xf0\x1c\xc9\x3c\x51\x4e\xee\x62\xb9\x62\x70\x06\x24\xb1\x1a\x02\xb3\x00\x46\x12\xf3\x38\xf7\xdb\xaf\xf0\x36\xaf\x98\xe1\xbc\xc9\xd6\x56\xe9\x8b\x4d\xcd\x0c\x1a\x8d\x46\xa3\xbb\xd1\xe8\x6e\xfc\xf7\x5f\x00\x18\xfd\x95\xa1\xd5\xe8\x07\x30\xfa\x6a\x12\xa0\x15\x26\x58\x60\x4a\xf8\xe4\x38\x8c\xb9\x40\xec\x98\x92\x15\x5e\x8f\xc6\xf2\x43\xb1\x8b\x90\xfc\x90\x2e\xff\x85\x7c\xa1\x9f\xfd\x95\xfb\x1b\xb4\x85\xf2\xf1\x46\x88\xe8\x87\xc9\xe4\x5f\x9c\x12\x4f\x3f\x3d\xa0\x6c\x3d\x09\x18\x5c\x09\xef\xd9\x3f\x26\xfa\xd9\x57\xba\x5d\xa6\xab\xd1\x0f\x40\xe2\x01\xc0\x68\xfa\xdb\x22\x5e\x12\x24\xce\x60\x14\x61\xb2\x4e\x5e\x00\x30\x82\x41\xa0\xbe\x86\xe1\x9c\xd1\x08\x31\x81\x11\xcf\xbc\xaf\x1c\x86\x05\xb9\x88\x90\x3f\x32\x1f\xff\x39\xb6\x50\x1d\x23\x52\xcf\x03\xc4\x7d\x86\x23\x09\x42\x8d\x8c\x86\x01\x07\x5c\x01\x02\x82\x82\xe9\x6f\x60\xab\x51\xe4\x07\x60\xb6\x02\x62\x83\xc0\x35\xda\x01\xcc\x01\x24\x60\xfa\xdb\x18\x88\x0d\x14\x00\x86\x9c\x82\x25\xf2\xe9\x16\x71\xf5\x0d\x81\x5b\x04\xa8\xfe\xde\x40\xa3\x62\x83\xd8\x2d\xe6\x08\xc4\x1c\x25\x80\x04\x05\x0c\xad\x10\x93\x3f\xc4\x06\xdb\xbe\x0f\x52\x0c\xef\x3c\x4c\x04\x0a\x43\xfc\x2f\x6f\x23\xb6\xa1\xf7\xf0\x31\x0e\xd0\x0a\xc6\xa1\x90\xd8\xfd\xf7\x9f\x7a\x2a\xcc\x44\x8c\x72\x93\x94\x99\xf4\xa8\x62\xaa\xe1\x1f\xb9\xbf\x33\x13\xc9\x05\x93\x8c\x33\xce\xbe\x2b\x90\xc6\x87\x04\x2c\x11\xa0\x5b\x2c\x04\x0a\x00\x2e\x13\x23\xdf\x7c\x0f\xa5\x1b\x80\x4b\xa0\xfd\x99\x02\x1e\xf9\x38\x60\xc5\x51\xb8\x59\x78\x8d\xc5\x26\x5e\x1e\xf8\x74\xfb\xe9\x16\xc1\x1b\x74\x4b\xd9\x35\xff\x84\xae\xb9\x2f\xc2\x4f\xd1\xf5\xfa\x53\x2c\x70\xc8\x3f\xe1\x48\xd2\x7b\x36\x3f\x47\xc2\xdd\x23\x0e\xf6\x50\x2d\x6d\x55\x5a\x28\x91\x9a\x5c\x86\x82\xb7\x2c\x40\x12\xef\xf7\x39\xb8\xe3\xdc\xdc\x14\x47\x69\xfe\xfc\x30\xde\xb3\x98\x57\x30\xe4\x28\xcf\x18\x41\xa0\xa8\x9c\x70\x04\x43\xff\x8e\x31\x43\x41\x1e\x03\xc9\xa5\xe5\x5e\x2a\xb9\x47\x08\xe8\x6f\xe6\x34\xc4\xfe\xae\xd9\x0c\xcc\x48\x88\x09\x3a\xa1\x7e\xbc\x45\x44\xd4\x72\x97\x5e\x78\x10\x44\x0a\x3c\x08\x4c\x1b\xb9\x2c\x74\xbf\xad\x98\x6b\x3f\x34\xe7\x4c\x67\x47\x38\xbd\x38\xe7\xc5\x51\x62\x81\xb6\xc5\x87\x35\xec\x90\x03\x9e\xf9\x0e\x32\x06\x77\xb5\xd4\x08\x31\x17\x52\x7c\x48\x24\xac\x18\x99\x4d\xcf\xf4\x78\xb0\x94\x31\x9d\xc8\xd2\x02\xac\x93\x3e\x8a\x5f\x9a\xae\x85\x4c\xbb\x08\xb1\x2d\xe6\x5c\xf2\xc4\x4b\x1a\x93\x00\xb2\x12\x03\xb5\x10\x44\xd3\x8b\x73\x8b\x7c\x06\x30\x58\x1a\xc8\x6a\x10\x9c\x53\x1f\x43\x81\x5a\x91\xa7\x15\x60\xe7\x40\x39\x62\x37\xd8\x47\x53\xdf\xa7\x31\x11\x17\x34\x44\xd3\x8b\xf3\x2e\x14\x13\x70\x5d\xe2\xbe\xbd\xaa\xbc\x13\x33\x16\x54\xb8\x8b\xe0\x97\x1b\x04\xb6\x48\xc0\x00\x0a\xa8\x88\x10\x45\xe1\x4e\x2b\x2c\x04\x7c\x6d\xef\x18\xe2\x48\x06\xbb\xc5\x62\x03\x7c\x28\xd0\x9a\x32\xfc\x07\x94\x50\x00\x24\x01\xa0\x6c\x0d\x89\x79\x70\x00\x4e\xa1\xbf\x01\x02\xae\x81\x4f\x89\x6c\xa6\x18\x12\x2a\x05\x20\x3f\x86\x04\xd0\x48\x8f\x16\xdc\xc0\x30\x46\x63\xb0\xa4\x62\x23\x3f\xba\xdd\x60\x7f\x03\x76\x34\x06\x4a\xd6\xa0\x83\x56\x93\xfc\x9f\x35\x18\x87\xf2\x2f\xb2\xca\x0d\x62\x1c\xe7\xa4\x7d\x63\x2e\xbb\x45\x61\xf8\x86\xd0\x5b\x32\x37\x02\xa0\x99\x58\xff\xb5\xd4\xac\x8e\x7b\x56\x94\x19\xa1\x82\x89\x24\xd0\x76\x4b\x49\x4e\xea\xb4\x9a\xbe\xfd\xd0\x3a\x6a\x63\x25\xdb\x1c\x64\xdd\xbb\xba\xeb\xf4\x47\xc5\xbb\xd1\x1e\xd9\x58\x3b\x45\x45\x29\xd1\xca\x4a\xa8\xb7\xd4\xe5\x12\x38\x7d\xb3\x00\x50\x9a\x0f\x92\x97\x57\x78\x1d\x33\xc5\xe3\x2d\x2d\xe8\x3a\x48\x39\x4b\xc5\x6e\x97\x42\x1a\x07\xbf\x42\xe1\x6f\x9a\xd8\xb1\x66\x99\xfe\x4c\xd7\xeb\xfc\x76\xa7\x86\x69\x4b\x1d\xd9\xd6\x1d\xf9\xa5\x80\xc3\x20\xb3\xe0\x53\x22\x20\x26\xdc\x10\x0c\x44\x90\xc1\x2d\x12\x88\x71\xc0\x50\x08\xa5\x9d\x2c\x28\xc8\xd0\xaa\xe9\xa4\xb4\x06\x5c\x3f\x47\x65\xc2\x57\x4e\x15\x22\x70\x19\xa2\xcb\x5d\x54\x16\x2e\xcd\xac\xa9\x71\xfe\x2d\x22\xf1\x36\x37\x11\x96\xdc\x11\x2e\x7c\x2a\x1f\xc6\x01\x16\xae\xc7\x62\x83\x88\xc0\x3e\x14\x94\x95\x5f\x4b\x62\x31\x1a\x86\x88\x9d\x41\x02\xd7\xc8\xf1\x89\xdc\x92\x07\x71\xe8\x7a\x05\xc3\xb0\xfc\xf0\xef\xa3\xdc\x93\x0f\x03\x98\x88\x8a\xa4\x52\x83\x84\x7a\x32\xe4\x04\x6a\x62\x83\x27\x1c\x21\xf0\x3e\x9d\x2e\x69\xff\xf2\x0f\x4f\x26\x31\x87\x6b\x34\xf1\xe5\xf3\x5b\xf9\xdc\x33\x3c\xec\x19\x10\x93\xaf\xcc\x03\xcd\x25\x1e\xba\x83\xdb\x28\x44\xfc\xe9\xd3\x03\xf0\x0b\x0c\x71\x00\x10\x11\x4c\xda\x89\x90\xa1\x1f\xc0\xc7\x2b\x49\xf5\xab\xd1\xc7\xb1\xfa\x29\x69\x9d\xfe\x91\xa1\xb0\x7d\x58\xa2\xab\x7d\x91\x50\x33\x69\x1e\x86\xf6\xe7\xdf\xaf\x46\x1f\x5b\x2a\xf8\x3d\x84\xf9\x11\x82\x0d\x43\xab\xff\x71\x35\xea\x4c\x90\xab\xd1\x51\x81\xba\x3f\x4e\xe0\x91\x9b\x4a\x3f\xfa\x34\x40\x47\xff\xf5\xef\x98\x8a\x7f\xc2\x08\xeb\x1f\x3f\x4e\xd4\xd3\x71\xfe\xad\xa4\x60\xed\xfb\x0c\x51\x6b\xbe\x2b\xd1\xb9\xe6\xdb\x84\xf4\x75\xfd\x86\x61\xcd\xdb\xbf\xe7\xde\x1d\xb8\x0d\x8d\x90\xae\x2f\x90\x90\xc8\x53\x32\x23\x27\x70\x57\x12\x06\x96\xf1\xe5\xd4\x16\x97\x5c\x91\xf5\x39\x12\xc6\xcb\x12\x6f\x97\x88\xc9\xb9\x0e\xe0\x8e\x6b\x5f\x8a\x94\x73\xea\x65\x48\xd7\x1c\x48\x73\xa1\x62\x39\x6c\x84\x88\xf8\x0f\x93\x89\xfc\xeb\x00\xde\xf2\x03\xb8\x85\x7f\x50\x72\xe0\xd3\xed\x64\xaa\x7e\xe6\x04\x1e\x9f\x48\x39\xc9\xc5\x64\x3a\x9f\x5d\x48\xb5\x80\x88\x8f\xe4\x1f\xbf\xcf\x63\x91\x0c\x4e\xeb\xf7\x03\xc9\x97\x5f\xb9\xdf\xfd\x7e\x81\xfe\x1d\x23\x2e\x16\x3b\x22\xe0\xdd\xd3\xa7\xc0\x72\x8d\x32\x0c\x0d\xd3\x1c\x8e\xc1\x8b\x31\xf8\x66\x0c\xfe\x31\x06\x87\x5f\x8f\xc1\x8b\x67\x63\xf0\xed\xb3\x31\xf8\xfe\xd9\x18\x1c\x3e\x97\xff\x7c\x23\xff\xf9\xee\xd9\x18\xbc\xf8\xf6\x9b\x31\xf8\xfa\xd9\xb3\x31\xf8\xe6\x6b\xd9\xe0\xc5\xa1\x7c\xf1\xfc\x1f\x63\x65\x79\xbe\xf8\xf6\x9b\x17\xed\x96\x4f\x17\xe2\xa6\x4b\xea\x41\x10\xb5\x62\x79\x7e\x0e\x4a\x77\x34\x26\xb2\x5a\xb2\x7e\xd9\x0c\x69\x67\x20\x56\x6f\x0f\xd8\xdd\x90\x91\x86\x6d\xad\x8d\xb6\xe0\x9d\x36\x87\x76\xa3\xef\xf5\x64\xd9\x1d\x5d\x96\x7a\xd7\x98\xe4\x3d\x6c\x11\xfe\xc5\x18\xf5\xcd\x7d\x5e\xd2\x7e\x6d\x6a\xb9\x54\x78\xd2\x95\x2f\xae\xa1\xc6\x77\xbb\xa5\x52\xc4\x5b\x78\x4d\x9c\x96\xd2\x48\xbb\x3f\x0f\x30\x9d\xdc\x1c\xc2\x30\xda\xc0\x6f\xb2\xa8\x7d\x70\xf7\x7f\x03\x71\x08\x97\x38\xc4\x62\xf7\x1b\x25\x5d\x2d\xb9\x3e\x24\xf0\x5d\xfb\x83\x1a\xa2\x97\xb7\x15\x75\x0a\x65\x51\x50\x10\x3c\x8e\x22\xca\x44\x13\x93\xe9\x69\x2b\xe1\xba\x68\x69\x7f\xe4\x25\x99\x41\x4b\x0a\x33\x37\x95\x56\x90\xad\xa1\x40\x73\x46\x57\x38\x6c\x3c\x4d\x6e\x0a\xbe\xca\xc1\xea\x35\x79\x6b\x2c\x9a\xcd\xda\x6b\x5c\xef\x88\x7a\xf5\xf3\xbb\xff\x03\x7e\x39\x04\x27\xa7\xf3\x8b\xd3\xe3\xe9\xe5\xec\xed\x39\x38\x7f\x7b\x39\x3b\x3e\x3d\x00\x56\xf3\xa4\x5e\xff\x49\xea\xf5\x9f\x68\xb6\x9f\x60\xce\x63\xc4\x27\xcf\xbf\xff\xf6\x05\x78\x8d\x05\x40\x77\x11\xe5\x88\xe7\x37\xa8\x4a\xaf\xbd\x0a\xe3\x3b\x70\x73\x68\xdd\x37\x08\xb2\x10\x23\x06\xb0\x40\xe6\x23\xba\x02\x6b\x2c\x68\xd4\xce\x7d\xf1\x30\x47\x50\x35\x6b\xf2\x5d\xd3\x89\x7b\x5b\xa4\x44\x61\xe4\xfb\x10\x7d\xae\x10\xbd\xc5\x61\x28\x3f\x11\x98\xc4\x48\x2a\x89\xa5\x3a\x2e\x0b\x00\x26\x60\x15\x8b\x98\x21\x83\x33\x88\x42\x48\xf8\x18\x30\x14\x85\xd0\x57\x66\xfe\x06\x29\x8a\xe4\x3b\x80\x4b\x7a\xd3\xce\x0b\xfc\x45\x11\x75\xce\x04\x86\xdb\x56\x52\x6f\x36\x3d\xab\x3a\xc9\x92\xb6\x84\xd8\xcd\x19\xbd\xc1\x01\x62\xfd\x24\xc4\xac\x00\xad\x97\x8c\x50\xca\xba\xb7\x76\xcb\x5b\x0d\x7b\x15\xdb\x75\xbc\x44\x8c\x20\x81\xf8\x39\x12\x72\x99\x95\xcc\x8d\x9a\xe1\xbf\xa9\x68\xec\xec\x69\xab\x76\x62\xc1\x39\x0d\xd0\x6b\x46\xe3\xf2\xba\x6a\x45\xf9\xb3\x02\xb4\x21\x8e\x9c\x94\x0e\x94\x10\xd7\x0a\x3f\xa0\x74\x53\xa2\x01\x15\xfe\x98\xac\x3d\x92\x7c\xf1\x54\xad\x83\xf7\x66\x64\x20\x7d\x91\x34\x42\xd7\xdc\x33\xaf\x55\x3b\x3e\x84\xb6\x74\x60\x72\x35\x3a\x2a\x22\x2e\x75\xa4\xc2\xaf\xd4\xbe\x8c\xd4\xd5\xe8\xa8\x3c\x88\x6a\x25\x9b\x98\x9a\x6d\x96\xe4\x19\x12\xb0\xe2\x4c\x6d\x18\x96\x18\x94\x17\x5e\x51\x06\x30\x59\x51\xb6\x4d\x0f\x3c\xac\xef\x03\xa8\xdd\xb4\x63\xb6\x5d\x2c\xd2\x4e\x37\xee\xeb\xb5\x21\x2f\x34\x99\xc4\x88\xe1\x1b\x28\x90\x99\x9d\x66\x53\x39\xcf\xb7\xa9\x23\x20\x0c\x43\x7a\x9b\xaa\x10\x29\xf5\x21\x58\xc5\x61\xb8\xf3\x4c\xcf\xc9\xee\x07\x13\x73\x06\x44\xa8\x62\x3f\xb0\x81\x1c\xd0\x58\xa8\x53\x47\x20\x09\x26\x85\x0c\x80\xbe\x8f\x38\xd7\x5b\x4d\x0b\x42\x3f\x53\x61\x2a\xbf\x2e\x80\x39\x9d\xe0\x00\x73\xe3\xef\x0a\xc0\x0d\x86\xe0\x97\xf9\x31\x40\x24\x88\x28\x26\xa2\x9d\xb1\xf2\x70\x47\xe1\x9c\x53\x8e\x7c\x86\x04\x3f\x25\x3e\xdb\xd9\x31\x34\x98\xd6\x45\xa9\x99\x13\xfa\x4d\xe4\xb7\x5a\xf1\xbf\xcc\x8f\xbb\x7a\x03\x6a\x36\xae\x2e\x39\xd4\x40\xa1\x15\x8c\x89\x5a\x93\xa0\x30\xe6\x71\x69\x33\x5c\xbd\x8c\xdc\x62\xad\x56\x0d\xd6\xec\x5e\x6a\x77\xa0\xee\xbd\x61\x2d\x37\x14\x76\x24\x65\x53\x77\x10\xdf\x0a\x04\x1c\x4b\x91\x65\x96\xcd\xd8\xd8\x86\xda\xfc\x43\x81\x3e\x50\x36\x04\x03\xd3\xf9\xac\xb1\x57\xa5\x0f\xe0\x94\x2f\x3c\x25\x19\x3d\x73\xba\xe9\x19\xb3\x2b\x65\xbe\x1c\x83\xab\x6f\x95\x4d\x6c\xbd\x06\x79\xf9\x91\x1e\x3d\x8f\x12\x6f\x42\xee\x03\x03\xbe\xca\x2e\xb3\xcb\xe2\x83\xcb\xf5\x73\x9a\xac\xf6\x06\xc7\x4c\x86\x11\xa7\x4a\x96\x54\xd9\x91\x4b\x4a\x43\x04\x2b\xd6\x77\x14\x2f\x43\xec\xb7\x05\xd0\x6a\x5d\xe7\x91\xac\xea\x7b\x10\x2e\xd4\xa7\xb0\x56\x3a\xc3\x08\x2b\xc1\x8a\x58\x22\x43\xad\xd8\xcd\x28\xdc\x96\x47\xbc\x2d\x81\xbb\xa6\x58\x6e\x54\x1a\x4c\xae\x15\x0c\x34\x38\xbd\x43\x7e\x2c\xc1\x35\x0b\xad\xa9\x53\xd1\x8c\x86\x66\xc7\xb6\xdc\x81\x88\x06\x3a\xf8\x49\xe3\x2d\x15\xd1\x74\x3e\xe3\x07\xe0\x72\x83\x39\x50\x9f\x62\x0e\x60\x10\x68\xcf\xa5\xdc\xc1\xa5\xe6\x3f\xb8\x78\x39\x3d\x56\x1b\x44\x18\x8b\x4d\x12\x26\x72\x00\x94\x49\x3d\xa7\x01\x48\xd0\x06\x12\xef\xfa\xa3\x07\x74\x9d\x38\xc5\x63\x8e\xd8\x3a\xc6\x01\x9a\x44\x34\xf0\x90\x05\xe2\x49\x7c\x94\x37\xbc\x9d\x7d\xf5\x99\x46\xdc\xec\x30\xa0\xcd\x30\xaf\x46\x47\x65\x2a\xee\xf7\x82\x15\xd8\x65\x3e\x68\x10\x9a\x33\x40\x4c\x52\x44\x52\xca\x60\x20\x89\x0c\x92\xf1\x28\xa2\x7e\x34\x5c\x71\xfa\x66\x01\x8c\x87\x0d\x2c\x0a\xde\x46\xd3\xda\x33\xee\xbe\x96\x9b\xa6\x7e\x88\x95\x4c\xec\x22\x32\x57\xa3\x23\x07\xee\xd5\x93\x91\x8f\x99\xe9\xb7\xc7\x49\xa5\xc6\x22\x07\x75\x88\x2d\x8f\xc1\x53\xae\x07\x85\xa8\x3a\xa0\x60\x48\x8e\xd1\x1c\x79\x19\x79\x67\x26\x70\x36\x3d\x03\x06\x0b\x60\x07\xf7\xe1\xc9\x04\xc3\xad\x81\x64\x01\x4d\xbe\x52\x84\xf4\xa4\x7a\xf6\xcc\x39\xb2\xb2\x6f\xda\x4d\x6b\x4b\xfc\x32\xf3\xd8\x02\xa5\xab\xd1\x91\x6b\x5c\x7b\x67\xb7\x47\xa0\x63\x06\xc2\x67\x5a\xa0\x30\x0c\x81\xb5\x7a\xbd\x25\x94\xf2\x50\xfd\x81\x11\x37\x14\x55\x02\xd2\x98\x3c\x7a\xb6\xa5\x78\x4c\xd1\x03\x16\xbd\x7a\x49\x3e\x9b\x9e\x59\x11\xf7\x8e\x23\xf6\x5a\x89\x38\x2d\x6f\x7f\xb7\xd1\x6a\xbf\x1b\xd4\x30\xe2\x1d\x24\xfa\x90\x63\x6c\x26\xb6\xbb\x8c\xe9\x6a\x74\x54\x41\xbf\x6a\xc6\xba\x89\xfc\x0b\xc4\x69\xcc\x7c\x74\x9c\x84\x33\xb8\x43\xcf\x8b\xc6\x59\xed\xbe\x5c\x05\xe1\x99\x1c\x8d\x24\x6a\x70\x07\x08\x92\x23\x30\x31\xbe\x2c\xd6\x0b\x4a\x6e\x39\xd3\x58\x8a\x64\x99\xe9\x27\xca\xad\xdb\xce\xb1\x7c\xbf\x9d\xa7\x91\xa2\x82\xc5\xc8\x49\x54\xb9\xde\xdf\xce\x4e\x8e\xfb\x50\x50\xef\xc9\xd3\x31\x48\x78\x20\x32\x9b\x47\x00\x39\xb8\x45\x61\x28\xff\x9f\x5d\x2c\xa6\x89\xde\xd1\x47\xff\xe0\xf8\x7c\x06\xa2\x30\x5e\x63\xd2\xce\x23\x3f\x50\x9f\x1d\xcd\xf6\x82\x90\x6b\x2e\xbc\xf6\xdb\x24\x05\x78\x2d\x2c\x17\xd7\xb4\xd6\xa8\xdd\x86\x4b\x6b\xc0\xbd\x87\x14\x41\x72\xb2\xa0\x10\x0c\x2f\x63\x81\x4c\x4c\xb4\x5f\xf0\x15\x34\x4c\xe5\xd8\x03\xad\x62\x77\xa1\xdc\xae\x4d\x12\xa3\x08\xa1\x02\xe6\xb3\xea\xea\x29\x70\x2f\x51\xf7\x7b\x63\xbd\x43\xb8\x44\xe1\xc3\x46\xb1\x6b\x8e\x88\x6c\xc7\x23\xe8\x37\x6f\xdc\x6a\x11\x17\xc3\xbb\xd3\xee\xca\xe4\x1d\xbb\x19\x63\xc0\xc5\x91\x75\x73\xdf\x22\xe0\x43\xa2\x93\x02\x13\x9b\xee\xad\x22\xbe\x64\x5f\x25\xcf\x8a\xd6\x5f\xcb\xd5\xd3\xbb\xbb\x8a\xe5\x55\x30\xc3\x9b\x2c\xb4\x2f\x9a\x43\x96\x26\x59\xe6\x07\x38\x6c\x6e\x59\x65\x2f\x4e\xbe\x7f\xcc\x39\x6b\x92\x93\xd7\xdf\xdf\x93\x49\xee\x52\xde\x8d\xc2\x74\xa1\x5e\x3c\xd1\x1a\xb8\x73\xa8\x9d\x4e\x16\xad\x96\x73\x3b\x35\xbf\x58\xe2\x9d\x76\x47\x0f\x48\xd7\x1e\x3d\x3a\x49\x23\xe7\xe9\x7c\xbf\xae\xaa\x3d\x32\x8f\x90\x8f\x57\xd8\xd7\x73\xae\x52\xbe\x31\xe1\x02\xc1\xc0\x22\xad\x82\xb7\x12\xd9\xeb\xad\x11\x41\x4c\x6d\xbe\x92\x16\xed\x0e\xc4\x87\xe8\xb0\x92\x1a\x6f\x49\xd8\x6b\x73\xa5\xb1\xdb\x01\xbc\x02\x94\x84\xbb\x64\xa5\x17\xdc\x09\x1a\x15\xbe\xa1\x71\x18\x80\x25\x4a\xf6\xa3\x72\xfa\x68\x2c\xf4\xdf\x98\xac\x27\x56\xf7\x9a\x90\x99\x3e\x7c\xf4\x99\x51\x73\x7b\x3a\x04\x14\x71\xc3\x78\xaa\x2a\x15\xbb\xd0\x30\x9c\xf0\x1f\x54\xca\xa8\xdc\xf0\x4b\x84\x92\xdd\x58\x2f\x29\xd0\x0a\x58\x03\x1b\x75\xb0\xbc\xc7\x8e\xc6\xa8\xeb\xe8\xb6\x2e\x77\xb0\x36\x09\xb0\x2a\xb1\x30\xaf\x38\xf7\x28\x85\x32\x9f\xba\x44\xa5\x4b\x60\x14\x39\x70\xc8\x2d\xa4\xce\xec\x2c\xcc\x76\x9a\xbd\x0b\x49\xd0\x2b\x49\xb1\x3d\xfc\x46\x76\xf0\xa2\xb8\xd0\x2b\xad\x61\xd6\xd2\x6f\xda\x8a\xc9\x2c\xf0\x01\x27\x44\xb3\x46\xd6\x8a\xab\x5a\x89\x0d\xeb\xac\xec\x85\xe7\x22\x78\x71\x53\x5f\x53\xdb\x22\xcb\xb0\x68\xdd\x2e\xf2\xff\x61\xb8\x04\xf2\x1e\x44\xb6\xc4\x82\x49\xc3\x27\xe1\x51\xbc\x26\x94\x69\x6f\xee\x47\xed\xce\x6d\x99\x2e\x57\x0f\x53\x67\x7a\x69\xc0\x49\x8a\xd7\x3d\xb8\x04\xea\x46\x6d\xd8\xa3\xe8\x38\x6a\x32\xb8\x42\x53\xb7\xe9\xa3\x19\xa3\x3b\x7e\xca\xd9\xf8\xeb\x02\x68\x40\x60\x43\xb9\x31\x0c\x30\xef\x84\x74\x13\x78\x0f\xdf\x02\x50\x07\xcd\x72\xf7\x03\xd7\x66\x34\xda\xe7\xe8\x38\x80\x68\x45\x9d\xce\x70\x07\x2b\xa5\x50\x37\x6a\x9b\x60\xc6\x30\x24\x22\xcd\x93\x3d\x3c\x38\xfc\x87\xcd\x68\x3d\x3c\x38\xfc\x2e\xf3\xfb\xfb\xf4\xf7\xf3\x67\x57\xa3\x8f\xe0\x89\x41\xf4\xa9\x7d\x7a\xd8\x3a\x05\xd6\x85\x45\x36\x67\x53\xa2\x53\x93\xd2\x29\x31\xac\x7f\xfd\x7d\xed\xeb\xe7\xcf\x72\xaf\xb3\x23\x2a\x7c\x78\x58\x48\x1e\xad\x9a\x30\x09\xb3\x49\xfc\xb7\x1c\x58\x31\x63\x5c\x8e\xc6\xf1\xec\xfb\xf2\xb3\x42\x1f\xfa\xd9\x61\x45\x18\x79\x2b\x5d\x5c\xa1\x8c\x1c\xac\x57\x5c\xce\xf7\xe9\x8b\x4c\xaa\x02\xe8\x6d\x62\x98\x89\xe6\x6c\x1f\x14\xd4\x08\x98\x4b\x9d\x9f\x4f\x2f\x9b\xd8\x4a\x6b\x28\xd0\x2d\xec\xe3\xbe\xa8\x58\x9b\x3f\xe1\xf5\x26\xdc\x4d\x75\x84\x61\x88\xe4\x12\xb4\x46\x1f\xe2\x00\x82\x8d\x7a\x0f\xa0\xfd\x00\x9c\x4f\x2f\x81\xc1\x46\x2d\xd1\x05\x26\x6b\x47\x3b\xae\x1e\x67\xbf\x2e\x2c\xed\x13\xcc\x6d\x87\x81\xfe\xc9\xe5\xd7\xc3\x2e\xf5\xc2\xe8\xf2\x0b\xb3\xc5\x38\xb3\x30\xf5\x80\x6b\x40\xd5\x0f\x3d\x0b\xca\xd0\x20\x0f\xab\x86\x1a\x19\x99\xa0\xb1\x68\x22\x15\x0a\x34\x28\x2e\x72\x07\x20\x00\xec\xec\x0c\xb1\xfa\x2d\xeb\x0e\xb2\x68\x25\x51\xfd\x7c\x54\xef\x3e\x1e\xc9\x34\x71\x2d\x40\x5d\x43\xb0\x4d\x98\x65\xb3\xed\x72\xb1\x2a\xa5\x53\xe5\xea\xd0\xc7\xbe\x00\x5b\x4d\x87\x1d\x44\x19\x8b\x01\xb7\x4a\x49\x74\x3b\x09\x80\x86\x6e\x2a\x3b\xb6\x3d\xbb\xa9\x01\xe4\x9a\xcc\x5f\xe6\xc7\x8d\xce\x61\x62\x41\xa7\x61\x48\x7d\x28\xd0\x6c\x7e\xf3\x6d\x1f\xbf\xdf\x34\x07\xeb\x97\x6f\x01\xd3\xc9\xf8\x7a\x83\x3d\xbf\xf9\x16\x1c\xcf\x4e\x2e\xc0\x32\xa4\xfe\xb5\x76\xd2\x4e\xbe\xf9\x16\xc8\x19\xc2\x77\x89\x4b\x47\xe2\xdd\xca\x27\x34\x54\xa7\x4e\xae\xfc\xfc\x45\x26\xfd\xea\xa0\xe7\x9a\xde\x4b\xa1\xd2\xb5\xfe\x59\x84\x4c\xba\x96\xca\xe4\x48\xd3\x2e\xe6\xb3\x24\xf6\xf0\x26\xf2\x3d\xa2\x53\x07\x54\xfd\x93\x24\xc3\x46\x7f\xee\x09\xea\x89\x0d\xca\xc6\x93\xc3\x08\x7b\x3a\xfc\xd7\x4b\xf2\x33\x06\x48\xf3\x1a\x06\x11\x9b\xda\x55\x1a\x70\x75\xe4\x11\xba\x13\x0c\x4a\xde\xf9\x72\x27\x71\x2a\x82\x2b\x91\x3c\x9a\x91\xed\x31\x87\x9c\xf6\x31\x40\x07\xeb\x03\x00\xf5\x1b\xf9\xb5\x15\x12\x46\x32\x00\x09\x80\xec\x00\x0c\xbc\x0d\x2d\x0b\x9e\x26\x93\x72\x5f\x38\x38\x69\xde\xa2\xc2\x6a\xf6\xb8\x4c\x25\x93\x2c\x36\x90\xe9\x8c\x92\x05\xf2\x63\x86\xc5\x4e\x65\x96\x5c\xc4\x8e\x04\xf8\xb6\x52\x4d\x5a\xad\x3e\x0c\xa5\x55\x14\x04\x80\x1b\xf8\x40\xa5\x45\x00\x16\x87\xe6\xf4\x92\x04\x60\xc5\xe8\x56\x89\x14\x63\xa0\x24\xd6\x6f\xa1\x91\xfc\x56\x79\xb0\x15\xd6\x3a\x55\x2a\xff\x89\x89\xc0\x36\xb9\x57\x31\xc9\xa6\x26\xea\xa8\x4f\xba\xdd\xc6\x04\xfb\xb9\x23\xaf\x5c\x60\x98\xea\x25\xd7\xce\x00\xd5\x45\x08\x81\xaf\x76\x12\x60\x89\xac\xa5\x15\x80\xdb\x0d\x22\x20\x96\x76\x9b\xd9\x3b\x27\xbb\xe9\x3c\x76\xbc\x9d\x75\xfa\x48\xc4\x26\x44\x6c\x10\xba\x47\x60\xc3\x12\x0a\x99\x4d\x55\x8d\xbd\xa5\x53\x4d\xbe\xac\x94\xd3\xf9\x82\xa9\x96\xd6\x6c\x20\x67\x2c\x23\xaa\x8d\xc5\x73\xfd\x1d\x97\x52\x3b\x49\x30\x69\xc5\x84\xbd\x3a\x72\x12\x91\x67\x25\x4d\x8f\x1d\xe9\x13\x78\x0d\xf5\xb1\xad\xe6\xbc\xb9\x64\xbc\x9c\x18\x7b\xaa\x44\x6b\xca\xad\x92\xf3\x96\x48\xdc\x22\x44\x1c\xec\xaa\xd8\xb4\x15\x6d\xee\x07\x03\x37\xd1\xdc\x82\xba\x07\xf9\xb4\xd6\x41\x9e\xae\x9c\x1a\xe4\xe4\xc1\xe2\x75\x6b\x75\x57\x03\xca\x3d\xa0\xd2\xbe\x09\xec\x5d\x97\x0b\x97\x2a\x2e\xe0\x72\x8d\x76\xda\x8b\x39\xfd\xcd\xd0\x9e\xdc\x20\x82\x11\xf1\x91\x09\x47\x57\xae\x60\x93\x1a\xfd\xe1\xc9\xc4\x26\x49\x4f\x18\x52\xd2\xc7\xc3\x70\xeb\x41\x12\x78\x37\x91\x3f\x79\x9a\x0d\x90\x7d\x6f\xa4\xd3\x1d\xd6\x3e\xe5\x5f\xe6\xc7\xbc\xd2\xf6\x8b\x39\xf2\xec\x97\x12\x94\xa7\x2a\xd8\x7b\x7e\xcc\x05\xdd\x7a\xb9\x83\xb1\xa7\xed\xd4\xc2\xde\x11\x66\xcc\xc1\xda\xc1\x5d\x8d\x8e\xb2\xb4\xd0\x59\xff\xe9\x70\xf7\x5a\x95\x2d\x86\x78\x35\x3a\x72\x10\x4f\xf6\xd8\xb9\xea\x57\xbe\x00\xbc\xda\x73\x54\x0a\x19\x07\xdf\xb9\x8d\xd6\x06\x2b\xae\x9d\x0d\x35\xae\xd9\x35\x16\x34\x54\xdd\x7e\xa6\x56\x07\x0d\xb8\xf1\x5e\x87\x74\x09\x43\x7b\xe9\x82\x2a\x7e\x13\x86\xc0\xdf\xe0\x30\xe8\xb8\x03\x6f\x02\x31\xb7\x15\x2f\x94\x4e\x1a\xb8\x0c\xff\x30\xa7\x69\x36\x81\x2b\xd2\x48\xb6\x5b\xbf\x55\x30\xdc\x16\xc7\xa0\x69\x9b\xb3\xe9\x99\x8a\xd2\xf9\x1b\x07\xd3\x8b\x73\xa9\xb9\x4d\x24\x2b\x8b\x89\x4e\x6a\xa4\x44\x50\x8b\x5a\xbb\x61\xb5\x85\x5d\x61\x1b\x84\xc8\x17\xb4\x67\x6d\x9d\x3c\x0b\x2d\x0c\xcc\x21\xcc\x2e\xad\xe1\x74\xa8\xa2\x35\xbe\x35\xce\x40\x8a\xc5\x90\x42\x75\xbc\x66\x0b\x83\xf6\x20\x67\xbf\x9e\xdc\xc4\x75\xc6\x50\xb5\x60\x9f\x4b\x69\xe6\xc7\x8c\x21\x22\x0a\xd1\x07\xbd\x16\x44\x0b\xb0\x6d\x4c\x89\xcf\x6c\x8b\x5b\x5c\x4d\x00\x9c\x61\xfe\x80\x02\xa3\x32\x81\xaa\x34\xa0\x82\x9d\xed\xd5\x36\x6a\x3a\xe5\xd6\xc7\x4c\xa8\xba\x24\x87\x50\x82\x6c\x7e\x4e\x30\x56\xd2\xd2\x3a\x05\xac\xe7\xcd\xee\xec\x54\x19\x2d\x53\x3a\xab\x1d\xc9\x1f\x08\xca\xce\xe9\x7c\x50\x07\xf1\xef\x32\x07\xe6\x69\x68\x81\x39\x34\x6f\x45\xf2\x16\x90\xaa\x0e\xdb\x5b\xd9\x47\xc5\x53\x53\x97\x26\x71\x4a\xde\x7a\x63\xa9\x78\xae\xca\x73\x41\x95\xfd\x6c\x10\x2d\xf3\xb8\xe1\x34\x21\xed\x44\x0e\x6c\xc8\x42\x22\xe9\x12\xf1\xe7\x16\xae\xcd\x04\x6b\xc7\x4e\x6a\x2c\x95\x44\xcd\x34\xb2\x58\x74\xf6\x4c\x63\xb3\xe5\xcb\xa7\x2e\xe5\x68\x98\x29\x66\xa0\x30\x03\x09\xf7\x64\xf4\x7e\x41\x5b\xb5\x13\x50\x03\xf4\xd0\x30\xb6\xaa\x49\xda\x54\x43\x5a\x24\xe0\xb4\x33\x4e\x0b\xd9\x01\x29\xd1\x18\x7e\x0f\x91\x51\x95\xd6\x35\xe8\x02\xef\x61\x3b\x35\x5d\xde\x5d\x8d\xa6\x64\x71\x87\xf1\x5d\xa3\xf2\x2a\xa1\x43\x5d\x55\x98\xa5\x61\x7c\xf7\x2a\xcc\xcb\x4f\x47\x98\x22\x01\x99\xa8\x42\x18\x49\xd5\xab\xd9\x50\xa1\x9e\xfc\x8a\x20\xe7\xea\x8c\x40\x61\x20\x9f\xa8\x0a\x9b\x4b\x4a\x05\x17\x0c\x46\xaa\xf0\x97\xf1\xa4\x72\x84\x92\x02\xa9\xab\x30\xbe\xf3\x83\x03\x4c\x55\x8a\xfa\x44\x69\xe8\x6c\x8a\x1b\x25\x4a\x81\xaf\xca\x88\xee\x8b\x85\x7c\x48\x88\x3b\x97\xfb\x1a\x8b\xa4\xdc\x66\x3f\x2b\x98\xa1\x88\x72\x2c\x28\xdb\x25\x11\x86\x26\xf8\xf6\x00\x1c\xeb\xbb\xf9\x10\x16\x1b\xc4\xc0\x6b\x75\xc4\x09\xa8\xfa\x15\xc2\x65\x7b\xd3\xb8\x4f\x5f\x1d\x05\x41\x96\x50\xe3\x22\xaf\x0f\x22\x09\x4c\xb9\x49\xa8\xeb\xc0\x66\x2a\xb9\xea\x03\x82\x5c\xa9\x73\xa8\x0a\xbe\x66\xc8\xa0\xb4\xf5\x4a\x0f\xf3\x6d\xc4\xc1\x25\xa5\xe1\x35\x16\xe0\x89\xa9\x31\xfb\xb4\xb9\xb8\xb8\x6f\x3c\x4a\x32\xe5\x55\x41\x5e\x34\xb8\x63\xd4\xad\xc0\x5b\xdf\x27\x0a\x0b\x8b\x52\x79\x6d\x21\x57\x6e\xb9\x74\xe1\x56\x2c\xca\xc6\x04\x1d\xa8\x97\x9a\x7b\x3b\x5f\xe3\x46\xc9\xb2\x09\xd0\xb2\x27\xa9\x46\x46\xdb\x8f\xeb\x04\x80\x76\x6c\x59\x06\x11\x54\xa5\x91\x49\x0e\x82\xe0\x65\xa1\x53\x29\x94\x72\xe5\x65\x6c\xe9\xea\xd3\x93\x76\x82\x60\xa8\x3e\x9d\x72\x51\x12\x10\xe6\x4d\xd7\x1a\x12\xbd\xb5\x5f\xb7\xa2\x51\x12\xe2\xa6\x70\xfb\x09\x85\x5b\x60\x01\x01\xac\x0e\x43\xfe\x15\x13\x5f\x2d\x3d\x75\xa4\x08\x93\x12\xdc\x66\xa4\xa6\x48\xd6\x60\x04\xbc\x0f\x84\x9c\xd4\x95\x02\xa3\x19\x65\x2f\xe4\x97\xad\xa8\x6a\xae\xe6\xb1\x98\x51\x02\x76\x34\x66\xf7\xc0\x6e\x6d\x3a\xea\xa8\x74\x58\x7e\xf4\x29\x57\x8e\x6b\x16\xf5\x67\x57\x46\x8a\x10\x52\x98\x19\x99\x2f\xad\x8e\xb4\x9a\x1f\x09\x40\x88\xc9\xb5\x7c\x8f\x85\x4b\x67\x1c\x80\xf7\xaf\x75\x65\x73\x55\xfd\xe7\xc3\x93\x89\x2e\x9f\xe9\xfd\x3b\xc6\xfe\x35\x17\x30\x57\xb2\x6c\x48\xed\xd5\x1b\xf1\xcc\x79\x50\x19\xe7\xab\xd1\x51\x76\x5c\x69\x84\x50\x46\x6a\xbf\x8d\x1a\x85\x49\xae\xf2\x96\x77\xcd\x7a\x51\x36\x7a\xf7\xf5\xf2\xbc\xc8\xc6\x03\x2e\x91\x32\xec\x8e\xab\x42\x51\xe3\x8b\x73\xb9\xb5\x6c\x5a\x33\xcd\x39\x15\xe8\x07\x9d\x7d\xa3\x5c\x7f\xa6\xe0\xaa\x92\xb9\x34\x0c\xb4\xd1\x0a\x44\xee\xee\x9e\xfb\xe4\xfa\xcf\x32\x90\x1c\xe3\x97\x0a\xfd\xef\xf5\x0f\x29\x7b\xae\xb1\x6b\xc8\x58\x7f\x03\xc7\xf5\x53\x1c\xf8\x57\xa3\x8f\x3f\xe8\x72\x51\xb6\x1a\x5a\x52\x37\x6a\xd0\x28\x7b\xd9\x57\x2e\x86\xbd\x59\xaf\xee\x70\x75\x09\x6c\x88\xb0\x73\xf7\x24\x50\x82\xde\xae\xaa\x4b\xfe\x56\x18\x4c\xb3\x93\xe3\xea\xeb\x1e\xfe\x2c\x75\x52\x95\x6e\x5b\xa2\x47\x9e\xfd\x93\xf0\x06\x64\x4f\xf4\x93\x40\x2a\xf5\x59\x5a\x6f\xaf\xf6\x8e\x94\x65\x48\x97\x93\x2d\xc4\x24\x0d\x1e\x78\xfe\x0f\x4f\x92\xd5\xb3\xfd\x1e\xec\xe0\x36\x6c\xb1\xc9\x6a\x37\x82\x72\x2d\xbd\x41\xf0\x55\xd1\x0e\x15\xa4\xc9\x04\x22\x24\xcb\x36\x5f\x39\xa7\xc1\x86\xad\xf5\x86\xcc\x92\x65\x97\xd9\x18\xfd\xaf\xc5\xdb\xf3\xc9\xff\x9d\x9e\xfd\x9c\x94\xc6\xe1\x63\xc0\x63\x7f\x03\x20\x07\x2a\x50\xc1\x71\x2d\x18\x65\xee\x2b\x81\x9b\xce\xcb\xfd\x21\x50\xb3\x8d\x9b\x49\x2b\x9a\xf8\x4e\xbf\x79\xe5\xd5\xb5\x51\x3c\x65\xfe\x06\x0b\xe4\x8b\x98\xf5\x11\x7b\xc7\xf3\x77\x20\x0b\xca\x1e\x70\x9d\x1e\x3f\xd7\xf6\x3d\x91\xb2\x7d\x17\xa1\xf4\xda\xbb\x82\x84\xbc\xfb\xee\xdb\xdf\xbf\xfd\xfa\x6a\xf4\x51\xdd\xb9\xb9\x0d\xd2\xdf\x6c\xab\x7e\xb7\x92\x91\x3d\xf1\xc9\x8a\x53\x8d\x58\x3e\x29\x28\x77\x23\xa5\xc4\xb5\xe6\xb5\x44\x3f\xf7\xba\x89\xd8\xd5\x9d\x16\xd3\x80\x54\x57\xa5\x87\xb2\x83\xfd\xd7\xcb\xac\xa3\xea\xb3\xea\x46\xf7\x5c\xea\x72\x2f\xa8\x78\x1f\xe3\xeb\xf9\x3b\x7e\x00\x66\x42\x15\xf2\x5a\xaa\x33\x20\xa9\xf1\x9f\x65\x7c\xc5\x84\x12\xef\xf5\xfc\x5d\x9e\xf0\x2d\x83\x77\xef\xa1\x7b\x27\x99\xb6\x68\x4b\x7b\xd5\x25\xca\x23\xaa\xc1\x81\xcb\x0d\x02\x31\xc1\xc2\x06\x13\x2b\x03\xf7\x35\x7e\xd9\x83\x04\xfb\x20\x3b\x47\x77\x73\x3c\x7f\x77\x2f\x5c\xa0\x01\x0f\x31\xa1\x1a\x52\x47\x2b\xa3\x88\x86\x9d\xce\xe2\x3a\x18\x57\xcb\xc0\x41\xf6\x06\x5a\x13\xe4\x84\x8d\x3d\x70\xb3\x56\x75\x4b\xad\x52\x0f\x2b\xa7\x09\xaa\xee\x82\x6a\xa0\x10\x8c\x23\x7c\x36\xbf\xf9\xfa\x78\x76\x72\xd1\x47\x21\xcc\x4e\x2e\x00\x83\x64\x9d\x1c\xae\x21\x86\xc0\x47\x5b\xa6\x64\xfe\x51\x49\x5a\x00\x39\xc7\x6b\x82\x82\x76\xc2\xdd\x09\x5b\x0b\xdd\xa4\x03\x23\x6c\x0b\xdd\x74\xe4\xab\x22\x5d\x06\x61\x92\xf4\x1e\x74\xb3\x6f\x4a\x83\x41\x5b\x33\x49\x13\x58\x39\x26\xf9\x19\xc6\xc4\xdf\x5c\xa2\x6d\x14\xe6\x73\x28\x2b\x36\x51\x38\x68\xbe\x85\xda\x9b\x41\x53\xc7\x38\x1a\x31\x20\x0c\x66\x60\x76\xd2\x8a\x37\x1c\xcd\xdd\x92\xb0\x77\x75\x85\x62\x4f\x06\x22\x38\xc9\x08\xe2\x6c\xfe\x48\x58\xf1\xfd\xe5\xdb\x93\xb7\xf6\x36\x4d\xf0\x57\xd3\x7a\x0c\xfe\xfa\xb3\xaa\x6c\xdd\x6b\xf0\xf7\x84\x52\xc7\x45\x94\x8f\x30\xbe\xa9\xba\xfd\xb6\x6e\x29\xe5\x58\xb8\x74\xf1\xdc\xc0\xb1\xad\x70\x8b\x7b\xd7\xe3\xdb\x81\xf7\x3a\x7e\x1b\x4c\xcf\x66\x99\x6b\xef\x75\x4c\x37\xdc\xe2\xf4\x62\x85\x31\xf8\x08\x63\x41\x3d\xce\xb7\x1f\xcd\xef\x8f\x63\xb9\x15\xf8\xc8\x05\x14\xd8\x6f\x67\x00\xdb\xee\xcb\x17\xbc\x96\xbb\xbe\x1a\x1d\x65\x90\x94\x9b\x37\x9b\x17\x6f\x11\x2a\xd4\xd6\x90\x8f\x93\x47\x94\x99\xa7\x1a\x4d\x6b\xe4\x3a\x57\x1d\xdc\xe2\x57\x70\x8b\xab\x4b\xfb\x75\xf7\xb0\xe8\x0a\xdb\x3f\x63\x12\xdf\x3d\x2f\x57\x2e\x79\xb7\x8c\x89\x88\x9f\x3f\x7b\xf6\xb5\xad\x70\xa2\x9f\x1c\x7e\x97\x3e\x79\x49\x85\x08\x11\xa3\xfe\x35\x12\xf6\xd9\xaf\x98\x04\xf4\x96\x2f\x54\x2a\xe7\xf3\x67\x87\xdf\x1f\x53\xa6\x2a\x55\xab\x2b\xa5\x2b\xbf\x7a\x15\x87\xe1\xbe\xaf\x9e\x7d\x5d\x84\x35\x6c\xb1\x85\x2c\x41\x1a\x95\x40\x49\x69\x54\x53\x50\x25\x25\x5b\xcd\x47\x59\x4a\xd6\x7c\x56\x4f\xdc\x36\x0d\x73\xf4\x6e\xde\xb0\x30\x05\x0d\xeb\xbf\x64\x09\xdb\x64\x2f\x57\xf9\x3d\x00\x19\xbe\x74\xbf\x91\x84\x2e\xbe\xc9\x52\xb7\xf8\xae\x9e\xa4\x7b\xbf\xce\xd1\x71\xcf\xd7\x05\xe2\xed\xdf\x81\x42\xbe\x5e\xc4\x3c\x42\x24\x98\x33\xea\x23\xce\xef\xf9\xee\xee\x5a\xe9\x8c\x10\x78\xcf\x50\x88\x6e\x20\x11\x2a\x76\x34\xa0\x3e\xaf\xbf\x42\x63\xfa\xeb\x42\x55\x34\x7d\x65\x43\x64\x1c\x97\x4f\xdc\x72\x2f\xa9\x0a\xef\xc5\x51\x00\x05\xd2\xa5\x99\xd5\xe5\x13\x5f\xf9\x2b\x92\xbe\xe7\xb9\x0f\x3c\x46\xc3\x10\x93\xb5\x7e\xe6\x71\x4d\xa9\xc8\x52\xaa\x4f\x16\xfb\x83\x1d\xd4\xd5\xe8\xa8\x34\x07\xd5\xc9\xf0\x9f\xf7\xe6\xf7\x5a\xd3\x0f\x6f\xb1\xd0\xf7\x8e\xea\x98\x38\x5b\x0a\x77\xfa\x5b\xaa\xe3\xa5\x92\xe4\x3e\x0c\x55\x6e\xd7\x1f\x94\x20\x0f\xde\x42\x86\x3c\xad\x53\xf5\x8b\x76\xb3\xaa\xbb\x2d\x69\xf4\x26\x1d\x99\x9b\x48\x4b\xd8\x56\x53\x7b\x99\x95\x32\x8d\x8e\x0f\x13\x43\xac\x52\x40\x55\x7b\x13\x92\xc8\xe1\x15\x65\x20\xdb\xbe\x43\x1a\x69\x73\xa8\xce\x81\x07\x88\x4b\xcb\xf1\x18\x46\xd0\xc7\xa2\xd2\x52\xb1\xde\x12\x37\x0c\x9d\x85\x3d\x3b\x3b\x59\xdc\x1c\xf6\x49\xfc\x37\x76\x2c\x4f\x2b\x8a\x18\x13\x3e\xa9\x8f\x68\x8b\x54\x9a\x30\x5e\xd5\xe5\x73\x20\xe8\x35\x22\xed\xc8\x36\x64\x57\xa9\xb6\x4c\xcd\xf6\x0a\x1a\xcd\x69\x20\x01\xf5\x21\x92\x49\xa4\x56\xd7\x72\x9c\x9d\x2c\xd2\x01\x28\xef\x00\x31\x65\x0b\xb3\x5b\xe2\x88\x06\xed\x88\x33\x44\x17\x4d\x88\x82\x96\xfc\x6d\x24\xf0\x16\xff\x81\x2a\x37\xd1\x6d\x6e\xc6\x79\x7f\xfa\x72\xa1\x1c\x00\x5b\x73\x2d\xde\x5e\x15\x77\x7a\xfc\xbc\xac\x02\xd0\x92\x7b\xd4\xe2\xd5\xe1\x6e\x28\x8b\x4e\x63\x9d\xd4\x10\x8b\xab\xd1\x51\x71\x80\x35\xc5\x54\x56\xf0\x54\x5f\xe2\xdb\x87\xb2\xba\x8a\x82\xf1\xc1\xc2\x3b\xbc\x8d\xb7\x3a\x7f\x1f\x05\x19\x2f\xe6\xe9\xab\xa9\x67\x6f\x0c\xb6\xd9\x3f\x3e\x64\x2a\x6b\xcf\x14\x7e\x50\xb7\x28\x61\x6e\x6a\x44\xb4\x22\xe7\x7d\xe1\xe0\x26\x9b\x02\x71\x82\x04\xc4\x21\x0a\xce\x28\xc1\x82\x2a\x45\xda\x83\x88\x7a\x1e\x94\x53\x33\x30\x80\xc1\x36\x85\xdc\x86\x16\x7b\x40\x39\x87\x84\xe1\xb6\xa5\x4a\x9b\x4d\xcf\x2a\x40\x19\x9f\x6c\x83\xea\xfd\xb5\xed\xe7\xaa\x18\x54\x1f\x08\x8e\x83\xbf\x9a\x91\x95\x8e\x0b\x9b\xe9\x69\x1b\x12\x22\x15\xaa\xd3\x25\xdd\x51\x53\xef\x87\x5b\x3b\xf6\xcb\xfd\x41\x1b\x7b\xdb\x7f\x39\x73\x32\x25\x03\x04\xf6\x86\x92\xfc\x61\x55\x47\xaa\x56\x82\x73\x12\xe3\xcb\x27\x45\x35\xb8\x72\xaa\xc2\x6b\x0d\xaa\x39\xbd\xe0\xe9\x6e\x38\x11\x24\x2d\xad\x50\xf4\x92\x1a\xf3\xc7\xa6\x62\x26\x37\xfc\x77\x9d\xa4\x2e\x5d\x39\xa9\xb3\x85\x77\x73\x1a\xf0\x39\x62\x52\x6e\x75\x32\x5c\xb7\xf0\x6e\x81\xff\xe8\xd8\x16\x93\xce\x6d\xbb\x5e\xd4\x45\x6f\x10\x63\x38\x40\x49\xd0\xf6\x31\xdd\x6e\x21\xe9\x73\x00\xf1\xd6\x80\x4c\x4a\x98\xff\x8d\xa7\x11\xf5\x91\x4a\x17\x51\x9f\xb7\x9a\xee\x04\xa8\xa3\x86\x79\x15\x7c\xe7\x80\x93\x14\xe2\x86\xf1\xf7\xc9\xe7\xcd\x4f\x75\xd3\x2c\x65\x5d\xe1\x0a\x13\x93\x1a\xa7\x6d\x86\xf4\x46\x12\x1e\xc1\xdb\xb6\x67\x77\x3d\xbb\x72\xd3\x84\x95\xe6\xff\xcb\x09\x73\x7d\x93\x31\x92\x58\xaf\x28\x43\x85\xa9\xb5\x72\x38\xd9\x5c\x75\x09\x95\xed\xd8\x45\x05\xed\x54\xa1\xbc\xf3\x64\xe3\x32\x80\x59\xf7\xde\x56\xdf\x4b\xb7\x43\xb5\x75\x7d\xcc\xe7\x9e\x49\x8f\xf6\x56\x94\x79\x8a\x83\x61\xe8\x25\x22\x4f\x97\x7e\xea\x26\x6c\x0d\x5e\x8d\x2a\xf0\x34\x42\xe6\x6a\x74\x54\x1e\xa3\x2a\xf8\x53\x83\x64\x46\xbf\xa9\x0d\x60\x55\x7a\x43\x88\x20\x47\xbf\xf4\x3e\x9f\x54\x49\xf1\x67\xb3\xe4\x50\xcf\x46\x40\xbd\x49\xf6\x4b\x28\x50\x1f\x68\x25\xd3\x8a\xa0\x6d\x61\x3b\x47\x9a\xab\x29\xd4\x30\xe7\x33\x31\xc8\x17\xaf\xab\x2a\x7b\x45\xb4\x24\x1b\xbb\xec\xef\x20\x90\x90\x3a\x32\x5c\x33\x20\xcd\x18\x82\xf3\x4d\x5b\xda\x2c\x7e\xaa\x1f\x62\x5a\x1e\x9b\xf3\x8d\xad\x3b\xa7\x8d\x0c\xcc\xbb\x0e\xb9\x29\x50\xf7\x20\xbf\x70\xcd\x11\xed\x5a\x2d\xbb\x48\xbb\x54\x2b\xdd\x07\xcb\x49\x80\x07\x55\xa5\x63\x1a\x45\x21\x36\xe5\x35\xe4\x4a\x4f\x1d\xcc\xe0\x75\x5a\xf4\x92\x96\x22\x2a\x39\x78\x92\x94\xb7\x7c\x3a\x06\x05\x30\x52\x3a\x9c\x5b\x36\x48\x6a\x75\xd4\xc0\xb2\x90\x5a\x51\xff\x41\xe3\xde\x60\x8b\x23\xa0\xab\xe2\x72\xab\x7a\x4d\x89\x20\xb8\x84\xb9\xaa\x91\xdd\x97\x87\x46\x4a\x65\x72\x44\x51\xb8\xb3\x63\xee\x26\x29\xf6\x02\x73\xd2\x45\x1f\x21\x95\x42\xd9\x9a\x90\xe1\x5d\xb6\x69\x43\xc1\xb8\xa1\xb7\x4a\x79\xa9\xa6\x20\x01\xd5\x32\x6a\xb5\x11\x40\xe7\x70\x6f\x68\x18\x6f\xd1\x29\xf1\xd9\x2e\x12\xfb\x3d\x96\x35\x30\x66\x6f\xe7\x95\xde\xf5\xda\x3d\x99\x6e\xfe\x66\xcb\xdf\xa0\xdd\xec\xa4\xcb\xee\x4c\x43\xe8\xea\x1a\xd3\xad\x9b\x6c\x29\xeb\xe6\x74\x8d\xd7\x70\xb9\x13\x2d\x7d\x28\x15\xad\xd2\xf5\xfb\xdd\xb3\x1a\x9c\x2f\x37\x8c\xc6\xeb\x4d\x14\x57\x5a\x22\x0d\x08\xdf\xc0\xa7\xd5\x21\x4c\x66\x1d\xa9\xe8\x18\xcc\xc1\x6b\x73\x35\xca\x3c\x66\x11\xe5\x08\x2c\x16\x27\x63\xfd\xc5\x8b\xea\x2f\xcc\xf6\xcc\x04\x5b\x6b\x5b\xcf\x66\xed\x6f\xf0\x7a\x03\x44\x32\xf4\x42\x04\x0e\xa6\x87\x06\xac\xca\xd9\x91\x66\x23\x0a\x80\x64\xce\xa4\x67\xee\xdb\x4f\x8e\x69\x18\x80\x9f\x4e\xcc\x63\x61\x1f\xa7\x74\x05\xc9\x29\x89\xfc\x6c\xd8\xc0\x99\x75\x54\x88\x97\xa9\x22\x56\xbe\xd1\x8b\x26\x8d\x3a\xd2\x2f\xdb\x13\xa6\x87\xa5\x9e\xdc\x24\xcd\xb6\xe2\x7e\xb9\x55\x4a\xe5\xdc\x97\xa2\xfc\x65\x43\xc2\x67\xd4\xdb\x3a\x7a\xd1\x24\x36\x66\x1d\x95\x42\x62\x8a\x2d\xa5\xf6\xa3\x87\xc5\x47\xdc\x2f\x3f\x12\xf7\x72\x3d\x52\x1a\xb3\x56\xe5\x78\xae\x8d\x51\x70\x18\xb9\xd5\xee\xff\xaa\x83\x85\x9a\xe3\x69\x87\x03\xce\xe1\xcf\x73\x8b\xd5\xc2\x2e\xa3\xec\x0b\xae\x75\x14\x14\xad\xd7\xc2\x01\x4b\x9e\x84\xa3\xea\x8d\x5f\xb5\x07\x73\x4f\xf0\x50\xd5\xb9\xa9\x5b\x94\xba\xf5\x52\x8d\xca\xad\x56\x85\x6e\x1d\x5b\xa7\x06\xf6\x79\xab\x9a\xb8\x34\x2b\xe3\x0b\xaa\x0f\xd5\x9d\x8e\x43\xf7\x91\x68\xdd\x89\x52\xe6\xdd\xd2\x1d\xdb\x51\x7d\x4a\x58\x79\xda\x52\xdc\xb3\x97\x6d\xe0\x2a\xeb\xaf\xfa\x40\xa0\xda\x8f\x62\x5e\xf4\x8b\xd8\x67\x28\x62\x88\x23\xa2\x2f\x76\x39\x7d\xb3\xf0\xb2\x35\xf9\xf5\xde\x40\xc5\x4e\x2b\x15\x23\xed\x3c\x29\xd7\xe5\xb6\x22\x8a\xa4\x90\xc7\x48\x27\x08\x06\x4a\xcc\xdf\x2a\xd7\x3f\x63\x19\x02\xef\x8f\xd1\xb8\x27\x04\x54\xff\x49\x60\x35\x12\x0c\xfb\xfc\x98\x86\x72\xfe\xf3\x5e\xa8\x8a\xc8\xea\x35\x83\x24\x0e\xa1\x5c\xd5\xcd\x03\xac\xb3\x8d\xba\x5c\xb9\xa1\xd1\xbc\x57\x9f\x41\x47\x1d\x92\x1d\x99\x03\xe3\x41\x98\x51\x55\x4b\x5a\xea\xeb\xc3\xed\x0e\x57\xef\x37\xc6\xaa\xce\xd7\x7b\x3f\x77\xfd\xfa\x70\x01\x8e\xe9\x74\x7a\x90\x7b\x66\x4c\x7e\xc2\x2c\x85\xf0\x90\x46\x57\x68\xd6\x0c\x63\xd0\x30\xc6\x26\xa8\x5f\x8d\x8e\x1c\x94\x2b\x57\xe0\x78\xcc\x3b\x78\xcc\x3b\x78\xcc\x3b\x78\xcc\x3b\x78\xcc\x3b\x78\xf8\x79\x07\x75\x16\x0d\x68\xed\x5f\x2d\x43\x6b\x6d\x4d\xec\xd9\xd9\x3c\xa6\x45\x3c\xa6\x45\x3c\xa6\x45\x34\x9c\xd5\xc7\xb4\x88\x46\x64\xea\x99\x16\xe1\x87\x90\x73\xec\xff\x4c\x61\xf0\x12\x86\x72\x1b\xcf\xce\xe1\xf6\x0b\x72\xdb\xd4\x5c\x00\x89\x80\xaa\x43\xbd\x34\x48\x71\x53\x5e\x32\x56\x85\xa9\xf5\x7e\xa2\xfd\x19\x55\x6b\xe0\x15\x34\x53\x91\x37\x27\xe7\x95\x07\x30\x0d\xec\xce\xf7\xc7\xda\x46\x86\x41\xc0\x10\xaf\xbe\x21\xcb\xde\x13\xa5\xfb\xf4\x02\xc2\x3d\xd3\xe4\x69\x5a\x59\xf7\xe4\x7c\x01\x42\x4a\xaf\xf3\x7e\xb7\xfd\xf4\xd8\x1b\x3a\x53\xdd\xfb\xd5\xe8\x28\x3f\x02\x15\x27\xe3\xc4\xc8\x4d\x44\xab\xe9\x2f\x62\x22\x70\xaf\xeb\x86\xb2\x77\x15\x30\x0d\x0d\x3c\x39\xbe\x98\x3d\xcd\x06\x5a\x26\xfd\x71\x5b\xf9\x95\xe4\x7d\x91\xed\xee\x44\x68\xdb\x8f\x9b\x06\x51\x7c\xcc\x50\x80\xcb\x07\xc3\x2d\x46\x9f\x39\x8c\x7c\x7f\xf9\x02\xbc\x23\xa1\x14\x9c\x28\xe8\x96\x12\xb2\x8c\x19\x17\x70\x19\x22\x2f\x42\x4c\xed\x95\x89\x8f\xbc\xe4\x04\xdc\x8b\x2d\x78\x6f\x4b\x03\xa4\x9d\x02\x63\x70\xa3\x36\x0f\x94\x84\x3b\x45\x83\x4b\x4f\xe2\x9f\x9e\x9b\x77\x3d\x5c\xed\x97\x57\xd2\x61\x28\x57\xa3\xa3\x2c\x09\xf5\xde\x75\xdf\xe0\x9c\x53\xfb\x98\x6e\xf6\x98\x6e\xf6\x98\x6e\xf6\x98\x6e\x56\x41\xd9\xc7\x74\xb3\xc7\x74\xb3\xaa\x53\xe1\xc7\x74\xb3\xff\xd0\x74\x33\x7e\x82\xb9\x76\x0c\x38\x5c\x51\xfb\x58\xc3\x09\xc3\xd9\xdd\x75\xbc\x44\x21\x12\xa7\xea\x3e\xd6\x16\x81\x73\x85\x5a\xad\x0d\x36\x27\xf8\x0f\x04\x3e\x9a\xee\x3e\x26\xf5\x71\x73\x9e\x7f\xfc\x07\x26\x6b\x4f\x6c\x90\x67\xbe\x9b\xb4\x93\xe9\x15\x07\x0a\x65\xb0\xc9\x7e\x43\x22\xa5\x9d\xb0\xe6\x95\xf5\x43\xa7\x45\x6a\xff\x63\x13\xe1\x1e\x53\xbd\x1e\x53\xbd\x1e\x53\xbd\x1e\x53\xbd\x1e\x53\xbd\xfe\x83\x53\xbd\xee\x29\x01\xea\x31\x5f\xe8\x31\x5f\xe8\x31\x5f\xa8\x29\xf5\x1f\x34\xee\x9d\xf3\x85\xdc\x2b\x5e\x7f\xfb\xab\x54\x1f\x7b\xb2\x26\x1e\x40\xc2\x8f\x80\x6c\x8d\x84\x9a\x83\xe9\xc5\xf9\x43\x38\x67\xd2\x18\x19\xfb\x65\xd8\x53\xa6\x46\xa0\x9d\x64\x7a\xcc\x8b\xaa\x33\x61\x6a\x60\x3c\xe6\x45\x3d\xe6\x45\x3d\xe6\x45\x3d\xe6\x45\x3d\xe6\x45\x3d\xe6\x45\x81\xc7\xbc\x28\xf0\x98\x17\x95\x21\xdb\x17\xc9\x8b\xca\xbb\xf4\xf3\x93\x5c\x8e\x39\xcd\xbc\xcf\x84\x87\x64\x9f\x56\x45\x6c\xd5\x18\xd9\xe5\x8d\x45\x95\xa9\x99\xeb\x28\x09\x73\xaa\x3f\x7d\xc8\xb6\x29\x46\xf5\x98\x57\x43\xdc\xbb\x93\xbf\xc5\x32\x8d\xc1\x04\x62\x03\x85\xba\x0f\x26\xd9\x63\xab\xbb\x29\xcb\xbb\x9a\x66\x77\xf2\x74\xef\x47\x75\x53\x4a\x24\x79\xe9\x8e\x2d\xac\x4c\x14\xd1\xbc\x35\x0d\xb6\x98\xa4\xe1\xd0\x5d\x0c\x62\x1b\x10\x38\xf8\xf1\x50\x72\x2d\x0d\x24\x3b\xf0\x3e\xbb\x46\x92\x20\x44\xe7\x35\x8a\xd9\x2f\x3d\xca\x73\x7f\x4f\xbe\xca\x74\xe2\xd1\x95\x67\x21\xb5\xdb\xf7\xe7\x50\xab\xbd\x23\xb1\x13\x32\x57\xa3\x23\xe7\x70\x0b\xa7\x4e\xad\x34\xb0\x73\xbe\x5d\xd3\x38\xe0\x5a\x52\x5e\xe5\x1c\x9f\x97\x82\x46\x97\x50\x5a\x6a\xae\xad\x60\xb3\x65\xd4\xa9\x0b\xf7\x0a\x9a\x4d\xcf\x9a\x2c\x1c\x28\x04\xf4\x37\x73\x15\x8b\x7d\xef\xbe\x05\xe7\x8a\x4b\xed\x1b\x75\xef\xf6\xf4\xe2\xbc\xcf\x79\xf2\x05\x1d\x04\x44\xdf\xa0\x02\x09\x63\x8e\xd8\x16\x73\x69\x72\xf3\x97\x34\x26\x01\xdc\x7b\x99\x9e\x13\xe4\x2d\x16\x9b\x69\x10\x50\x32\xb7\x77\x60\xb6\x0e\xa0\xc8\x37\xef\xb8\xe4\x4a\x9c\x52\x3f\x87\x35\x73\x53\x47\xf3\x16\xb4\xac\xa5\xd1\x80\xeb\x5e\x85\x9e\x4d\xcf\xb2\x5a\x8d\xae\x00\x4c\xd7\x60\xcb\x45\xbe\x1f\x5e\xe5\x8a\xae\xe2\x83\xea\xe5\x1d\x2e\x67\x64\xcd\x10\xaf\x8c\x96\xad\xd5\x86\x30\x8a\xce\x50\xf9\x10\xa5\x4b\x3c\xdc\x2a\x0e\x43\x7b\xb4\x21\x28\x98\x1a\xc8\xad\x4e\x00\xeb\x41\xd5\x8d\x60\xce\xd0\x0d\x46\xb7\xf7\x37\x10\x60\x7b\x18\x6e\x40\x09\x48\xf7\xc0\x62\x41\x17\x3e\x0c\xf7\xdb\x39\x4d\x06\x95\xdc\xb1\xab\xe3\x75\x6d\xec\xba\x4d\x1c\x69\x7b\x54\xdb\x18\xaa\x73\x68\x3e\x62\x42\xdf\x68\x36\xc8\xd8\xa4\x52\x35\xfb\x6d\x65\x7c\x06\x01\x60\xc8\xa7\x2c\x50\xc4\xbe\xa0\xb1\x40\xe0\x9b\x17\x00\x13\x40\xa5\xd4\x53\x07\x4f\x34\xbc\xd1\x17\xb0\x9f\x9c\x2f\x9e\x1d\x02\x7f\x03\xc3\x10\x91\x35\x3a\x00\x67\x94\x21\x80\x49\x9a\x12\x6d\x1c\x35\x2b\x29\x96\xc0\xfb\x0d\x62\x28\xb5\xe3\xe4\x48\x4c\x5d\x02\x76\x80\xa9\x8a\xb9\x9c\xe4\x14\xfc\x04\xfa\x5b\x34\x09\x08\x7f\x76\x38\x61\x12\x95\x6f\x5e\x4c\xbe\xe2\x48\x78\x71\xe4\x41\x0f\xc3\xad\xc7\x68\x88\xba\xc5\x7c\x7e\xce\x81\x97\xcd\xc6\xa1\xc6\x7e\x35\x3a\x92\x44\xad\x8e\x51\x52\x29\xea\xbf\x42\xe1\xef\x95\x53\xce\xe6\x68\xb9\x57\x36\x36\xe5\x32\x82\x6e\xc1\xe9\xcb\x05\x38\x5e\xcc\xc0\x93\xd3\x10\x72\x81\x7d\xf0\x32\xa4\xfe\x35\x58\x08\x49\xbe\xc4\x56\x55\x7f\xc3\x35\x02\x33\x22\x10\x5b\x41\x1f\x3d\x05\x01\xc3\x37\x1d\x17\xda\x60\x9d\xbb\x29\xb4\xea\xa6\x3d\xd0\x9d\x40\x8c\xc0\xb0\x26\xe9\xa7\x09\x85\x61\x60\x2c\x63\x0b\xcf\x0b\x08\x07\x11\xa3\xff\x42\xbe\x48\x6e\x06\x57\x12\x46\xe7\xf9\x26\xac\xdd\x8a\x96\x3d\xba\x71\x8e\x7e\xc5\x2b\x83\x4a\x6b\xa9\x86\xb7\x70\x8d\x5e\xc6\x38\x0c\xfa\x89\x3f\x15\x96\xac\xf1\x55\xfa\xe5\xf4\xf8\x22\xe5\x8b\x94\x17\x2e\xd0\x1a\x73\xc1\x76\x4f\x8d\x02\x3a\x00\x97\x1b\xcc\x01\xe6\x20\xe6\x68\x15\x87\x0a\xc0\x52\xa2\x83\xc9\x7a\xac\xfe\x32\x17\xdd\x8f\x01\x04\xc7\x33\x95\x9b\x20\x85\x87\xdc\xe8\x13\x84\xb4\x70\x89\x62\xbe\x01\x6a\x24\xea\xcf\xd3\xe3\x8b\x76\x73\xf1\xc0\x70\x77\x4e\xd4\xdd\x05\xac\x34\xe8\xcb\x33\xdc\xca\xd6\xce\xf1\x80\x5b\xe9\x57\xac\xb3\x0a\x35\xea\xb0\xe9\xaa\x8d\xa4\x82\x70\x2c\xf0\x74\x41\x30\x8c\x9d\xc6\x66\x91\x4c\x6e\x71\x7d\x1f\x46\xba\xb4\x90\x93\xd5\xda\xd5\x32\xcf\x03\xa9\x30\xc7\xf7\x44\x30\x57\xdd\x1e\x9c\xab\xfc\x54\xa2\x40\x95\x21\xef\x1b\x67\xfe\x05\x32\x09\x98\x43\x44\xac\x59\xa0\x80\x19\xa8\x2a\x66\xad\x2e\x41\x24\x9b\x49\x8c\xfc\xe7\x93\x98\x23\xb6\x56\x29\x22\x16\x96\x67\x61\x99\x44\x37\xb5\xea\x54\xe9\xe7\x6e\xa9\x6d\xa5\x28\xb6\x41\xd1\xbb\x1a\x1d\xb9\x88\x90\x04\xb5\xd5\x21\xde\x2c\xb2\xed\xf3\xdd\xab\xe2\xec\x7e\x0b\xef\xe6\x0c\x57\xb3\x8b\x4e\x5a\xa9\x1c\x18\x25\x20\x40\x5b\x48\x02\x10\x29\x28\xce\x3e\x28\x39\x51\xdf\xbc\x84\x1c\x35\x4d\xde\xab\xe8\xd0\x7d\x64\x6e\x3b\x98\x23\xe6\x23\x22\xe0\x1a\x4d\x97\xf4\x06\xf5\xe8\x2f\xc7\x62\x17\xea\xfe\xf4\xf7\xcf\xbc\xc3\x67\xcf\x3e\xb4\x62\xce\x9a\x96\xe9\x98\x0e\x9f\xb9\x47\x25\x79\x6b\x1a\x86\xd4\x57\xc6\xf0\x42\x30\x28\xd0\xba\x93\x8b\x48\x42\xb2\xe2\x68\x4e\x69\x39\x60\xbf\x03\x35\x0e\xbd\xe7\xdd\x88\xe1\x68\x98\xd2\xe2\x79\x57\x85\x58\x55\x2f\x2f\xe1\xef\x7d\xfc\xd8\x92\x9d\x6a\xa9\xbb\x7f\x12\xc7\x75\x92\x7b\x40\xb5\xe7\x76\x18\xbf\xcf\x8b\xad\x24\x0c\x59\x3e\x4e\x93\x79\x27\xcd\x2b\x93\xd5\x75\x56\x8a\x2f\x2e\xf4\x72\x35\x3a\xca\xa3\x53\x53\x3f\x6c\xf1\xba\x99\x57\x4b\xb9\x22\x67\x27\x5f\x2e\x12\x4e\x63\x80\x38\x48\xa7\x0e\xd8\x33\x6b\x1d\xa2\xc6\xfb\x05\x0a\x76\xea\xc0\x29\x1c\x6e\xb1\xd8\xfc\x4c\x7d\x18\xf6\xda\x4c\x28\x74\x00\x2c\xe0\x00\x24\xe3\x87\x1a\x91\x6c\xa4\x32\x38\xa7\xc2\xde\x9a\x6f\x42\x57\x4a\xd5\x19\xdb\x99\x01\xf7\x8f\x40\x2a\xa4\x04\x8b\xdd\x39\xc2\x92\x94\x8b\x0d\x64\xfd\xf2\x58\xcd\x50\x54\x95\xbf\xfc\x60\xb8\x82\x0d\xe0\x96\x92\xb5\x32\x46\x53\x5c\x75\xc2\x68\xb7\xcc\x89\xe1\x3b\xac\xa2\x55\x2b\x99\x9e\xae\x62\x37\x89\x9d\x3c\x3c\x88\xec\xf4\x29\x11\x8c\x86\xbc\xb4\xa2\x6a\x02\xf9\x9b\x1c\xa2\x36\x85\x59\x21\xfc\x16\x3f\x35\x73\xe9\x87\xb4\x97\x23\x7b\xb6\x02\x52\x63\xdd\xca\x7d\xb2\x9c\x3e\x35\xcd\x8b\xc5\x4f\x05\xd9\x1e\x31\x7a\x83\x03\x14\x98\xed\x74\x30\x06\x54\x6c\x10\xbb\xc5\x1c\x01\x2c\xe4\x53\xbc\x26\x94\xa1\xe0\x00\xbc\x25\xe1\x0e\x50\x82\x00\x5d\x81\x79\xbc\x0c\xb1\xff\x06\xed\xe6\x50\x6c\xc6\xe9\x9f\x2a\xe0\x3b\xf9\xeb\x1c\x6e\x91\x75\x20\x26\x11\xb0\xed\x72\xaa\x1e\xf0\x30\xdc\xde\x30\xb5\x91\x59\xf0\x52\x02\x74\xfb\x9d\x5b\xc9\xb5\xfb\x5e\x8e\x9b\x12\x41\x4d\xee\x44\xcc\x31\x59\x83\xc5\xe2\xec\xc3\x93\x09\x96\x7c\x19\xc4\x2a\x52\xe6\x2b\xce\x37\x9e\xf6\x95\xb4\x73\x29\x57\xf4\x9b\xd1\xfd\x15\xdd\x5c\x8d\x8e\xaa\x70\xab\xf6\xe8\x46\x96\xbe\x3d\x82\x5b\xf5\x1c\x81\x6b\xa4\x10\x5d\x22\xa9\x48\xd3\xa4\x04\x8d\x8a\xc4\xec\x1a\xed\xfc\x0d\xc4\xe4\x00\x64\x19\x4a\x89\x0f\xbd\x6c\x6f\x60\x18\xa3\x2c\x9f\xb4\x22\xdc\x3d\xa2\x51\x4f\xba\x06\x27\xd8\x0d\xc9\x47\x24\x93\x63\xa2\xd2\x34\x1e\x08\x29\xef\x13\xa5\x7a\xb2\x4a\x71\xd0\x83\xac\x97\x1b\x04\x22\x28\x36\x16\x53\x89\x63\xd4\x8b\x45\x8c\xe8\x4b\x86\x62\x54\xb3\xb2\x0e\xaf\x46\xff\x6f\x72\xc0\xf9\x66\x82\x83\xdf\x19\x87\x07\x51\xbc\xbc\x1a\x65\x05\xa0\xec\xa0\xdf\xa4\x7c\xde\x01\xe9\xa8\xe3\xd2\xa0\xf4\xe3\xfd\x03\x73\x6f\x9e\x55\x3e\xd2\x22\x1b\x70\x3a\xbb\xe7\x4c\xda\xae\x06\x93\xd2\xfc\x95\x5c\xe9\x14\xa0\x95\xa2\x61\x3f\x05\x9c\xba\x6b\xc0\xbd\xab\xb4\x37\x95\x4d\x9a\xe6\x3c\xe6\x55\xb7\x8a\x14\xec\x13\x65\xd1\x06\xba\xdb\x26\xd3\xd7\x46\x35\x09\x40\x5c\xad\x90\xdf\x30\x3d\xfd\xfa\x3b\x7e\x80\xe9\x27\x18\xe1\x4f\x3e\x65\xe8\xd3\xcd\xe1\x81\xea\xe7\x54\xc3\x70\x72\xe9\xf5\x5e\x65\xe8\x6c\xa6\xd6\x40\xe3\x86\xad\xb8\xf1\x3a\xcf\x5d\xba\xa7\x71\x89\x22\x83\x30\x4c\xb6\xd8\x3f\x78\x13\x2f\x11\x23\x48\x45\x97\xaa\xe9\x69\xca\x18\xf5\x50\xdc\x0c\xf0\xce\x9d\x53\x56\xc9\x07\x5b\x78\xf7\x8e\x98\x10\xff\xb0\x57\x56\x12\x47\x22\xa9\x33\x94\xa9\x2d\x64\x92\x63\x37\x50\x18\xc3\xd3\xa7\x5b\x04\xe2\xb4\x4f\x70\xbb\x41\x44\x27\x91\x49\x43\x2b\x13\x6b\x0b\x9e\xd8\x3a\x04\x01\x80\xdc\xc0\x6c\x67\x07\x7e\x36\xa4\x9c\xdc\x9c\x27\x6e\xea\xbe\x7b\xd0\x64\x8e\x12\x34\x1f\x18\xa9\xb3\x88\x75\x94\x01\x05\x6e\x6f\x32\x55\x83\x6d\xe0\x55\xc4\xb2\xdb\x25\x99\x0c\xbe\x4b\x24\x6e\x17\xd8\x39\xd9\xf1\x76\x76\x72\x3c\x0b\x10\x11\x58\xec\xe6\x7a\xf7\xc9\x1a\x5e\x8c\x90\x3d\x37\xe2\x3c\x46\xec\xdd\xc5\xcf\xf9\xb3\x53\x8c\x88\x98\x9d\xb4\x38\x37\xb4\x2d\x3a\x28\x0f\xed\xc0\x38\x0e\x21\xae\xdc\xb3\xee\x6f\xde\xa3\xbc\x56\x42\x81\x0e\x8d\xbb\x96\xd6\xb1\x93\xa3\x46\xfd\xb0\x0b\x1f\x7d\xe9\xba\x07\x7b\x11\x8c\x39\x62\x72\x1e\x3a\x73\x90\x05\xd0\x92\x87\x5a\x89\xb0\x76\xeb\xae\x72\x74\xd5\x58\x57\x2c\xa8\xaa\x85\x52\xcd\x8b\xc5\xa9\x1f\xd0\x14\x57\x86\x72\x84\x7c\x15\x88\x4c\x80\x94\x60\xd6\x71\xc6\xb2\x85\x7a\x4f\xdf\x2c\x00\x8c\xc5\xe6\x0f\xd2\xe1\xe8\xa8\x65\x07\x79\x99\x1a\x21\x06\xf3\x25\xf6\xaa\x1d\xa4\x09\x19\x5e\x85\xf1\xdd\x94\x95\x57\xc9\xe7\x2b\x98\x90\x1e\xde\xf8\x3a\x45\x0f\x84\x98\x20\x00\xd9\x5a\x65\x0c\x59\xef\x30\x02\x12\x55\x10\x40\xb4\xa5\x04\x9c\x9c\xce\x2f\x4e\x8f\xa7\x97\xa7\x27\xad\x0c\x86\xde\x9d\x39\xd7\x60\x4a\xcd\x9f\x50\xb8\xb5\xf3\xf0\x1f\x42\x55\x89\x32\xb0\x38\xdf\x3f\x5d\x2b\xbb\x73\x52\x56\x02\xc3\xc2\x7e\x7e\x06\x09\x5e\x21\x5e\x5d\xd6\xba\x89\x7b\xf8\x58\x81\x54\x3e\x6a\x15\xc5\xa6\x26\x7a\x6b\x21\x5b\x0f\xcc\x6b\x2c\xc0\x05\x8a\x28\xa0\x44\x9f\xca\x86\x61\x57\xda\x0c\xd2\xa1\x93\x3a\x2a\xbd\xb8\x87\xa7\x4d\xf6\xa9\x60\x48\x24\xae\x11\x8a\x80\x60\xd0\xbf\x96\x02\x48\x22\xf9\x37\x0e\xf8\x8e\xf8\x52\x08\xa9\x88\xb5\x7f\x6a\x97\x13\xe6\x40\x0a\xdd\x1b\x18\x22\x22\x64\x4b\x93\x6a\x2b\x0d\x3e\xcf\x5b\x63\xe1\xc9\x56\x9e\x80\x6b\x35\x66\xfd\x88\x50\x81\xb8\xc7\xd0\x0a\x60\xa2\x29\xd0\x91\x9a\x0f\x05\xe7\x4a\x8b\x8a\x47\xb0\x3a\x94\xa8\xc1\xa4\x1c\xeb\xc3\x44\x90\xc0\x92\x9b\x15\xa6\xea\x5a\x5b\xbe\x50\xb8\xe8\x6b\xf9\x8a\x0b\x0a\x1d\xac\x0f\xc0\xaa\x07\x7d\xef\xa1\xfb\x0a\x23\x12\x06\x6f\x49\xf5\x15\x5b\x8d\x4e\xe9\x08\x17\x2c\xf6\x85\xc6\x48\x50\x20\x81\x7a\xaa\xa2\xfa\x96\x06\xba\x7e\x92\xae\x46\xac\x50\x0d\x50\x14\xd2\x9d\xf2\xb9\x42\x9e\xf9\xb6\x23\xa5\xee\xb9\xf7\x66\xa1\x73\xb7\x58\x6c\xe4\x14\xf4\x25\xa3\x75\x05\x0e\xa2\x0d\x1a\x01\xec\x68\x8b\x56\x69\x84\x92\x58\x74\x2e\x4b\x17\xe5\x5c\x4c\xe9\x54\xee\x89\xa9\xd4\x4c\xf5\x0f\x62\x7b\x9a\x03\x72\x49\xcd\xfc\x3e\xdb\xd6\x24\x66\x28\x84\x22\x3d\x39\xa0\x96\xd2\xea\xc6\x8c\x44\x44\xa6\x41\x0a\xc9\xc2\x95\x82\x94\xa1\x88\x72\x2c\x28\xdb\x49\x11\x27\x45\x60\x73\x1f\xc0\xe7\xc7\x2c\x67\xed\xce\x1d\xe5\x4e\x6b\xae\x0e\xa5\x71\xd4\x2a\x5f\xb5\x15\x4f\xa6\xe0\x07\x99\xf3\xb4\x12\x6a\xb9\x0a\x6a\x92\x5a\xd4\x78\x9e\x9a\x41\xcb\xd3\x56\x17\x29\x31\xaa\xa0\xdd\x7e\xe2\x94\x04\x11\xc5\x44\x2c\xf4\x75\x0c\x1d\x2d\xe0\x71\xfe\xad\xb3\xea\x8d\x8d\x93\x2f\x93\x24\x45\x2b\x8d\x75\x2e\xbf\x0c\xe9\x9a\x8f\x72\x0f\x3f\x0c\x60\x78\xa7\xe4\xce\x44\xa5\x21\x43\x14\x7b\x49\x85\x71\x4e\x6e\x63\x2e\xc0\x12\x01\x5b\x07\x5f\xda\xc8\xb6\x7a\xa8\xcd\xd6\xd0\x65\x96\x10\x11\x4c\xc1\x34\xf5\xa7\xf2\x03\xb7\x57\x37\x66\x86\x6b\x1f\xc9\x41\xb6\xbe\xb3\xf1\x33\x8c\x21\x5b\x2a\x29\x3f\x98\x9a\x7b\x11\x33\xe3\xab\xf9\x4a\x0e\xb9\x70\x47\xa2\x53\x75\xa2\xfe\xd7\x2d\xd8\xdc\x32\xa5\xe6\x95\xec\x5b\x01\xa8\xd2\x71\x76\xb6\x5c\x6c\xb7\x3a\xbe\x5d\xe1\xd6\x18\x0d\xad\x24\x1a\x2a\x97\xb3\xa9\x59\xe2\x83\x48\xbd\xec\x2d\x48\x65\x97\xf2\xbe\xd1\xb7\xb9\x63\xa9\x39\xf4\x82\x54\x54\x89\xfb\x4d\xc4\x21\x8d\x45\x14\x8b\x9e\x71\x10\x6f\x15\x10\x10\x60\xa6\xca\x07\xed\x92\x2d\xb4\xbd\xf9\x2f\x90\xbf\x24\x4a\x40\x98\x1b\xcd\x39\x78\xb2\x56\xd5\xd2\x04\x4a\xde\x99\xfd\x78\xbb\x83\x95\x7b\xed\x3b\xc3\xa4\x07\x93\x1f\xff\x1d\x63\xff\x9a\x0b\xc8\x84\x27\x95\xbe\x27\x8d\xb5\x8a\x98\x27\x86\x74\x79\xb6\x1e\x44\xa5\x2b\x35\x8c\xff\x2d\x3b\x05\x0b\xd9\xab\x45\xf6\x00\x1c\xeb\x20\x35\x08\x96\x0c\x12\x7f\x33\x06\x72\x3b\xa8\xae\xde\x52\x1b\xf8\x0d\xe4\x9b\x8c\x01\xdb\x4e\xa4\x0e\xd9\xaf\x93\x36\x3a\x40\xa1\x07\x65\x54\x9c\x1e\x65\xe0\xdd\xc5\xcf\xa0\x1a\xdb\x56\x83\xee\x02\xd2\x24\x1f\xf2\x72\x91\x3b\x18\x45\x5e\x80\x6e\x86\x28\x4e\x67\x88\xe5\x62\xad\xb1\x73\x15\x0f\x6d\xcb\xeb\xcb\x60\xd4\x5d\x37\x10\xa4\x2b\x20\x5d\x54\xd4\x28\x54\x7b\xd9\x5b\xd6\x46\x86\x41\x90\xf5\x1a\xa5\xa6\x72\x27\xe3\xfd\xbe\x50\xc9\xc9\xce\x0b\x14\xd1\x26\x82\x53\xaf\x80\x9e\xc1\x63\x6b\x2c\xcc\x52\x02\x31\x09\x10\xb3\xd5\x22\x0d\xde\x05\xf1\x8f\xa5\xa2\xbd\xc5\x61\xa8\x03\x54\xe5\x92\x93\xbb\x96\xff\x52\xce\x3a\x14\x8c\xb5\x4f\x63\x0b\x55\xdb\x8e\x1b\xe2\xe1\xb0\x82\xdb\xe8\x9f\xfb\x30\x73\x5b\x3b\x5b\x88\xfb\xfa\x0a\x15\x0c\x83\xb7\xc5\xcd\xee\xe6\x8c\xb0\xf2\x37\x90\xac\x11\xef\xe3\xdd\xeb\xd6\x8b\x73\xd0\xab\x30\xbe\x1b\x20\x1a\x31\x55\x83\xd9\x99\x53\x6e\x9f\xba\x69\xbb\x65\x72\xd2\xc8\x38\xf5\x8a\x4d\xfa\x30\xd0\xfd\x60\xe1\xa4\x5b\x04\xc5\xe6\xcb\x9d\x5d\x5c\xa0\x10\x0a\x7c\xa3\x83\x26\xf5\x1d\xaa\x26\xd1\xa2\xe0\x19\xd0\x14\x30\x2f\xde\x46\x3c\xf5\x31\xa8\xc1\x9b\x8b\xb6\x24\xdf\xac\x30\x09\xb2\xe1\x4c\x39\xf7\xbb\x2a\x33\x6e\xe8\xf3\xfe\x4a\x55\x22\xf4\xf8\x8e\x0b\xb4\xbd\x1a\x8d\xc1\xd5\x68\x09\x39\xba\x1a\x7d\xe8\x3a\x77\x5f\x74\x38\x7a\x23\x94\x19\x92\x8d\x03\xd5\xff\xcb\xa1\xe9\x5f\x1f\xf6\x33\x85\x36\x8e\x17\x8b\x9f\xfa\xc7\xf8\xce\x33\xe1\xb0\xd6\xe8\x36\xe1\xae\xf6\xa8\x53\x8e\x24\x16\x1b\x44\x04\xf6\xe5\xeb\x8e\xd4\xef\xd7\x93\x93\x10\x31\xeb\x23\x48\x2f\xcd\xc4\x4b\x24\xa4\x61\x64\x70\x2b\xf1\x81\x9a\x73\x13\x68\x93\xd3\xbb\xb9\xc5\xde\x5a\x8a\xdc\x57\xd7\xd5\x76\xdb\x1a\x8b\xff\x99\xd6\x47\xfc\x81\xb2\xf5\x44\xf6\x58\x61\xc7\x15\x82\x04\x7a\x6a\x2c\x09\xe2\xde\x15\x56\xa7\x4e\x3a\x5a\xae\x92\xf7\xc6\x25\x7b\xa9\x24\xba\x5d\x3a\xb0\x48\xd9\x92\x71\x50\xbb\xd6\x87\xb6\x80\xf7\xfa\x8c\x61\x51\x3c\x26\x77\x40\x6b\xe9\x78\x3f\x9e\xea\xfd\xbd\xe6\xec\xda\x05\xf2\x19\x12\xdc\x54\x3b\x6e\x54\xdc\xe2\x1a\xed\xa6\x17\xe7\xcd\xa3\xd3\xcc\xf7\xf7\x15\x9f\xec\xc4\x65\x78\xff\xcd\x9b\xb3\x05\x40\x09\x95\x92\xb8\x96\x81\xfc\x37\x55\xd0\x73\x73\xf5\x2b\x0a\xc3\x37\x84\xde\xb6\x2b\x0e\x38\x48\x09\x39\x55\x37\x29\x57\x1e\xa9\x5c\xe7\xed\x00\x2c\x10\x02\xef\xd3\x07\x60\xfa\xeb\x02\x04\xd4\xe7\xf5\xe5\x46\xd0\x35\xb7\x97\xd1\x66\x4a\x79\x94\xc1\xab\x4a\x23\xed\x9c\x16\xcd\xd1\x6e\x56\x7a\xa4\x0d\xaa\x57\xa3\x23\x07\x29\x7e\x9c\xc0\xa3\xea\x6a\xf9\x35\xe7\xa4\xf0\x96\x67\x2b\x5b\x1f\xeb\x4c\xd4\xc1\xa7\x55\x27\xee\xa9\x0c\xc0\x5b\xee\x85\x14\x06\x9e\xa9\x68\xc0\x3c\x3f\xe9\xd3\x4c\xb5\x44\x08\x58\x8c\xba\xce\x74\x6d\x3f\x83\xcc\x79\x9b\x31\xf5\xe0\x83\xbd\x03\xb9\x1a\x1d\x95\x29\xd6\x99\x21\x06\x2a\xa0\xa8\xc8\x95\x2d\xe3\x97\xd0\xce\x4c\x72\xee\x5d\x7e\x8e\x3b\x55\xff\xeb\x32\x9d\x35\xf8\x0d\x54\x93\xf0\x6a\x74\x54\x1a\x68\xe7\xa9\x41\x4b\x7e\xbc\x98\xdd\xff\x12\x45\x4b\xee\xf9\x1c\x97\x17\xa6\x64\x45\xfb\x52\x17\xfd\x2b\xcc\x5c\xa6\xdc\xf7\x75\xb2\x0b\xf3\x38\x5e\xf3\x49\xb9\xad\x2d\xd7\xa8\xff\xf2\xa2\xa4\x4c\xef\x80\x2b\xb3\x6a\x28\xb5\x95\xca\x7b\xa0\x2e\xa5\xb3\x9b\x48\xdd\x67\x7d\xf5\x99\x66\x7d\x55\x37\xeb\xab\x9a\x59\x2f\x48\xb1\x65\x48\xd7\x6a\x65\xe8\x4a\x7b\x3c\x49\xef\xc6\x64\x9d\x02\xda\x11\xb8\xc5\xbe\x17\xd9\xab\x65\x30\x59\x0f\x39\xef\x15\x83\x29\xcf\xfb\x50\xc8\xdb\x99\x2f\x13\xaa\xfb\xcc\x0f\x58\x03\x33\x5f\x98\xb2\xa6\x20\xa5\x99\xf4\xdc\xf7\x8d\x17\x79\xb6\x95\x24\xe5\x72\xa2\xbd\xb0\x5a\x58\x8a\x58\x50\x86\x61\xa8\x56\xd4\xc1\x36\xe8\x32\xdf\x2d\xc7\xd1\x6a\x9d\xb7\xc3\xfe\x6a\x74\x54\x22\x52\xe7\xa9\xfe\xd2\x85\x3b\xdb\x4d\xc4\x20\x9d\x0c\x75\x24\xdf\xae\xde\x65\xb5\xbd\x5b\xb1\xf0\x2a\x4c\xa3\x3a\xb5\x5c\x27\xbc\x07\xd9\x52\xaa\xa3\x79\x55\x01\x47\xca\x3b\x9f\x6e\xb7\x94\xa4\x05\xb3\xdb\xd4\xae\xdc\x0f\x29\xb7\x55\x4c\x17\xcf\xa7\x5b\x04\x6f\xd0\x2d\x65\xd7\xfc\x93\xbe\x9b\xfb\x53\x74\xbd\xfe\x14\x0b\x1c\xf2\x4f\x38\x22\x48\x1c\xcc\xe6\xe7\xf9\x0b\x58\x2a\x7c\x54\x25\x1e\x26\x60\x36\x07\x30\x08\x18\xe2\xaa\x94\xd0\xf1\xec\xe4\x02\x10\x2a\xda\xc5\x77\xed\x01\x93\x1b\xd7\x9e\xac\xea\xea\x31\xe4\xa0\xe4\xef\x05\xcd\x34\x2a\x9f\x10\xec\xbb\x78\xe1\x32\x4d\x2b\xce\xae\x03\xf7\x59\x41\x29\x2f\x07\x92\x20\x44\x1c\xc4\x64\x0b\x19\xdf\xc0\x50\x5d\x7e\xb9\xa4\x62\x03\xb6\x30\x7a\xaf\x51\xff\xa0\xff\x53\xa7\x95\xef\x3f\x14\x3a\x6e\x4a\xe3\xfe\x3d\xfd\xc5\x2e\xf8\x3f\xff\xf2\xe7\x5f\xfe\x7f\x00\x00\x00\xff\xff\x6a\x03\x6e\x04\x83\x59\x01\x00") func schemaJsonBytes() ([]byte, error) { return bindataRead( diff --git a/pkg/apis/eksctl.io/v1alpha5/types.go b/pkg/apis/eksctl.io/v1alpha5/types.go index 39b3e4c39d..97f6ce796a 100644 --- a/pkg/apis/eksctl.io/v1alpha5/types.go +++ b/pkg/apis/eksctl.io/v1alpha5/types.go @@ -8,6 +8,8 @@ import ( "strings" "time" + "github.com/aws/aws-sdk-go/service/cloudwatchlogs/cloudwatchlogsiface" + "github.com/aws/aws-sdk-go/aws/client" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface" @@ -43,7 +45,7 @@ const ( Version1_21 = "1.21" // DefaultVersion (default) - DefaultVersion = Version1_20 + DefaultVersion = Version1_21 LatestVersion = Version1_21 ) @@ -183,6 +185,7 @@ const ( NodeImageFamilyWindowsServer2019CoreContainer = "WindowsServer2019CoreContainer" NodeImageFamilyWindowsServer2019FullContainer = "WindowsServer2019FullContainer" NodeImageFamilyWindowsServer2004CoreContainer = "WindowsServer2004CoreContainer" + NodeImageFamilyWindowsServer20H2CoreContainer = "WindowsServer20H2CoreContainer" ) // Container runtime values. @@ -490,6 +493,7 @@ func supportedAMIFamilies() []string { NodeImageFamilyWindowsServer2019CoreContainer, NodeImageFamilyWindowsServer2019FullContainer, NodeImageFamilyWindowsServer2004CoreContainer, + NodeImageFamilyWindowsServer20H2CoreContainer, } } @@ -620,6 +624,7 @@ type ClusterProvider interface { SSM() ssmiface.SSMAPI IAM() iamiface.IAMAPI CloudTrail() cloudtrailiface.CloudTrailAPI + CloudWatchLogs() cloudwatchlogsiface.CloudWatchLogsAPI Region() string Profile() string WaitTimeout() time.Duration @@ -846,7 +851,6 @@ func NewManagedNodeGroup() *ManagedNodeGroup { SSH: &NodeGroupSSH{ Allow: Disabled(), PublicKeyName: &publicKey, - EnableSSM: Disabled(), }, IAM: &NodeGroupIAM{ WithAddonPolicies: NodeGroupIAMAddonPolicies{ diff --git a/pkg/apis/eksctl.io/v1alpha5/validation.go b/pkg/apis/eksctl.io/v1alpha5/validation.go index 01c5c44f3d..14c3913fae 100644 --- a/pkg/apis/eksctl.io/v1alpha5/validation.go +++ b/pkg/apis/eksctl.io/v1alpha5/validation.go @@ -7,6 +7,8 @@ import ( "strconv" "strings" + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/arn" "github.com/kris-nova/logger" @@ -117,18 +119,8 @@ func ValidateClusterConfig(cfg *ClusterConfig) error { } } - if cfg.HasClusterCloudWatchLogging() { - for i, logType := range cfg.CloudWatch.ClusterLogging.EnableTypes { - isUnknown := true - for _, knownLogType := range SupportedCloudWatchClusterLogTypes() { - if logType == knownLogType { - isUnknown = false - } - } - if isUnknown { - return fmt.Errorf("log type %q (cloudWatch.clusterLogging.enableTypes[%d]) is unknown", logType, i) - } - } + if err := validateCloudWatchLogging(cfg); err != nil { + return err } if err := cfg.ValidateVPCConfig(); err != nil { @@ -227,6 +219,39 @@ func (c *ClusterConfig) addonContainsManagedAddons(addons []string) []string { return missing } +func validateCloudWatchLogging(clusterConfig *ClusterConfig) error { + if !clusterConfig.HasClusterCloudWatchLogging() { + if clusterConfig.CloudWatch != nil && + clusterConfig.CloudWatch.ClusterLogging != nil && + clusterConfig.CloudWatch.ClusterLogging.LogRetentionInDays != 0 { + return errors.New("cannot set cloudWatch.clusterLogging.logRetentionInDays without enabling log types") + } + return nil + } + + for i, logType := range clusterConfig.CloudWatch.ClusterLogging.EnableTypes { + isUnknown := true + for _, knownLogType := range SupportedCloudWatchClusterLogTypes() { + if logType == knownLogType { + isUnknown = false + } + } + if isUnknown { + return errors.Errorf("log type %q (cloudWatch.clusterLogging.enableTypes[%d]) is unknown", logType, i) + } + } + if logRetentionDays := clusterConfig.CloudWatch.ClusterLogging.LogRetentionInDays; logRetentionDays != 0 { + for _, v := range LogRetentionInDaysValues { + if v == logRetentionDays { + return nil + } + } + return errors.Errorf("invalid value %d for logRetentionInDays; supported values are %v", logRetentionDays, LogRetentionInDaysValues) + } + + return nil +} + // ValidateClusterEndpointConfig checks the endpoint configuration for potential issues func (c *ClusterConfig) ValidateClusterEndpointConfig() error { if !c.HasClusterEndpointAccess() { @@ -281,7 +306,8 @@ func PrivateOnly(ces *ClusterEndpoints) bool { return !*ces.PublicAccess && *ces.PrivateAccess } -func validateNodeGroupBase(ng *NodeGroupBase, path string) error { +func validateNodeGroupBase(np NodePool, path string) error { + ng := np.BaseNodeGroup() if ng.VolumeSize == nil { errCantSet := func(field string) error { return fmt.Errorf("%s.%s cannot be set without %s.volumeSize", path, field, path) @@ -348,6 +374,10 @@ func validateNodeGroupBase(ng *NodeGroupBase, path string) error { } } + if instanceutils.IsGPUInstanceType(SelectInstanceType(np)) && (ng.AMIFamily != NodeImageFamilyAmazonLinux2 && ng.AMIFamily != "") { + return errors.Errorf("GPU instance types are not supported for %s", ng.AMIFamily) + } + return nil } @@ -438,7 +468,7 @@ func validateNodeGroupName(name string) error { // ValidateNodeGroup checks compatible fields of a given nodegroup func ValidateNodeGroup(i int, ng *NodeGroup) error { path := fmt.Sprintf("nodeGroups[%d]", i) - if err := validateNodeGroupBase(ng.NodeGroupBase, path); err != nil { + if err := validateNodeGroupBase(ng, path); err != nil { return err } @@ -662,7 +692,7 @@ func ValidateManagedNodeGroup(ng *ManagedNodeGroup, index int) error { path := fmt.Sprintf("managedNodeGroups[%d]", index) - if err := validateNodeGroupBase(ng.NodeGroupBase, path); err != nil { + if err := validateNodeGroupBase(ng, path); err != nil { return err } @@ -989,7 +1019,8 @@ func IsWindowsImage(imageFamily string) bool { switch imageFamily { case NodeImageFamilyWindowsServer2019CoreContainer, NodeImageFamilyWindowsServer2019FullContainer, - NodeImageFamilyWindowsServer2004CoreContainer: + NodeImageFamilyWindowsServer2004CoreContainer, + NodeImageFamilyWindowsServer20H2CoreContainer: return true default: diff --git a/pkg/apis/eksctl.io/v1alpha5/validation_test.go b/pkg/apis/eksctl.io/v1alpha5/validation_test.go index d3c4f90833..8d34f75cd5 100644 --- a/pkg/apis/eksctl.io/v1alpha5/validation_test.go +++ b/pkg/apis/eksctl.io/v1alpha5/validation_test.go @@ -29,11 +29,11 @@ var _ = Describe("ClusterConfig validation", func() { It("should handle unique nodegroups", func() { err = api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) for i, ng := range cfg.NodeGroups { err = api.ValidateNodeGroup(i, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } }) @@ -71,7 +71,7 @@ var _ = Describe("ClusterConfig validation", func() { It("should reject invalid nodegroup names", func() { err = api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) for i, ng := range cfg.NodeGroups { err = api.ValidateNodeGroup(i, ng) @@ -87,7 +87,7 @@ var _ = Describe("ClusterConfig validation", func() { ng0.Name = "node-group" ng0.ContainerRuntime = aws.String("invalid") err := api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = api.ValidateNodeGroup(0, ng0) Expect(err).To(HaveOccurred()) }) @@ -98,7 +98,7 @@ var _ = Describe("ClusterConfig validation", func() { ng0.ContainerRuntime = aws.String(api.ContainerRuntimeContainerD) ng0.AMIFamily = api.NodeImageFamilyBottlerocket err := api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = api.ValidateNodeGroup(0, ng0) Expect(err).To(HaveOccurred()) }) @@ -242,11 +242,11 @@ var _ = Describe("ClusterConfig validation", func() { JustBeforeEach(func() { err = api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) for i, ng := range cfg.NodeGroups { err = api.ValidateNodeGroup(i, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } }) @@ -254,14 +254,14 @@ var _ = Describe("ClusterConfig validation", func() { ng1.IAM.InstanceProfileARN = "p1" err = api.ValidateNodeGroup(1, ng1) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should allow setting only instanceRoleARN", func() { ng1.IAM.InstanceRoleARN = "r1" err = api.ValidateNodeGroup(1, ng1) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should allow setting instanceProfileARN and instanceRoleARN", func() { @@ -269,7 +269,7 @@ var _ = Describe("ClusterConfig validation", func() { ng1.IAM.InstanceRoleARN = "r1" err = api.ValidateNodeGroup(1, ng1) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should not allow setting instanceProfileARN and instanceRoleName", func() { @@ -346,21 +346,21 @@ var _ = Describe("ClusterConfig validation", func() { cfg.IAM.WithOIDC = nil err = api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should pass when iam.withOIDC is disabled", func() { cfg.IAM.WithOIDC = api.Disabled() err = api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should pass when iam.withOIDC is enabled", func() { cfg.IAM.WithOIDC = api.Enabled() err = api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should fail when iam.withOIDC is disabled and some iam.serviceAccounts are given", func() { @@ -469,9 +469,7 @@ var _ = Describe("ClusterConfig validation", func() { It("should handle known types", func() { cfg.CloudWatch.ClusterLogging.EnableTypes = []string{"api"} - - err = api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(api.ValidateClusterConfig(cfg)).To(Succeed()) }) It("should handle unknown types", func() { @@ -479,9 +477,51 @@ var _ = Describe("ClusterConfig validation", func() { err = api.ValidateClusterConfig(cfg) Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError(ContainSubstring(`log type "anything" (cloudWatch.clusterLogging.enableTypes[0]) is unknown`))) }) }) + type logRetentionEntry struct { + logging *api.ClusterCloudWatchLogging + + expectedErr string + } + + DescribeTable("CloudWatch log retention", func(l logRetentionEntry) { + clusterConfig := api.NewClusterConfig() + clusterConfig.CloudWatch.ClusterLogging = l.logging + err := api.ValidateClusterConfig(clusterConfig) + if l.expectedErr != "" { + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError(ContainSubstring(l.expectedErr))) + return + } + + Expect(err).NotTo(HaveOccurred()) + }, + Entry("invalid value", logRetentionEntry{ + logging: &api.ClusterCloudWatchLogging{ + LogRetentionInDays: 42, + EnableTypes: []string{"api"}, + }, + expectedErr: `invalid value 42 for logRetentionInDays; supported values are [1 3 5 7`, + }), + + Entry("valid value", logRetentionEntry{ + logging: &api.ClusterCloudWatchLogging{ + LogRetentionInDays: 545, + EnableTypes: []string{"api"}, + }, + }), + + Entry("log retention without enableTypes", logRetentionEntry{ + logging: &api.ClusterCloudWatchLogging{ + LogRetentionInDays: 545, + }, + expectedErr: "cannot set cloudWatch.clusterLogging.logRetentionInDays without enabling log types", + }), + ) + Describe("cluster endpoint access config", func() { var ( cfg *api.ClusterConfig @@ -499,21 +539,21 @@ var _ = Describe("ClusterConfig validation", func() { cfg.VPC.ClusterEndpoints = &api.ClusterEndpoints{PrivateAccess: api.Enabled(), PublicAccess: api.Enabled()} err = cfg.ValidateClusterEndpointConfig() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should not error on private=false, public=true", func() { cfg.VPC.ClusterEndpoints = &api.ClusterEndpoints{PrivateAccess: api.Disabled(), PublicAccess: api.Enabled()} err = cfg.ValidateClusterEndpointConfig() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should not error on private=true, public=false", func() { cfg.VPC.ClusterEndpoints = &api.ClusterEndpoints{PrivateAccess: api.Enabled(), PublicAccess: api.Disabled()} err = cfg.ValidateClusterEndpointConfig() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should error on private=false, public=false", func() { @@ -784,12 +824,12 @@ var _ = Describe("ClusterConfig validation", func() { It("works independent of instanceType", func() { Context("unset", func() { err := api.ValidateNodeGroup(0, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) Context("set", func() { ng.InstanceType = "mixed" err := api.ValidateNodeGroup(0, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) }) @@ -871,7 +911,7 @@ var _ = Describe("ClusterConfig validation", func() { It("It doesn't panic when instance distribution is not enabled", func() { ng.InstancesDistribution = nil err := api.ValidateNodeGroup(0, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("It doesn't fail when instance distribution is enabled and instanceType is \"mixed\"", func() { @@ -879,7 +919,7 @@ var _ = Describe("ClusterConfig validation", func() { ng.InstancesDistribution.InstanceTypes = []string{"t3.medium"} err := api.ValidateNodeGroup(0, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("It fails when instance distribution is enabled and instanceType set", func() { @@ -956,7 +996,7 @@ var _ = Describe("ClusterConfig validation", func() { ng.InstancesDistribution.SpotInstancePools = newInt(2) err := api.ValidateNodeGroup(0, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) }) }) @@ -997,7 +1037,7 @@ var _ = Describe("ClusterConfig validation", func() { }, } err := api.ValidateNodeGroup(0, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) }) }) @@ -1042,7 +1082,7 @@ var _ = Describe("ClusterConfig validation", func() { ng.VolumeEncrypted = &enabled ng.VolumeKmsKeyID = &kmsKeyID err := api.ValidateNodeGroup(0, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) }) @@ -1112,7 +1152,7 @@ var _ = Describe("ClusterConfig validation", func() { }, } err := profile.Validate() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("passes when a name and multiple selectors with a namespace is defined", func() { @@ -1128,7 +1168,7 @@ var _ = Describe("ClusterConfig validation", func() { }, } err := profile.Validate() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) }) }) @@ -1211,7 +1251,7 @@ var _ = Describe("ClusterConfig validation", func() { Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring(k.errSubstr)) } else { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } }, Entry("Nil secretsEncryption", kmsFieldCase{ @@ -1238,7 +1278,7 @@ var _ = Describe("ClusterConfig validation", func() { It("fails when the AMIFamily is not supported", func() { ng.AMIFamily = "SomeTrash" err := api.ValidateNodeGroup(0, ng) - Expect(err).To(MatchError("AMI Family SomeTrash is not supported - use one of: AmazonLinux2, Ubuntu2004, Ubuntu1804, Bottlerocket, WindowsServer2019CoreContainer, WindowsServer2019FullContainer, WindowsServer2004CoreContainer")) + Expect(err).To(MatchError("AMI Family SomeTrash is not supported - use one of: AmazonLinux2, Ubuntu2004, Ubuntu1804, Bottlerocket, WindowsServer2019CoreContainer, WindowsServer2019FullContainer, WindowsServer2004CoreContainer, WindowsServer20H2CoreContainer")) }) }) @@ -1289,7 +1329,7 @@ var _ = Describe("ClusterConfig validation", func() { ng.Taints = e.taints err := api.ValidateNodeGroup(0, ng) if e.valid { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } else { Expect(err).To(HaveOccurred()) } diff --git a/pkg/authconfigmap/assets.go b/pkg/authconfigmap/assets.go deleted file mode 100644 index fed4761932..0000000000 --- a/pkg/authconfigmap/assets.go +++ /dev/null @@ -1,274 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// assets/emr-containers-rbac.yaml (1.468kB) - -package authconfigmap - -import ( - "bytes" - "compress/gzip" - "crypto/sha256" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo - digest [sha256.Size]byte -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _emrContainersRbacYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x94\x3f\x8f\xdb\x30\x0c\xc5\x77\x7d\x0a\x21\xf3\x39\x87\x6e\x85\xc7\x2e\xdd\x0f\x68\x97\xa2\x03\x25\xbf\xf8\x74\x27\x8b\x02\x29\xa7\x7f\x3e\x7d\x21\x39\xbe\x2b\x5a\xa7\x48\x8a\xa0\x9d\x44\x93\xf6\xd3\x8f\x0f\x26\x29\x87\x8f\x10\x0d\x9c\x7a\x2b\x8e\xfc\x9e\xe6\xf2\xc8\x12\xbe\x53\x09\x9c\xf6\xcf\x6f\x75\x1f\xf8\xfe\xf8\xc6\x3c\x87\x34\xf4\xf6\x81\x23\xcc\x84\x42\x03\x15\xea\x8d\xb5\x89\x26\xf4\x16\x93\x74\x9e\x53\xa1\x90\x20\x6a\x64\x8e\xd0\x5a\xed\x2c\xe5\xf0\x5e\x78\xce\xda\xdb\x4f\xbb\xdd\x67\x63\xad\xb5\x02\xe5\x59\x3c\x5a\xae\x0a\x68\x26\x0f\x3d\x55\x8f\x10\xd7\x2a\x23\x4a\x4b\x5d\x20\xa2\x90\x63\xf0\x20\xef\x79\x4e\x45\x77\x77\x76\x4d\xb5\xd8\x73\x3a\x84\x71\xa2\xdc\x9e\x70\xc4\xe9\x9d\xcc\xc3\xcb\x79\x1f\x79\xdc\x22\xb8\xb3\xbb\x18\xb4\x9d\x5f\xa8\xf8\xc7\x1a\x0c\x50\x2f\xc1\xa1\x69\x0b\xa8\xb4\x08\x43\x28\x4b\x35\x62\xc9\x2c\x91\xe7\x18\xe1\xab\x9d\x35\x47\x29\x71\x39\x7d\x91\x57\xc1\x48\x0e\xf1\xf2\x66\xbd\xa0\xfc\x66\xd7\x2b\x48\x7e\xe5\x5c\x49\x16\xf4\x8d\x0b\x28\x67\xdd\xbc\xa4\x32\x1e\xe6\xa8\x58\xac\x1a\x90\x23\x7f\x9b\x9a\x73\x37\x76\xe9\x3a\x47\xdc\x4b\x27\xbf\x10\x3f\xb1\xfb\xcf\x68\xf8\x5a\x90\xea\x28\x6d\x3a\x1a\xd2\x28\x50\xdd\xfe\xcf\xff\x1d\xe4\xd9\x21\xdf\x62\x16\x8e\xcb\x04\xd5\xc0\x85\x34\x84\x34\xde\x9c\xff\xea\x29\x31\x5d\xd7\x99\xbf\x58\x5c\xef\x96\x06\x2e\xd8\x5f\x1c\xf1\x80\x43\xad\xaf\xde\xfd\xe1\x12\x63\xed\x4f\xcb\xf1\x8c\xa4\xce\xee\x09\xbe\x68\x6f\xba\xab\x34\x3f\x28\xe4\x9c\xe6\x8f\x00\x00\x00\xff\xff\x8b\x95\x6b\x36\xbc\x05\x00\x00") - -func emrContainersRbacYamlBytes() ([]byte, error) { - return bindataRead( - _emrContainersRbacYaml, - "emr-containers-rbac.yaml", - ) -} - -func emrContainersRbacYaml() (*asset, error) { - bytes, err := emrContainersRbacYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "emr-containers-rbac.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0xbc, 0x51, 0xe8, 0x47, 0x23, 0x61, 0x8, 0xb1, 0x55, 0x1d, 0xce, 0x13, 0x1e, 0xda, 0x59, 0x4e, 0x6d, 0xda, 0x2b, 0xc5, 0x4, 0x3d, 0x7a, 0x8, 0xce, 0x29, 0xdf, 0x28, 0xab, 0x7d, 0x60}} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// AssetString returns the asset contents as a string (instead of a []byte). -func AssetString(name string) (string, error) { - data, err := Asset(name) - return string(data), err -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// MustAssetString is like AssetString but panics when Asset would return an -// error. It simplifies safe initialization of global variables. -func MustAssetString(name string) string { - return string(MustAsset(name)) -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetDigest returns the digest of the file with the given name. It returns an -// error if the asset could not be found or the digest could not be loaded. -func AssetDigest(name string) ([sha256.Size]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) - } - return a.digest, nil - } - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) -} - -// Digests returns a map of all known files and their checksums. -func Digests() (map[string][sha256.Size]byte, error) { - mp := make(map[string][sha256.Size]byte, len(_bindata)) - for name := range _bindata { - a, err := _bindata[name]() - if err != nil { - return nil, err - } - mp[name] = a.digest - } - return mp, nil -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "emr-containers-rbac.yaml": emrContainersRbacYaml, -} - -// AssetDebug is true if the assets were built with the debug flag enabled. -const AssetDebug = false - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"}, -// AssetDir("data/img") would return []string{"a.png", "b.png"}, -// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - canonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(canonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "emr-containers-rbac.yaml": {emrContainersRbacYaml, map[string]*bintree{}}, -}} - -// RestoreAsset restores an asset under the given directory. -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively. -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - canonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) -} diff --git a/pkg/authconfigmap/authconfigmap.go b/pkg/authconfigmap/authconfigmap.go index 246863e7d1..6550406989 100644 --- a/pkg/authconfigmap/authconfigmap.go +++ b/pkg/authconfigmap/authconfigmap.go @@ -108,20 +108,19 @@ func (a *AuthConfigMap) RemoveAccount(account string) error { return err } - var newAccounts []string found := false - for _, acc := range accounts { + for i, acc := range accounts { if acc == account { found = true - continue + accounts = append(accounts[:i], accounts[i+1:]...) + break } - newAccounts = append(newAccounts, acc) } if !found { return fmt.Errorf("account %q not found in auth ConfigMap", account) } logger.Info("removing account %q from auth ConfigMap", account) - return a.setAccounts(newAccounts) + return a.setAccounts(accounts) } func (a *AuthConfigMap) accounts() ([]string, error) { @@ -150,7 +149,7 @@ func (a *AuthConfigMap) AddIdentity(identity iam.Identity) error { // AddIdentityIfNotPresent adds the specified identity if the predicate exists(identity) returns false for all entries func (a *AuthConfigMap) AddIdentityIfNotPresent(identity iam.Identity, exists func(iam.Identity) bool) error { - identities, err := a.Identities() + identities, err := a.GetIdentities() if err != nil { return err } @@ -175,7 +174,7 @@ func (a *AuthConfigMap) AddIdentityIfNotPresent(identity iam.Identity, exists fu // If `all` is true it will remove all of them and not return an // error if it cannot be found. func (a *AuthConfigMap) RemoveIdentity(arnToDelete string, all bool) error { - identities, err := a.Identities() + identities, err := a.GetIdentities() if err != nil { return err } @@ -199,8 +198,8 @@ func (a *AuthConfigMap) RemoveIdentity(arnToDelete string, all bool) error { return a.setIdentities(newidentities) } -// Identities returns a list of iam users and roles that are currently in the (cached) configmap. -func (a *AuthConfigMap) Identities() ([]iam.Identity, error) { +// GetIdentities returns a list of iam users and roles that are currently in the (cached) configmap. +func (a *AuthConfigMap) GetIdentities() ([]iam.Identity, error) { var roles []iam.RoleIdentity if err := yaml.Unmarshal([]byte(a.cm.Data[rolesData]), &roles); err != nil { return nil, errors.Wrapf(err, "unmarshalling %q", rolesData) @@ -211,12 +210,20 @@ func (a *AuthConfigMap) Identities() ([]iam.Identity, error) { return nil, errors.Wrapf(err, "unmarshalling %q", usersData) } - all := make([]iam.Identity, len(users)+len(roles)) - for i, r := range roles { - all[i] = r + var accounts []string + if err := yaml.Unmarshal([]byte(a.cm.Data[accountsData]), &accounts); err != nil { + return nil, errors.Wrapf(err, "unmarshalling %q", accountsData) + } + + var all []iam.Identity + for _, r := range roles { + all = append(all, r) } - for i, u := range users { - all[i+len(roles)] = u + for _, u := range users { + all = append(all, u) + } + for _, a := range accounts { + all = append(all, iam.AccountIdentity{KubernetesAccount: a}) } return all, nil } @@ -230,6 +237,9 @@ func (a *AuthConfigMap) setIdentities(identities []iam.Identity) error { roles = append(roles, identity) case iam.ResourceTypeUser: users = append(users, identity) + case iam.ResourceTypeAccount: + // skip, this is handled separately by AddAccount + continue default: return errors.Errorf("cannot determine if %q refers to a user or role during setIdentities preprocessing", identity.ARN()) } diff --git a/pkg/authconfigmap/authconfigmap_test.go b/pkg/authconfigmap/authconfigmap_test.go index a0374c9fde..104db44a4b 100644 --- a/pkg/authconfigmap/authconfigmap_test.go +++ b/pkg/authconfigmap/authconfigmap_test.go @@ -13,6 +13,7 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + . "github.com/weaveworks/eksctl/pkg/authconfigmap" "github.com/weaveworks/eksctl/pkg/iam" ) @@ -96,7 +97,7 @@ func makeExpectedAccounts(accounts ...string) string { func mustIdentity(arn string, username string, groups []string) iam.Identity { id, err := iam.NewIdentity(arn, username, groups) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return id } @@ -368,6 +369,74 @@ var _ = Describe("AuthConfigMap{}", func() { Expect(cm.Data["mapUsers"]).To(MatchYAML(expectedUsers)) }) }) + Describe("GetIdentities()", func() { + + var ( + client *mockClient + existing *corev1.ConfigMap + acm *AuthConfigMap + addAndSave func(account string) *corev1.ConfigMap + ) + + BeforeEach(func() { + existing = &corev1.ConfigMap{ + ObjectMeta: ObjectMeta(), + Data: map[string]string{}, + } + existing.UID = "123456" + client = &mockClient{} + acm = New(client, existing) + addAndSave = func(account string) *corev1.ConfigMap { + client.reset() + err := acm.AddAccount(account) + Expect(err).NotTo(HaveOccurred()) + + err = acm.Save() + Expect(err).NotTo(HaveOccurred()) + Expect(client.created).To(BeNil()) + Expect(client.updated).NotTo(BeNil()) + + return client.updated + } + }) + + It("should list accounts as identities", func() { + cm := addAndSave(accountA) + Expect(cm.Data["mapAccounts"]).To(MatchYAML(makeExpectedAccounts(accountA))) + identities, err := acm.GetIdentities() + Expect(err).NotTo(HaveOccurred()) + Expect(identities).To(ContainElement(iam.AccountIdentity{KubernetesAccount: accountA})) + }) + When("the list of identities can consist of different identities", func() { + It("handles all of them well", func() { + err := acm.AddAccount(accountA) + Expect(err).NotTo(HaveOccurred()) + err = acm.AddIdentity(mustIdentity(userA, userAUsername, userAGroups)) + Expect(err).NotTo(HaveOccurred()) + err = acm.AddIdentity(mustIdentity(roleA, RoleNodeGroupUsername, RoleNodeGroupGroups)) + Expect(err).NotTo(HaveOccurred()) + identities, err := acm.GetIdentities() + Expect(err).NotTo(HaveOccurred()) + Expect(identities).To(ConsistOf( + iam.AccountIdentity{KubernetesAccount: accountA}, + iam.UserIdentity{ + UserARN: userA, + KubernetesIdentity: iam.KubernetesIdentity{ + KubernetesUsername: userAUsername, + KubernetesGroups: userAGroups, + }, + }, + iam.RoleIdentity{ + RoleARN: roleA, + KubernetesIdentity: iam.KubernetesIdentity{ + KubernetesUsername: RoleNodeGroupUsername, + KubernetesGroups: RoleNodeGroupGroups, + }, + }), + ) + }) + }) + }) Describe("RemoveIdentity()", func() { existing := &corev1.ConfigMap{ ObjectMeta: ObjectMeta(), diff --git a/pkg/authconfigmap/service_access.go b/pkg/authconfigmap/service_access.go index c6f18622bc..a00a0ff06b 100644 --- a/pkg/authconfigmap/service_access.go +++ b/pkg/authconfigmap/service_access.go @@ -3,6 +3,9 @@ package authconfigmap import ( "fmt" + // go go:embed to work + _ "embed" + "github.com/kris-nova/logger" "github.com/pkg/errors" "github.com/weaveworks/eksctl/pkg/assetutil" @@ -12,7 +15,8 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -//go:generate ${GOBIN}/go-bindata -pkg ${GOPACKAGE} -prefix assets -nometadata -o assets.go assets +//go:embed assets/emr-containers-rbac.yaml +var emrContainersRbacYamlBytes []byte type ServiceName string @@ -126,7 +130,7 @@ func lookupService(serviceName string) (resources []byte, sd serviceDetails, err switch ServiceName(serviceName) { case emrContainers: - return assetutil.MustLoad(emrContainersRbacYamlBytes), emrContainersService, nil + return emrContainersRbacYamlBytes, emrContainersService, nil default: return nil, sd, errors.Errorf("invalid service name %q", serviceName) } diff --git a/pkg/az/az_test.go b/pkg/az/az_test.go index 0587db6852..00201a87fe 100644 --- a/pkg/az/az_test.go +++ b/pkg/az/az_test.go @@ -277,7 +277,7 @@ var _ = Describe("AZ", func() { azSelector := NewSelectorWithDefaults(p.EC2(), region) selectedZones, err := azSelector.SelectZones() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(p.MockEC2().AssertNumberOfCalls(GinkgoT(), "DescribeAvailabilityZones", 1)).To(BeTrue()) Expect(selectedZones).To(ConsistOf("cn-north-1a", "cn-north-1b", "cn-north-1e")) }) diff --git a/pkg/cfn/builder/builder_suite_test.go b/pkg/cfn/builder/builder_suite_test.go index ad3860e933..e624b39b15 100644 --- a/pkg/cfn/builder/builder_suite_test.go +++ b/pkg/cfn/builder/builder_suite_test.go @@ -82,7 +82,7 @@ func vpcConfig() *api.ClusterVPC { } func isRefTo(obj interface{}, value string) bool { - Expect(obj).ToNot(BeEmpty()) + Expect(obj).NotTo(BeEmpty()) o, ok := obj.(map[string]interface{}) Expect(ok).To(BeTrue()) Expect(o).To(HaveKey(gfnt.Ref)) diff --git a/pkg/cfn/builder/cluster_test.go b/pkg/cfn/builder/cluster_test.go index bb83fe80cf..fc48f2cac6 100644 --- a/pkg/cfn/builder/cluster_test.go +++ b/pkg/cfn/builder/cluster_test.go @@ -167,8 +167,8 @@ var _ = Describe("Cluster Template Builder", func() { Expect(clusterTemplate.Resources).To(HaveKey("ControlPlaneSecurityGroup")) Expect(clusterTemplate.Resources).To(HaveKey("ClusterSharedNodeSecurityGroup")) Expect(clusterTemplate.Resources).To(HaveKey("IngressInterNodeGroupSG")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("IngressDefaultClusterToNodeSG")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("IngressNodeToDefaultClusterSG")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("IngressDefaultClusterToNodeSG")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("IngressNodeToDefaultClusterSG")) Expect(clusterTemplate.Resources).To(HaveKey("ClusterSharedNodeSecurityGroup")) }) @@ -253,11 +253,11 @@ var _ = Describe("Cluster Template Builder", func() { }) It("should not add various shared security group resources", func() { - Expect(clusterTemplate.Resources).ToNot(HaveKey("ClusterSharedNodeSecurityGroup")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("IngressInterNodeGroupSG")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("IngressDefaultClusterToNodeSG")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("IngressNodeToDefaultClusterSG")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("ClusterSharedNodeSecurityGroup")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("ClusterSharedNodeSecurityGroup")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("IngressInterNodeGroupSG")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("IngressDefaultClusterToNodeSG")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("IngressNodeToDefaultClusterSG")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("ClusterSharedNodeSecurityGroup")) }) }) @@ -267,7 +267,7 @@ var _ = Describe("Cluster Template Builder", func() { }) It("should not add the ControlPlaneSecurityGroup resources", func() { - Expect(clusterTemplate.Resources).ToNot(HaveKey("ControlPlaneSecurityGroup")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("ControlPlaneSecurityGroup")) Expect(clusterTemplate.Resources["ControlPlane"].Properties.ResourcesVpcConfig.SecurityGroupIds).To(ContainElement("foo")) }) }) @@ -300,9 +300,9 @@ var _ = Describe("Cluster Template Builder", func() { }) It("should not add other iam resources", func() { - Expect(clusterTemplate.Resources).ToNot(HaveKey("ServiceRole")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("PolicyELBPermissions")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("PolicyCloudWatchMetrics")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("ServiceRole")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("PolicyELBPermissions")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("PolicyCloudWatchMetrics")) }) }) @@ -358,7 +358,7 @@ var _ = Describe("Cluster Template Builder", func() { }) It("should add partition mappings", func() { - Expect(clusterTemplate.Mappings["ServicePrincipalPartitionMap"]).ToNot(BeNil()) + Expect(clusterTemplate.Mappings["ServicePrincipalPartitionMap"]).NotTo(BeNil()) }) Context("when private networking is set", func() { @@ -382,13 +382,13 @@ var _ = Describe("Cluster Template Builder", func() { }) It("no nat resources are set", func() { - Expect(clusterTemplate.Resources).ToNot(HaveKey("NATIP")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("NATGateway")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("NATIP")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("NATGateway")) }) It("does not set public networking", func() { - Expect(clusterTemplate.Resources).ToNot(HaveKey("PublicSubnetRoute")) - Expect(clusterTemplate.Resources).ToNot(HaveKey("PublicSubnetRoute")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("PublicSubnetRoute")) + Expect(clusterTemplate.Resources).NotTo(HaveKey("PublicSubnetRoute")) Expect(clusterTemplate.Resources).To(HaveKey(ContainSubstring("PrivateRouteTable"))) }) }) diff --git a/pkg/cfn/builder/iam_test.go b/pkg/cfn/builder/iam_test.go index 830d0b7bac..9c2284ac45 100644 --- a/pkg/cfn/builder/iam_test.go +++ b/pkg/cfn/builder/iam_test.go @@ -22,7 +22,7 @@ var _ = Describe("template builder for IAM", func() { BeforeEach(func() { oidc, err = iamoidc.NewOpenIDConnectManager(nil, "456123987123", "https://oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E", "aws", nil) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) oidc.ProviderARN = "arn:aws:iam::456123987123:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E" @@ -101,7 +101,7 @@ var _ = Describe("template builder for IAM", func() { Expect(t).To(HaveResource("Role1", "AWS::IAM::Role")) Expect(t).To(HaveResource("Policy1", "AWS::IAM::Policy")) - Expect(t).ToNot(HaveResourceWithProperties("Role1", "ManagedPolicyArns")) + Expect(t).NotTo(HaveResourceWithProperties("Role1", "ManagedPolicyArns")) Expect(t).To(HaveResourceWithPropertyValue("Role1", "AssumeRolePolicyDocument", expectedServiceAccountAssumeRolePolicyDocument)) Expect(t).To(HaveResourceWithPropertyValue("Policy1", "PolicyName", `{ "Fn::Sub": "${AWS::StackName}-Policy1" }`)) @@ -326,7 +326,7 @@ var _ = Describe("template builder for IAM", func() { BeforeEach(func() { oidc, err = iamoidc.NewOpenIDConnectManager(nil, "456123987123", "https://oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E", "aws", nil) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) oidc.ProviderARN = "arn:aws:iam::456123987123:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/A39A2842863C47208955D753DE205E6E" @@ -395,7 +395,7 @@ var _ = Describe("template builder for IAM", func() { Expect(t).To(HaveResource("Policy1", "AWS::IAM::Policy")) - Expect(t).ToNot(HaveResourceWithProperties("Role1", "ManagedPolicyArns")) + Expect(t).NotTo(HaveResourceWithProperties("Role1", "ManagedPolicyArns")) Expect(t).To(HaveResourceWithPropertyValue("Role1", "AssumeRolePolicyDocument", expectedAssumeRolePolicyDocument)) Expect(t).To(HaveResourceWithPropertyValue("Policy1", "PolicyName", `{ "Fn::Sub": "${AWS::StackName}-Policy1" }`)) @@ -422,7 +422,7 @@ func appendServiceAccountToClusterConfig(cfg *api.ClusterConfig, serviceAccount api.SetClusterConfigDefaults(cfg) err := api.ValidateClusterConfig(cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } const expectedServiceAccountAssumeRolePolicyDocument = `{ diff --git a/pkg/cfn/builder/managed_launch_template_test.go b/pkg/cfn/builder/managed_launch_template_test.go index 8be5098e4f..ca69084b35 100644 --- a/pkg/cfn/builder/managed_launch_template_test.go +++ b/pkg/cfn/builder/managed_launch_template_test.go @@ -4,7 +4,7 @@ import ( "encoding/base64" "encoding/json" "fmt" - "io/ioutil" + "os" "path" "github.com/aws/aws-sdk-go/aws" @@ -66,19 +66,19 @@ var _ = Describe("ManagedNodeGroup builder", func() { return } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) bytes, err := stack.RenderJSON() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) template, err := goformation.ParseJSON(bytes) - Expect(err).ToNot(HaveOccurred()) - Expect(template).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(template).NotTo(BeNil()) actual, err := json.Marshal(template.Resources) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) - expected, err := ioutil.ReadFile(path.Join("testdata", "launch_template", m.resourcesFilename)) - Expect(err).ToNot(HaveOccurred()) + expected, err := os.ReadFile(path.Join("testdata", "launch_template", m.resourcesFilename)) + Expect(err).NotTo(HaveOccurred()) Expect(actual).To(MatchOrderedJSON(expected, WithUnorderedListKeys("Tags"))) }, diff --git a/pkg/cfn/builder/managed_nodegroup.go b/pkg/cfn/builder/managed_nodegroup.go index fe50c7f915..5fc8a8744d 100644 --- a/pkg/cfn/builder/managed_nodegroup.go +++ b/pkg/cfn/builder/managed_nodegroup.go @@ -14,7 +14,7 @@ import ( api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/nodebootstrap" - "github.com/weaveworks/eksctl/pkg/utils" + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" "github.com/weaveworks/eksctl/pkg/vpc" ) @@ -127,7 +127,7 @@ func (m *ManagedNodeGroupResourceSet) AddAllResources() error { instanceTypes := m.nodeGroup.InstanceTypeList() makeAMIType := func() *gfnt.Value { - return gfnt.NewString(getAMIType(selectManagedInstanceType(m.nodeGroup))) + return gfnt.NewString(getAMIType(m.nodeGroup, selectManagedInstanceType(m.nodeGroup))) } var launchTemplate *gfneks.Nodegroup_LaunchTemplateSpecification @@ -152,9 +152,10 @@ func (m *ManagedNodeGroupResourceSet) AddAllResources() error { if launchTemplateData.InstanceType == nil { managedResource.AmiType = makeAMIType() } else { - managedResource.AmiType = gfnt.NewString(getAMIType(*launchTemplateData.InstanceType)) + managedResource.AmiType = gfnt.NewString(getAMIType(m.nodeGroup, *launchTemplateData.InstanceType)) } } + if launchTemplateData.InstanceType == nil { managedResource.InstanceTypes = gfnt.NewStringSlice(instanceTypes...) } @@ -215,7 +216,7 @@ func mapTaints(taints []api.NodeGroupTaint) ([]*gfneks.Nodegroup_Taints, error) func selectManagedInstanceType(ng *api.ManagedNodeGroup) string { if len(ng.InstanceTypes) > 0 { for _, instanceType := range ng.InstanceTypes { - if utils.IsGPUInstanceType(instanceType) { + if instanceutils.IsGPUInstanceType(instanceType) { return instanceType } } @@ -259,14 +260,36 @@ func validateLaunchTemplate(launchTemplateData *ec2.ResponseLaunchTemplateData, return nil } -func getAMIType(instanceType string) string { - if utils.IsGPUInstanceType(instanceType) { - return eks.AMITypesAl2X8664Gpu +func getAMIType(ng *api.ManagedNodeGroup, instanceType string) string { + amiTypeMapping := map[string]struct { + X86_64 string + GPU string + ARM string + }{ + api.NodeImageFamilyAmazonLinux2: { + X86_64: eks.AMITypesAl2X8664, + GPU: eks.AMITypesAl2X8664Gpu, + ARM: eks.AMITypesAl2Arm64, + }, + api.NodeImageFamilyBottlerocket: { + X86_64: eks.AMITypesBottlerocketX8664, + ARM: eks.AMITypesBottlerocketArm64, + }, + } + + amiType, ok := amiTypeMapping[ng.AMIFamily] + if !ok { + return eks.AMITypesCustom } - if utils.IsARMInstanceType(instanceType) { - return eks.AMITypesAl2Arm64 + + switch { + case instanceutils.IsGPUInstanceType(instanceType): + return amiType.GPU + case instanceutils.IsARMInstanceType(instanceType): + return amiType.ARM + default: + return amiType.X86_64 } - return eks.AMITypesAl2X8664 } // RenderJSON implements the ResourceSet interface diff --git a/pkg/cfn/builder/managed_nodegroup_ami_type_test.go b/pkg/cfn/builder/managed_nodegroup_ami_type_test.go new file mode 100644 index 0000000000..4a0b30309a --- /dev/null +++ b/pkg/cfn/builder/managed_nodegroup_ami_type_test.go @@ -0,0 +1,144 @@ +package builder + +import ( + . "github.com/onsi/ginkgo/extensions/table" + . "github.com/onsi/gomega" + api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/nodebootstrap" + "github.com/weaveworks/eksctl/pkg/testutils/mockprovider" + vpcfakes "github.com/weaveworks/eksctl/pkg/vpc/fakes" + "github.com/weaveworks/goformation/v4" + gfneks "github.com/weaveworks/goformation/v4/cloudformation/eks" +) + +type amiTypeEntry struct { + nodeGroup *api.ManagedNodeGroup + + expectedAMIType string +} + +var _ = DescribeTable("Managed Nodegroup AMI type", func(e amiTypeEntry) { + clusterConfig := api.NewClusterConfig() + clusterConfig.Status = &api.ClusterStatus{ + Endpoint: "https://test.com", + } + api.SetManagedNodeGroupDefaults(e.nodeGroup, clusterConfig.Metadata) + p := mockprovider.NewMockProvider() + fakeVPCImporter := new(vpcfakes.FakeImporter) + bootstrapper := nodebootstrap.NewManagedBootstrapper(clusterConfig, e.nodeGroup) + stack := NewManagedNodeGroup(p.EC2(), clusterConfig, e.nodeGroup, nil, bootstrapper, false, fakeVPCImporter) + + Expect(stack.AddAllResources()).To(Succeed()) + bytes, err := stack.RenderJSON() + Expect(err).NotTo(HaveOccurred()) + + template, err := goformation.ParseJSON(bytes) + Expect(err).NotTo(HaveOccurred()) + ngResource, ok := template.Resources["ManagedNodeGroup"] + Expect(ok).To(BeTrue()) + ng, ok := ngResource.(*gfneks.Nodegroup) + Expect(ok).To(BeTrue()) + Expect(ng.AmiType.String()).To(Equal(e.expectedAMIType)) +}, + Entry("default AMI type", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + }, + }, + expectedAMIType: "AL2_x86_64", + }), + + Entry("AL2 AMI type", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + AMIFamily: api.NodeImageFamilyAmazonLinux2, + }, + }, + expectedAMIType: "AL2_x86_64", + }), + + Entry("AMI type", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + }, + }, + expectedAMIType: "AL2_x86_64", + }), + + Entry("default GPU instance type", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + InstanceType: "p2.xlarge", + }, + }, + expectedAMIType: "AL2_x86_64_GPU", + }), + + Entry("AL2 GPU instance type", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + AMIFamily: api.NodeImageFamilyAmazonLinux2, + InstanceType: "p2.xlarge", + }, + }, + expectedAMIType: "AL2_x86_64_GPU", + }), + + Entry("AL2 ARM instance type", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + AMIFamily: api.NodeImageFamilyAmazonLinux2, + InstanceType: "a1.2xlarge", + }, + }, + expectedAMIType: "AL2_ARM_64", + }), + + Entry("Bottlerocket AMI type", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + AMIFamily: api.NodeImageFamilyBottlerocket, + }, + }, + expectedAMIType: "BOTTLEROCKET_x86_64", + }), + + Entry("Bottlerocket on ARM", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + AMIFamily: api.NodeImageFamilyBottlerocket, + InstanceType: "a1.2xlarge", + }, + }, + expectedAMIType: "BOTTLEROCKET_ARM_64", + }), + + Entry("Bottlerocket on ARM", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + AMIFamily: api.NodeImageFamilyBottlerocket, + InstanceType: "a1.2xlarge", + }, + }, + expectedAMIType: "BOTTLEROCKET_ARM_64", + }), + + Entry("non-native Ubuntu", amiTypeEntry{ + nodeGroup: &api.ManagedNodeGroup{ + NodeGroupBase: &api.NodeGroupBase{ + Name: "test", + AMIFamily: api.NodeImageFamilyUbuntu2004, + }, + }, + expectedAMIType: "CUSTOM", + }), +) diff --git a/pkg/cfn/builder/nodegroup_test.go b/pkg/cfn/builder/nodegroup_test.go index 83d029e25a..0128b197ac 100644 --- a/pkg/cfn/builder/nodegroup_test.go +++ b/pkg/cfn/builder/nodegroup_test.go @@ -65,7 +65,7 @@ var _ = Describe("Unmanaged NodeGroup Template Builder", func() { }) It("should add partition mappings", func() { - Expect(ngTemplate.Mappings["ServicePrincipalPartitionMap"]).ToNot(BeNil()) + Expect(ngTemplate.Mappings["ServicePrincipalPartitionMap"]).NotTo(BeNil()) }) It("should add outputs", func() { @@ -211,7 +211,7 @@ var _ = Describe("Unmanaged NodeGroup Template Builder", func() { It("creates a new role", func() { Expect(ngTemplate.Resources).To(HaveKey("NodeInstanceRole")) Expect(ngTemplate.Resources["NodeInstanceRole"].Properties.Path).To(Equal("/")) - Expect(ngTemplate.Resources["NodeInstanceRole"].Properties.AssumeRolePolicyDocument).ToNot(BeNil()) + Expect(ngTemplate.Resources["NodeInstanceRole"].Properties.AssumeRolePolicyDocument).NotTo(BeNil()) }) It("sets the correct outputs", func() { @@ -295,7 +295,7 @@ var _ = Describe("Unmanaged NodeGroup Template Builder", func() { It("does not add the AmazonEKS_CNI_Policy", func() { Expect(ngTemplate.Resources["NodeInstanceRole"].Properties.ManagedPolicyArns).To(HaveLen(3)) - Expect(ngTemplate.Resources["NodeInstanceRole"].Properties.ManagedPolicyArns).ToNot(ContainElement(makePolicyARNRef("AmazonEKS_CNI_Policy"))) + Expect(ngTemplate.Resources["NodeInstanceRole"].Properties.ManagedPolicyArns).NotTo(ContainElement(makePolicyARNRef("AmazonEKS_CNI_Policy"))) }) }) }) @@ -482,7 +482,7 @@ var _ = Describe("Unmanaged NodeGroup Template Builder", func() { }) It("no sg resources are added", func() { - Expect(ngTemplate.Resources).ToNot(HaveKey("SG")) + Expect(ngTemplate.Resources).NotTo(HaveKey("SG")) }) }) diff --git a/pkg/cfn/builder/vpc_endpoint_test.go b/pkg/cfn/builder/vpc_endpoint_test.go index e7028abddd..6ade227334 100644 --- a/pkg/cfn/builder/vpc_endpoint_test.go +++ b/pkg/cfn/builder/vpc_endpoint_test.go @@ -3,7 +3,7 @@ package builder import ( "encoding/json" "fmt" - "io/ioutil" + "os" "sort" "github.com/aws/aws-sdk-go/aws" @@ -62,7 +62,7 @@ var _ = Describe("VPC Endpoint Builder", func() { return } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) if vc.clusterConfig.PrivateCluster.Enabled { vpcEndpointResourceSet := NewVPCEndpointResourceSet(provider.EC2(), provider.Region(), rs, vc.clusterConfig, vpcID, subnetDetails.Private, gfnt.NewString("sg-test")) Expect(vpcEndpointResourceSet.AddResources()).To(Succeed()) @@ -79,10 +79,10 @@ var _ = Describe("VPC Endpoint Builder", func() { rs.template.Outputs = nil resourceJSON, err := rs.template.JSON() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) - expectedJSON, err := ioutil.ReadFile("testdata/" + vc.expectedFile) - Expect(err).ToNot(HaveOccurred()) + expectedJSON, err := os.ReadFile("testdata/" + vc.expectedFile) + Expect(err).NotTo(HaveOccurred()) Expect(resourceJSON).To(MatchJSON(expectedJSON)) }, Entry("Standard cluster", vpcResourceSetCase{ diff --git a/pkg/cfn/builder/vpc_ipv4_test.go b/pkg/cfn/builder/vpc_ipv4_test.go index 8e2b698523..6cf5ddfcd1 100644 --- a/pkg/cfn/builder/vpc_ipv4_test.go +++ b/pkg/cfn/builder/vpc_ipv4_test.go @@ -240,10 +240,10 @@ var _ = Describe("VPC Template Builder", func() { }) It("adds HA nat gateway resources to the resource set", func() { - Expect(vpcTemplate.Resources).ToNot(HaveKey("NATIP")) - Expect(vpcTemplate.Resources).ToNot(HaveKey("NATGateway")) - Expect(vpcTemplate.Resources).ToNot(HaveKey("NATPrivateSubnetRouteUSWEST2A")) - Expect(vpcTemplate.Resources).ToNot(HaveKey("NATPrivateSubnetRouteUSWEST2B")) + Expect(vpcTemplate.Resources).NotTo(HaveKey("NATIP")) + Expect(vpcTemplate.Resources).NotTo(HaveKey("NATGateway")) + Expect(vpcTemplate.Resources).NotTo(HaveKey("NATPrivateSubnetRouteUSWEST2A")) + Expect(vpcTemplate.Resources).NotTo(HaveKey("NATPrivateSubnetRouteUSWEST2B")) Expect(vpcTemplate.Resources).To(HaveKey(privRouteTableA)) Expect(vpcTemplate.Resources[privRouteTableA].Properties.VpcID).To(Equal(makeRef(vpcResourceKey))) @@ -421,12 +421,12 @@ var _ = Describe("VPC Template Builder", func() { }) It("disables the nat", func() { - Expect(vpcTemplate.Resources).ToNot(HaveKey("NATIP")) - Expect(vpcTemplate.Resources).ToNot(HaveKey("NATGateway")) + Expect(vpcTemplate.Resources).NotTo(HaveKey("NATIP")) + Expect(vpcTemplate.Resources).NotTo(HaveKey("NATGateway")) }) It("does not add an internet gateway", func() { - Expect(vpcTemplate.Resources).ToNot(HaveKey(igwKey)) + Expect(vpcTemplate.Resources).NotTo(HaveKey(igwKey)) }) It("does not set public subnet resources", func() { diff --git a/pkg/cfn/manager/api.go b/pkg/cfn/manager/api.go index ae177e89eb..f25a723354 100644 --- a/pkg/cfn/manager/api.go +++ b/pkg/cfn/manager/api.go @@ -6,25 +6,22 @@ import ( "regexp" "time" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface" - "github.com/aws/aws-sdk-go/service/cloudtrail/cloudtrailiface" - "github.com/weaveworks/eksctl/pkg/cfn/waiter" - + "github.com/aws/aws-sdk-go/service/cloudformation" "github.com/aws/aws-sdk-go/service/cloudformation/cloudformationiface" + "github.com/aws/aws-sdk-go/service/cloudtrail" + "github.com/aws/aws-sdk-go/service/cloudtrail/cloudtrailiface" "github.com/aws/aws-sdk-go/service/ec2/ec2iface" "github.com/aws/aws-sdk-go/service/eks/eksiface" "github.com/aws/aws-sdk-go/service/iam/iamiface" - - "github.com/weaveworks/eksctl/pkg/version" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/cloudformation" - "github.com/aws/aws-sdk-go/service/cloudtrail" "github.com/kris-nova/logger" "github.com/pkg/errors" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/cfn/builder" + "github.com/weaveworks/eksctl/pkg/cfn/waiter" + "github.com/weaveworks/eksctl/pkg/version" ) const ( @@ -242,33 +239,36 @@ func (c *StackCollection) createStackRequest(stackName string, resourceSet build } // UpdateStack will update a CloudFormation stack by creating and executing a ChangeSet -func (c *StackCollection) UpdateStack(stackName, changeSetName, description string, templateData TemplateData, parameters map[string]string) error { - logger.Info(description) - i := &Stack{StackName: &stackName} +func (c *StackCollection) UpdateStack(options UpdateStackOptions) error { + logger.Info(options.Description) + i := &Stack{StackName: &options.StackName} // Read existing tags s, err := c.DescribeStack(i) if err != nil { return err } - if err := c.doCreateChangeSetRequest(stackName, changeSetName, description, templateData, parameters, s.Capabilities, s.Tags); err != nil { + if err := c.doCreateChangeSetRequest(options.StackName, options.ChangeSetName, options.Description, options.TemplateData, options.Parameters, s.Capabilities, s.Tags); err != nil { return err } - if err := c.doWaitUntilChangeSetIsCreated(i, changeSetName); err != nil { + if err := c.doWaitUntilChangeSetIsCreated(i, options.ChangeSetName); err != nil { if _, ok := err.(*noChangeError); ok { return nil } return err } - changeSet, err := c.DescribeStackChangeSet(i, changeSetName) + changeSet, err := c.DescribeStackChangeSet(i, options.ChangeSetName) if err != nil { return err } logger.Debug("changes = %#v", changeSet.Changes) - if err := c.doExecuteChangeSet(stackName, changeSetName); err != nil { - logger.Warning("error executing Cloudformation changeSet %s in stack %s. Check the Cloudformation console for further details", changeSetName, stackName) + if err := c.doExecuteChangeSet(options.StackName, options.ChangeSetName); err != nil { + logger.Warning("error executing Cloudformation changeSet %s in stack %s. Check the Cloudformation console for further details", options.ChangeSetName, options.StackName) return err } - return c.doWaitUntilStackIsUpdated(i) + if options.Wait { + return c.doWaitUntilStackIsUpdated(i) + } + return nil } // DescribeStack describes a cloudformation stack. @@ -307,9 +307,15 @@ func (c *StackCollection) GetManagedNodeGroupTemplate(nodeGroupName string) (str } // UpdateNodeGroupStack updates the nodegroup stack with the specified template -func (c *StackCollection) UpdateNodeGroupStack(nodeGroupName, template string) error { +func (c *StackCollection) UpdateNodeGroupStack(nodeGroupName, template string, wait bool) error { stackName := c.makeNodeGroupStackName(nodeGroupName) - return c.UpdateStack(stackName, c.MakeChangeSetName("update-nodegroup"), "updating nodegroup stack", TemplateBody(template), nil) + return c.UpdateStack(UpdateStackOptions{ + StackName: stackName, + ChangeSetName: c.MakeChangeSetName("update-nodegroup"), + Description: "updating nodegroup stack", + TemplateData: TemplateBody(template), + Wait: wait, + }) } // ListStacksMatching gets all of CloudFormation stacks with names matching nameRegex. @@ -555,30 +561,35 @@ func (c *StackCollection) DescribeStacks() ([]*Stack, error) { return stacks, nil } -func (c *StackCollection) HasClusterStack() (bool, error) { +func (c *StackCollection) GetClusterStackIfExists() (*Stack, error) { clusterStackNames, err := c.ListClusterStackNames() if err != nil { - return false, err + return nil, err } - return c.HasClusterStackUsingCachedList(clusterStackNames) + return c.getClusterStackUsingCachedList(clusterStackNames) } func (c *StackCollection) HasClusterStackUsingCachedList(clusterStackNames []string) (bool, error) { + stack, err := c.getClusterStackUsingCachedList(clusterStackNames) + return stack != nil, err +} + +func (c *StackCollection) getClusterStackUsingCachedList(clusterStackNames []string) (*Stack, error) { clusterStackName := c.MakeClusterStackName() for _, stack := range clusterStackNames { if stack == clusterStackName { stack, err := c.DescribeStack(&cloudformation.Stack{StackName: &clusterStackName}) if err != nil { - return false, err + return nil, err } for _, tag := range stack.Tags { if matchesClusterName(*tag.Key, *tag.Value, c.spec.Metadata.Name) { - return true, nil + return stack, nil } } } } - return false, nil + return nil, nil } // DescribeStackEvents describes the events that have occurred on the stack diff --git a/pkg/cfn/manager/api_test.go b/pkg/cfn/manager/api_test.go index 22be024bc6..c05c5c0925 100644 --- a/pkg/cfn/manager/api_test.go +++ b/pkg/cfn/manager/api_test.go @@ -46,8 +46,14 @@ var _ = Describe("StackCollection", func() { p.MockCloudFormation().On("DescribeChangeSet", mock.Anything).Return(describeChangeSetNoChange, nil) sm := NewStackCollection(p, api.NewClusterConfig()) - err := sm.UpdateStack(stackName, changeSetName, "description", TemplateBody(""), nil) - Expect(err).ToNot(HaveOccurred()) + err := sm.UpdateStack(UpdateStackOptions{ + StackName: stackName, + ChangeSetName: changeSetName, + Description: "description", + TemplateData: TemplateBody(""), + Wait: true, + }) + Expect(err).NotTo(HaveOccurred()) }) }) @@ -105,8 +111,14 @@ var _ = Describe("StackCollection", func() { spec.Metadata.Name = clusterName spec.Metadata.Tags = map[string]string{"meta": "data"} sm := NewStackCollection(p, spec) - err := sm.UpdateStack(stackName, changeSetName, "description", TemplateBody(""), nil) - Expect(err).ToNot(HaveOccurred()) + err := sm.UpdateStack(UpdateStackOptions{ + StackName: stackName, + ChangeSetName: changeSetName, + Description: "description", + TemplateData: TemplateBody(""), + Wait: true, + }) + Expect(err).NotTo(HaveOccurred()) // Second is CreateChangeSet() call which we are interested in args := p.MockCloudFormation().Calls[1].Arguments.Get(0) @@ -118,4 +130,64 @@ var _ = Describe("StackCollection", func() { // Metadata tag Expect(createChangeSetInput.Tags).To(ContainElement(&cfn.Tag{Key: aws.String("meta"), Value: aws.String("data")})) }) + When("wait is set to false", func() { + It("will skip the last wait sequence", func() { + clusterName := "cluster" + stackName := "eksctl-stack" + changeSetName := "eksctl-changeset" + describeInput := &cfn.DescribeStacksInput{StackName: &stackName} + existingTag := &cfn.Tag{ + Key: aws.String("existing"), + Value: aws.String("tag"), + } + describeOutput := &cfn.DescribeStacksOutput{Stacks: []*cfn.Stack{{ + StackName: &stackName, + StackStatus: aws.String(cfn.StackStatusCreateComplete), + Tags: []*cfn.Tag{existingTag}, + }}} + describeChangeSetCreateCompleteOutput := &cfn.DescribeChangeSetOutput{ + StackName: &stackName, + ChangeSetName: &changeSetName, + Status: aws.String(cfn.ChangeSetStatusCreateComplete), + } + executeChangeSetInput := &cfn.ExecuteChangeSetInput{ + ChangeSetName: &changeSetName, + StackName: &stackName, + } + + p := mockprovider.NewMockProvider() + p.MockCloudFormation().On("DescribeStacks", describeInput).Return(describeOutput, nil) + p.MockCloudFormation().On("CreateChangeSet", mock.Anything).Return(nil, nil) + req := awstesting.NewClient(nil).NewRequest(&request.Operation{Name: "Operation"}, nil, describeChangeSetCreateCompleteOutput) + p.MockCloudFormation().On("DescribeChangeSetRequest", mock.Anything).Return(req, describeChangeSetCreateCompleteOutput) + p.MockCloudFormation().On("DescribeChangeSet", mock.Anything).Return(describeChangeSetCreateCompleteOutput, nil) + p.MockCloudFormation().On("ExecuteChangeSet", executeChangeSetInput).Return(nil, nil) + // For the future, this is the call we do not expect to happen, and this is the difference compared to the + // above test case. + // p.MockCloudFormation().On("DescribeStacksRequest", mock.Anything).Return(req, describeStacksUpdateCompleteOutput) + + spec := api.NewClusterConfig() + spec.Metadata.Name = clusterName + spec.Metadata.Tags = map[string]string{"meta": "data"} + sm := NewStackCollection(p, spec) + err := sm.UpdateStack(UpdateStackOptions{ + StackName: stackName, + ChangeSetName: changeSetName, + Description: "description", + TemplateData: TemplateBody(""), + Wait: false, + }) + Expect(err).NotTo(HaveOccurred()) + + // Second is CreateChangeSet() call which we are interested in + args := p.MockCloudFormation().Calls[1].Arguments.Get(0) + createChangeSetInput := args.(*cfn.CreateChangeSetInput) + // Existing tag + Expect(createChangeSetInput.Tags).To(ContainElement(existingTag)) + // Auto-populated tag + Expect(createChangeSetInput.Tags).To(ContainElement(&cfn.Tag{Key: aws.String(api.ClusterNameTag), Value: &clusterName})) + // Metadata tag + Expect(createChangeSetInput.Tags).To(ContainElement(&cfn.Tag{Key: aws.String("meta"), Value: aws.String("data")})) + }) + }) }) diff --git a/pkg/cfn/manager/cluster.go b/pkg/cfn/manager/cluster.go index ad3b3b392b..03e52e66ac 100644 --- a/pkg/cfn/manager/cluster.go +++ b/pkg/cfn/manager/cluster.go @@ -192,7 +192,13 @@ func (c *StackCollection) AppendNewClusterStackResource(plan, supportsManagedNod logger.Info("(plan) %s", describeUpdate) return true, nil } - return true, c.UpdateStack(name, c.MakeChangeSetName("update-cluster"), describeUpdate, TemplateBody(currentTemplate), nil) + return true, c.UpdateStack(UpdateStackOptions{ + StackName: name, + ChangeSetName: c.MakeChangeSetName("update-cluster"), + Description: describeUpdate, + TemplateData: TemplateBody(currentTemplate), + Wait: true, + }) } func (c *StackCollection) importServiceRoleARN(resources gjson.Result) error { diff --git a/pkg/cfn/manager/compat.go b/pkg/cfn/manager/compat.go index b6c79fd3ee..978c0e197d 100644 --- a/pkg/cfn/manager/compat.go +++ b/pkg/cfn/manager/compat.go @@ -129,7 +129,13 @@ func (c *StackCollection) EnsureMapPublicIPOnLaunchEnabled() error { } } description := fmt.Sprintf("update public subnets %q with property MapPublicIpOnLaunch enabled", publicSubnetsNames) - if err := c.UpdateStack(stackName, c.MakeChangeSetName("update-subnets"), description, TemplateBody(currentTemplate), nil); err != nil { + if err := c.UpdateStack(UpdateStackOptions{ + StackName: stackName, + ChangeSetName: c.MakeChangeSetName("update-subnets"), + Description: description, + TemplateData: TemplateBody(currentTemplate), + Wait: true, + }); err != nil { return errors.Wrap(err, "unable to update subnets") } return nil diff --git a/pkg/cfn/manager/fakes/fake_stack_manager.go b/pkg/cfn/manager/fakes/fake_stack_manager.go index 4a5b102d9c..b8a13a7889 100644 --- a/pkg/cfn/manager/fakes/fake_stack_manager.go +++ b/pkg/cfn/manager/fakes/fake_stack_manager.go @@ -280,6 +280,18 @@ type FakeStackManager struct { result1 string result2 error } + GetClusterStackIfExistsStub func() (*cloudformation.Stack, error) + getClusterStackIfExistsMutex sync.RWMutex + getClusterStackIfExistsArgsForCall []struct { + } + getClusterStackIfExistsReturns struct { + result1 *cloudformation.Stack + result2 error + } + getClusterStackIfExistsReturnsOnCall map[int]struct { + result1 *cloudformation.Stack + result2 error + } GetFargateStackStub func() (*cloudformation.Stack, error) getFargateStackMutex sync.RWMutex getFargateStackArgsForCall []struct { @@ -390,18 +402,6 @@ type FakeStackManager struct { result1 []*manager.NodeGroupSummary result2 error } - HasClusterStackStub func() (bool, error) - hasClusterStackMutex sync.RWMutex - hasClusterStackArgsForCall []struct { - } - hasClusterStackReturns struct { - result1 bool - result2 error - } - hasClusterStackReturnsOnCall map[int]struct { - result1 bool - result2 error - } HasClusterStackUsingCachedListStub func([]string) (bool, error) hasClusterStackUsingCachedListMutex sync.RWMutex hasClusterStackUsingCachedListArgsForCall []struct { @@ -695,11 +695,12 @@ type FakeStackManager struct { stackStatusIsNotTransitionalReturnsOnCall map[int]struct { result1 bool } - UpdateNodeGroupStackStub func(string, string) error + UpdateNodeGroupStackStub func(string, string, bool) error updateNodeGroupStackMutex sync.RWMutex updateNodeGroupStackArgsForCall []struct { arg1 string arg2 string + arg3 bool } updateNodeGroupStackReturns struct { result1 error @@ -707,14 +708,10 @@ type FakeStackManager struct { updateNodeGroupStackReturnsOnCall map[int]struct { result1 error } - UpdateStackStub func(string, string, string, manager.TemplateData, map[string]string) error + UpdateStackStub func(manager.UpdateStackOptions) error updateStackMutex sync.RWMutex updateStackArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 manager.TemplateData - arg5 map[string]string + arg1 manager.UpdateStackOptions } updateStackReturns struct { result1 error @@ -1997,6 +1994,62 @@ func (fake *FakeStackManager) GetAutoScalingGroupNameReturnsOnCall(i int, result }{result1, result2} } +func (fake *FakeStackManager) GetClusterStackIfExists() (*cloudformation.Stack, error) { + fake.getClusterStackIfExistsMutex.Lock() + ret, specificReturn := fake.getClusterStackIfExistsReturnsOnCall[len(fake.getClusterStackIfExistsArgsForCall)] + fake.getClusterStackIfExistsArgsForCall = append(fake.getClusterStackIfExistsArgsForCall, struct { + }{}) + stub := fake.GetClusterStackIfExistsStub + fakeReturns := fake.getClusterStackIfExistsReturns + fake.recordInvocation("GetClusterStackIfExists", []interface{}{}) + fake.getClusterStackIfExistsMutex.Unlock() + if stub != nil { + return stub() + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeStackManager) GetClusterStackIfExistsCallCount() int { + fake.getClusterStackIfExistsMutex.RLock() + defer fake.getClusterStackIfExistsMutex.RUnlock() + return len(fake.getClusterStackIfExistsArgsForCall) +} + +func (fake *FakeStackManager) GetClusterStackIfExistsCalls(stub func() (*cloudformation.Stack, error)) { + fake.getClusterStackIfExistsMutex.Lock() + defer fake.getClusterStackIfExistsMutex.Unlock() + fake.GetClusterStackIfExistsStub = stub +} + +func (fake *FakeStackManager) GetClusterStackIfExistsReturns(result1 *cloudformation.Stack, result2 error) { + fake.getClusterStackIfExistsMutex.Lock() + defer fake.getClusterStackIfExistsMutex.Unlock() + fake.GetClusterStackIfExistsStub = nil + fake.getClusterStackIfExistsReturns = struct { + result1 *cloudformation.Stack + result2 error + }{result1, result2} +} + +func (fake *FakeStackManager) GetClusterStackIfExistsReturnsOnCall(i int, result1 *cloudformation.Stack, result2 error) { + fake.getClusterStackIfExistsMutex.Lock() + defer fake.getClusterStackIfExistsMutex.Unlock() + fake.GetClusterStackIfExistsStub = nil + if fake.getClusterStackIfExistsReturnsOnCall == nil { + fake.getClusterStackIfExistsReturnsOnCall = make(map[int]struct { + result1 *cloudformation.Stack + result2 error + }) + } + fake.getClusterStackIfExistsReturnsOnCall[i] = struct { + result1 *cloudformation.Stack + result2 error + }{result1, result2} +} + func (fake *FakeStackManager) GetFargateStack() (*cloudformation.Stack, error) { fake.getFargateStackMutex.Lock() ret, specificReturn := fake.getFargateStackReturnsOnCall[len(fake.getFargateStackArgsForCall)] @@ -2543,62 +2596,6 @@ func (fake *FakeStackManager) GetUnmanagedNodeGroupSummariesReturnsOnCall(i int, }{result1, result2} } -func (fake *FakeStackManager) HasClusterStack() (bool, error) { - fake.hasClusterStackMutex.Lock() - ret, specificReturn := fake.hasClusterStackReturnsOnCall[len(fake.hasClusterStackArgsForCall)] - fake.hasClusterStackArgsForCall = append(fake.hasClusterStackArgsForCall, struct { - }{}) - stub := fake.HasClusterStackStub - fakeReturns := fake.hasClusterStackReturns - fake.recordInvocation("HasClusterStack", []interface{}{}) - fake.hasClusterStackMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeStackManager) HasClusterStackCallCount() int { - fake.hasClusterStackMutex.RLock() - defer fake.hasClusterStackMutex.RUnlock() - return len(fake.hasClusterStackArgsForCall) -} - -func (fake *FakeStackManager) HasClusterStackCalls(stub func() (bool, error)) { - fake.hasClusterStackMutex.Lock() - defer fake.hasClusterStackMutex.Unlock() - fake.HasClusterStackStub = stub -} - -func (fake *FakeStackManager) HasClusterStackReturns(result1 bool, result2 error) { - fake.hasClusterStackMutex.Lock() - defer fake.hasClusterStackMutex.Unlock() - fake.HasClusterStackStub = nil - fake.hasClusterStackReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FakeStackManager) HasClusterStackReturnsOnCall(i int, result1 bool, result2 error) { - fake.hasClusterStackMutex.Lock() - defer fake.hasClusterStackMutex.Unlock() - fake.HasClusterStackStub = nil - if fake.hasClusterStackReturnsOnCall == nil { - fake.hasClusterStackReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.hasClusterStackReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - func (fake *FakeStackManager) HasClusterStackUsingCachedList(arg1 []string) (bool, error) { var arg1Copy []string if arg1 != nil { @@ -4047,19 +4044,20 @@ func (fake *FakeStackManager) StackStatusIsNotTransitionalReturnsOnCall(i int, r }{result1} } -func (fake *FakeStackManager) UpdateNodeGroupStack(arg1 string, arg2 string) error { +func (fake *FakeStackManager) UpdateNodeGroupStack(arg1 string, arg2 string, arg3 bool) error { fake.updateNodeGroupStackMutex.Lock() ret, specificReturn := fake.updateNodeGroupStackReturnsOnCall[len(fake.updateNodeGroupStackArgsForCall)] fake.updateNodeGroupStackArgsForCall = append(fake.updateNodeGroupStackArgsForCall, struct { arg1 string arg2 string - }{arg1, arg2}) + arg3 bool + }{arg1, arg2, arg3}) stub := fake.UpdateNodeGroupStackStub fakeReturns := fake.updateNodeGroupStackReturns - fake.recordInvocation("UpdateNodeGroupStack", []interface{}{arg1, arg2}) + fake.recordInvocation("UpdateNodeGroupStack", []interface{}{arg1, arg2, arg3}) fake.updateNodeGroupStackMutex.Unlock() if stub != nil { - return stub(arg1, arg2) + return stub(arg1, arg2, arg3) } if specificReturn { return ret.result1 @@ -4073,17 +4071,17 @@ func (fake *FakeStackManager) UpdateNodeGroupStackCallCount() int { return len(fake.updateNodeGroupStackArgsForCall) } -func (fake *FakeStackManager) UpdateNodeGroupStackCalls(stub func(string, string) error) { +func (fake *FakeStackManager) UpdateNodeGroupStackCalls(stub func(string, string, bool) error) { fake.updateNodeGroupStackMutex.Lock() defer fake.updateNodeGroupStackMutex.Unlock() fake.UpdateNodeGroupStackStub = stub } -func (fake *FakeStackManager) UpdateNodeGroupStackArgsForCall(i int) (string, string) { +func (fake *FakeStackManager) UpdateNodeGroupStackArgsForCall(i int) (string, string, bool) { fake.updateNodeGroupStackMutex.RLock() defer fake.updateNodeGroupStackMutex.RUnlock() argsForCall := fake.updateNodeGroupStackArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 } func (fake *FakeStackManager) UpdateNodeGroupStackReturns(result1 error) { @@ -4109,22 +4107,18 @@ func (fake *FakeStackManager) UpdateNodeGroupStackReturnsOnCall(i int, result1 e }{result1} } -func (fake *FakeStackManager) UpdateStack(arg1 string, arg2 string, arg3 string, arg4 manager.TemplateData, arg5 map[string]string) error { +func (fake *FakeStackManager) UpdateStack(arg1 manager.UpdateStackOptions) error { fake.updateStackMutex.Lock() ret, specificReturn := fake.updateStackReturnsOnCall[len(fake.updateStackArgsForCall)] fake.updateStackArgsForCall = append(fake.updateStackArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 manager.TemplateData - arg5 map[string]string - }{arg1, arg2, arg3, arg4, arg5}) + arg1 manager.UpdateStackOptions + }{arg1}) stub := fake.UpdateStackStub fakeReturns := fake.updateStackReturns - fake.recordInvocation("UpdateStack", []interface{}{arg1, arg2, arg3, arg4, arg5}) + fake.recordInvocation("UpdateStack", []interface{}{arg1}) fake.updateStackMutex.Unlock() if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5) + return stub(arg1) } if specificReturn { return ret.result1 @@ -4138,17 +4132,17 @@ func (fake *FakeStackManager) UpdateStackCallCount() int { return len(fake.updateStackArgsForCall) } -func (fake *FakeStackManager) UpdateStackCalls(stub func(string, string, string, manager.TemplateData, map[string]string) error) { +func (fake *FakeStackManager) UpdateStackCalls(stub func(manager.UpdateStackOptions) error) { fake.updateStackMutex.Lock() defer fake.updateStackMutex.Unlock() fake.UpdateStackStub = stub } -func (fake *FakeStackManager) UpdateStackArgsForCall(i int) (string, string, string, manager.TemplateData, map[string]string) { +func (fake *FakeStackManager) UpdateStackArgsForCall(i int) manager.UpdateStackOptions { fake.updateStackMutex.RLock() defer fake.updateStackMutex.RUnlock() argsForCall := fake.updateStackArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 + return argsForCall.arg1 } func (fake *FakeStackManager) UpdateStackReturns(result1 error) { @@ -4219,6 +4213,8 @@ func (fake *FakeStackManager) Invocations() map[string][][]interface{} { defer fake.fixClusterCompatibilityMutex.RUnlock() fake.getAutoScalingGroupNameMutex.RLock() defer fake.getAutoScalingGroupNameMutex.RUnlock() + fake.getClusterStackIfExistsMutex.RLock() + defer fake.getClusterStackIfExistsMutex.RUnlock() fake.getFargateStackMutex.RLock() defer fake.getFargateStackMutex.RUnlock() fake.getIAMAddonNameMutex.RLock() @@ -4237,8 +4233,6 @@ func (fake *FakeStackManager) Invocations() map[string][][]interface{} { defer fake.getStackTemplateMutex.RUnlock() fake.getUnmanagedNodeGroupSummariesMutex.RLock() defer fake.getUnmanagedNodeGroupSummariesMutex.RUnlock() - fake.hasClusterStackMutex.RLock() - defer fake.hasClusterStackMutex.RUnlock() fake.hasClusterStackUsingCachedListMutex.RLock() defer fake.hasClusterStackUsingCachedListMutex.RUnlock() fake.listClusterStackNamesMutex.RLock() diff --git a/pkg/cfn/manager/interface.go b/pkg/cfn/manager/interface.go index 4bdf4b9c17..a58af13cf2 100644 --- a/pkg/cfn/manager/interface.go +++ b/pkg/cfn/manager/interface.go @@ -4,6 +4,7 @@ import ( "github.com/aws/aws-sdk-go/service/cloudformation" "github.com/aws/aws-sdk-go/service/cloudtrail" "github.com/aws/aws-sdk-go/service/eks/eksiface" + "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/cfn/builder" iamoidc "github.com/weaveworks/eksctl/pkg/iam/oidc" @@ -12,6 +13,16 @@ import ( "github.com/weaveworks/eksctl/pkg/vpc" ) +// UpdateStackOptions contains options for updating a stack. +type UpdateStackOptions struct { + StackName string + ChangeSetName string + Description string + TemplateData TemplateData + Parameters map[string]string + Wait bool +} + //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -generate //counterfeiter:generate -o fakes/fake_stack_manager.go . StackManager type StackManager interface { @@ -25,10 +36,10 @@ type StackManager interface { DoWaitUntilStackIsCreated(i *Stack) error DoCreateStackRequest(i *Stack, templateData TemplateData, tags, parameters map[string]string, withIAM bool, withNamedIAM bool) error CreateStack(name string, stack builder.ResourceSet, tags, parameters map[string]string, errs chan error) error - UpdateStack(stackName, changeSetName, description string, templateData TemplateData, parameters map[string]string) error + UpdateStack(options UpdateStackOptions) error DescribeStack(i *Stack) (*Stack, error) GetManagedNodeGroupTemplate(nodeGroupName string) (string, error) - UpdateNodeGroupStack(nodeGroupName, template string) error + UpdateNodeGroupStack(nodeGroupName, template string, wait bool) error ListStacksMatching(nameRegex string, statusFilters ...string) ([]*Stack, error) ListClusterStackNames() ([]string, error) ListStacks(statusFilters ...string) ([]*Stack, error) @@ -39,7 +50,7 @@ type StackManager interface { DeleteStackBySpec(s *Stack) (*Stack, error) DeleteStackBySpecSync(s *Stack, errs chan error) error DescribeStacks() ([]*Stack, error) - HasClusterStack() (bool, error) + GetClusterStackIfExists() (*Stack, error) HasClusterStackUsingCachedList(clusterStackNames []string) (bool, error) DescribeStackEvents(i *Stack) ([]*cloudformation.StackEvent, error) LookupCloudTrailEvents(i *Stack) ([]*cloudtrail.Event, error) diff --git a/pkg/cfn/manager/nodegroup_test.go b/pkg/cfn/manager/nodegroup_test.go index d644706673..963d62271e 100644 --- a/pkg/cfn/manager/nodegroup_test.go +++ b/pkg/cfn/manager/nodegroup_test.go @@ -162,7 +162,7 @@ var _ = Describe("StackCollection NodeGroup", func() { }) It("should not error", func() { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should not have called AWS CloudFormation GetTemplate", func() { @@ -226,7 +226,7 @@ var _ = Describe("StackCollection NodeGroup", func() { if expectedType == "" { Expect(err).To(HaveOccurred()) } else { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ngType).To(Equal(expectedType)) } }, @@ -272,7 +272,7 @@ var _ = Describe("StackCollection NodeGroup", func() { if expectedType == "" { Expect(err).To(HaveOccurred()) } else { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ngType).To(Equal(expectedType)) } }, diff --git a/pkg/cfn/manager/tasks_test.go b/pkg/cfn/manager/tasks_test.go index 24a555dc65..095c9fdba8 100644 --- a/pkg/cfn/manager/tasks_test.go +++ b/pkg/cfn/manager/tasks_test.go @@ -3,14 +3,14 @@ package manager import ( "fmt" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" "github.com/pkg/errors" "github.com/stretchr/testify/mock" - api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/testutils/mockprovider" vpcfakes "github.com/weaveworks/eksctl/pkg/vpc/fakes" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" ) type task struct{ id int } @@ -72,7 +72,10 @@ var _ = Describe("StackCollection Tasks", func() { // in these tests { tasks := stackManager.NewUnmanagedNodeGroupTask(makeNodeGroups("bar", "foo"), false, fakeVPCImporter) - Expect(tasks.Describe()).To(Equal(`2 parallel tasks: { create nodegroup "bar", create nodegroup "foo" }`)) + Expect(tasks.Describe()).To(Equal(` +2 parallel tasks: { create nodegroup "bar", create nodegroup "foo" +} +`)) } { tasks := stackManager.NewUnmanagedNodeGroupTask(makeNodeGroups("bar"), false, fakeVPCImporter) @@ -88,11 +91,21 @@ var _ = Describe("StackCollection Tasks", func() { } { tasks := stackManager.NewTasksToCreateClusterWithNodeGroups(makeNodeGroups("bar", "foo"), nil, true) - Expect(tasks.Describe()).To(Equal(`2 sequential tasks: { create cluster control plane "test-cluster", 2 parallel sub-tasks: { create nodegroup "bar", create nodegroup "foo" } }`)) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { create cluster control plane "test-cluster", + 2 parallel sub-tasks: { + create nodegroup "bar", + create nodegroup "foo", + } +} +`)) } { tasks := stackManager.NewTasksToCreateClusterWithNodeGroups(makeNodeGroups("bar"), nil, false) - Expect(tasks.Describe()).To(Equal(`2 sequential tasks: { create cluster control plane "test-cluster", create nodegroup "bar" }`)) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { create cluster control plane "test-cluster", create nodegroup "bar" +} +`)) } { tasks := stackManager.NewTasksToCreateClusterWithNodeGroups(nil, nil, true) @@ -100,15 +113,38 @@ var _ = Describe("StackCollection Tasks", func() { } { tasks := stackManager.NewTasksToCreateClusterWithNodeGroups(makeNodeGroups("bar", "foo"), makeManagedNodeGroups("m1", "m2"), false) - Expect(tasks.Describe()).To(Equal(`2 sequential tasks: { create cluster control plane "test-cluster", 4 parallel sub-tasks: { create nodegroup "bar", create nodegroup "foo", create managed nodegroup "m1", create managed nodegroup "m2" } }`)) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { create cluster control plane "test-cluster", + 4 parallel sub-tasks: { + create nodegroup "bar", + create nodegroup "foo", + create managed nodegroup "m1", + create managed nodegroup "m2", + } +} +`)) } { tasks := stackManager.NewTasksToCreateClusterWithNodeGroups(makeNodeGroups("foo"), makeManagedNodeGroups("m1"), true) - Expect(tasks.Describe()).To(Equal(`2 sequential tasks: { create cluster control plane "test-cluster", 2 parallel sub-tasks: { create nodegroup "foo", create managed nodegroup "m1" } }`)) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { create cluster control plane "test-cluster", + 2 parallel sub-tasks: { + create nodegroup "foo", + create managed nodegroup "m1", + } +} +`)) } { tasks := stackManager.NewTasksToCreateClusterWithNodeGroups(makeNodeGroups("bar"), nil, false, &task{id: 1}) - Expect(tasks.Describe()).To(Equal(`2 sequential tasks: { create cluster control plane "test-cluster", 2 sequential sub-tasks: { task 1, create nodegroup "bar" } }`)) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { create cluster control plane "test-cluster", + 2 sequential sub-tasks: { + task 1, + create nodegroup "bar", + } +} +`)) } }) @@ -118,7 +154,15 @@ var _ = Describe("StackCollection Tasks", func() { }) It("appends the AssignIpv6AddressOnCreation task to occur after the cluster creation", func() { tasks := stackManager.NewTasksToCreateClusterWithNodeGroups(makeNodeGroups("bar", "foo"), nil, true) - Expect(tasks.Describe()).To(Equal(`3 sequential tasks: { create cluster control plane "test-cluster", set AssignIpv6AddressOnCreation to true for public subnets, 2 parallel sub-tasks: { create nodegroup "bar", create nodegroup "foo" } }`)) + fmt.Println(tasks.Describe()) + Expect(tasks.Describe()).To(Equal(` +3 sequential tasks: { create cluster control plane "test-cluster", set AssignIpv6AddressOnCreation to true for public subnets, + 2 parallel sub-tasks: { + create nodegroup "bar", + create nodegroup "foo", + } +} +`)) }) }) }) diff --git a/pkg/cfn/template/api_test.go b/pkg/cfn/template/api_test.go index 2a472f049c..e072f2f38d 100644 --- a/pkg/cfn/template/api_test.go +++ b/pkg/cfn/template/api_test.go @@ -34,7 +34,7 @@ var _ = Describe("CloudFormation template", func() { } jsRoleRef, err := roleRef.MarshalJSON() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(jsRoleRef).To(MatchJSON(`{"Ref": "aRole"}`)) policyRef := t.NewResource("aPolicy", &IAMPolicy{ @@ -43,11 +43,11 @@ var _ = Describe("CloudFormation template", func() { }) jsPolicyRef, err := policyRef.MarshalJSON() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(jsPolicyRef).To(MatchJSON(`{"Ref": "aPolicy"}`)) js, err := t.RenderJSON() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(js).To(MatchJSON([]byte(templateExample1))) }) @@ -65,24 +65,24 @@ var _ = Describe("CloudFormation template", func() { Expect(t).To(HaveResourceWithPropertyValue("aRole", "RoleName", `"foo"`)) - Expect(t).ToNot(HaveResourceWithPropertyValue("aRole", "RoleName", `"bar"`)) - Expect(t).ToNot(HaveResource("aRole", "AWS::Foo::Bar")) - Expect(t).ToNot(HaveResource("foo", "*")) + Expect(t).NotTo(HaveResourceWithPropertyValue("aRole", "RoleName", `"bar"`)) + Expect(t).NotTo(HaveResource("aRole", "AWS::Foo::Bar")) + Expect(t).NotTo(HaveResource("foo", "*")) Expect(t).To(HaveOutputs("aRole")) - Expect(t).ToNot(HaveOutputs("foo", "bar")) + Expect(t).NotTo(HaveOutputs("foo", "bar")) Expect(t).To(HaveOutputWithValue("aRole", `{ "Fn::GetAtt": "aRole.Arn" }`)) Expect(t).To(HaveOutputExportedAs("aRole", `{ "Fn::Sub": "${AWS::StackName}::aRole" }`)) - Expect(t).ToNot(HaveOutputExportedAs("aRole", `{}`)) - Expect(t).ToNot(HaveOutputExportedAs("aRole", `{ "Fn::GetAtt": "aRole.Arn" }`)) - Expect(t).ToNot(HaveOutputExportedAs("foo", `{ "Fn::Sub": "${AWS::StackName}::aRole" }`)) + Expect(t).NotTo(HaveOutputExportedAs("aRole", `{}`)) + Expect(t).NotTo(HaveOutputExportedAs("aRole", `{ "Fn::GetAtt": "aRole.Arn" }`)) + Expect(t).NotTo(HaveOutputExportedAs("foo", `{ "Fn::Sub": "${AWS::StackName}::aRole" }`)) }) It("can load multiple real templates", func() { examples, err := filepath.Glob("testdata/*.json") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) for _, example := range examples { Expect(NewTemplate()).To(LoadFileWithoutErrors(example)) } diff --git a/pkg/cfn/template/matchers/matchers.go b/pkg/cfn/template/matchers/matchers.go index 740155a87e..89c1354b48 100644 --- a/pkg/cfn/template/matchers/matchers.go +++ b/pkg/cfn/template/matchers/matchers.go @@ -3,7 +3,7 @@ package template import ( "encoding/json" "fmt" - "io/ioutil" + "os" "github.com/onsi/gomega" "github.com/onsi/gomega/types" @@ -60,7 +60,7 @@ func (m *Loader) Match(actualTemplate interface{}) (bool, error) { } if m.templatePath != "" { - js, err := ioutil.ReadFile(m.templatePath) + js, err := os.ReadFile(m.templatePath) if err != nil { return false, err } diff --git a/pkg/cloudconfig/cloudconfig.go b/pkg/cloudconfig/cloudconfig.go index a671faede7..86263e7ed4 100644 --- a/pkg/cloudconfig/cloudconfig.go +++ b/pkg/cloudconfig/cloudconfig.go @@ -6,7 +6,6 @@ import ( "encoding/base64" "fmt" "io" - "io/ioutil" "path" "github.com/kris-nova/logger" @@ -136,12 +135,12 @@ func DecodeCloudConfig(s string) (*CloudConfig, error) { return nil, err } - gr, err := gzip.NewReader(ioutil.NopCloser(bytes.NewBuffer(data))) + gr, err := gzip.NewReader(io.NopCloser(bytes.NewBuffer(data))) if err != nil { return nil, err } defer safeClose(gr) - data, err = ioutil.ReadAll(gr) + data, err = io.ReadAll(gr) if err != nil { return nil, err } diff --git a/pkg/connector/connector_test.go b/pkg/connector/connector_test.go index 6ad503a99e..9e73f5a991 100644 --- a/pkg/connector/connector_test.go +++ b/pkg/connector/connector_test.go @@ -1,7 +1,7 @@ package connector_test import ( - "io/ioutil" + "os" "path" "strings" "time" @@ -27,7 +27,7 @@ type connectorCase struct { var _ = Describe("EKS Connector", func() { readManifest := func(filename string) (connector.ManifestFile, error) { - data, err := ioutil.ReadFile(path.Join("testdata", filename)) + data, err := os.ReadFile(path.Join("testdata", filename)) if err != nil { return connector.ManifestFile{}, nil } @@ -83,7 +83,7 @@ var _ = Describe("EKS Connector", func() { } manifestTemplate, err := cc.getManifestTemplate() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) c := connector.EKSConnector{ Provider: mockProvider, @@ -97,11 +97,11 @@ var _ = Describe("EKS Connector", func() { return } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) assertManifestEquals := func(m connector.ManifestFile, expectedFile string) { - expected, err := ioutil.ReadFile(path.Join("testdata", expectedFile)) - Expect(err).ToNot(HaveOccurred()) + expected, err := os.ReadFile(path.Join("testdata", expectedFile)) + Expect(err).NotTo(HaveOccurred()) Expect(m.Data).To(Equal(expected), m.Filename) } diff --git a/pkg/connector/kubernetes.go b/pkg/connector/kubernetes.go index 9809b38831..9d5af758db 100644 --- a/pkg/connector/kubernetes.go +++ b/pkg/connector/kubernetes.go @@ -1,7 +1,7 @@ package connector import ( - "io/ioutil" + "io" "net/http" "net/url" "os" @@ -72,7 +72,7 @@ func getResource(client *http.Client, url string) (ManifestFile, error) { return ManifestFile{}, errors.Errorf("expected status code %d; got %d", http.StatusOK, resp.StatusCode) } - data, err := ioutil.ReadAll(resp.Body) + data, err := io.ReadAll(resp.Body) if err != nil { return ManifestFile{}, err } diff --git a/pkg/connector/manifest_test.go b/pkg/connector/manifest_test.go index acf92565d9..b2913e84a9 100644 --- a/pkg/connector/manifest_test.go +++ b/pkg/connector/manifest_test.go @@ -10,10 +10,10 @@ var _ = Describe("Manifest template", func() { Context("GetManifestTemplate", func() { It("should fetch the template", func() { template, err := connector.GetManifestTemplate() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) assertManifestFile := func(m connector.ManifestFile, expectedFilename string) { - Expect(m.Data).ToNot(BeEmpty()) + Expect(m.Data).NotTo(BeEmpty()) Expect(m.Filename).To(Equal(expectedFilename)) } assertManifestFile(template.Connector, "eks-connector.yaml") diff --git a/pkg/connector/resources_test.go b/pkg/connector/resources_test.go index c6da1c0d1e..10e107b0cc 100644 --- a/pkg/connector/resources_test.go +++ b/pkg/connector/resources_test.go @@ -30,13 +30,13 @@ var _ = Describe("Writing manifests", func() { }, } err := connector.WriteResources(fs, manifestList) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) wd, err := os.Getwd() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) files, err := afero.ReadDir(fs, wd) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(files).To(HaveLen(3)) filenameData := map[string][]byte{} @@ -50,7 +50,7 @@ var _ = Describe("Writing manifests", func() { Fail(fmt.Sprintf("unexpected filename %q", file.Name())) } file, err := afero.ReadFile(fs, path.Join(wd, file.Name())) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(file).To(Equal(data)) } }) diff --git a/pkg/credentials/filecache_test.go b/pkg/credentials/filecache_test.go index c878e86cd5..f871fa77e6 100644 --- a/pkg/credentials/filecache_test.go +++ b/pkg/credentials/filecache_test.go @@ -2,7 +2,6 @@ package credentials_test import ( "fmt" - "io/ioutil" "os" "path/filepath" "time" @@ -47,8 +46,8 @@ var _ = Describe("filecache", func() { err error ) BeforeEach(func() { - tmp, err = ioutil.TempDir("", "filecache") - Expect(err).ToNot(HaveOccurred()) + tmp, err = os.MkdirTemp("", "filecache") + Expect(err).NotTo(HaveOccurred()) _ = os.Setenv(EksctlCacheFilenameEnvName, filepath.Join(tmp, "credentials.yaml")) }) AfterEach(func() { @@ -68,15 +67,15 @@ var _ = Describe("filecache", func() { fakeClock := &fakes.FakeClock{} fakeClock.NowReturns(time.Date(1981, 1, 1, 1, 1, 1, 1, time.UTC)) p, err := NewFileCacheProvider("profile", c, fakeClock) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) value, err := p.Retrieve() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(value.AccessKeyID).To(Equal("id")) Expect(value.SecretAccessKey).To(Equal("secret")) Expect(value.SessionToken).To(Equal("token")) Expect(p.IsExpired()).NotTo(BeTrue()) - content, err := ioutil.ReadFile(filepath.Join(tmp, "credentials.yaml")) - Expect(err).ToNot(HaveOccurred()) + content, err := os.ReadFile(filepath.Join(tmp, "credentials.yaml")) + Expect(err).NotTo(HaveOccurred()) Expect(string(content)).To(Equal(`profiles: profile: credential: @@ -102,7 +101,7 @@ var _ = Describe("filecache", func() { fakeClock := &fakes.FakeClock{} fakeClock.NowReturns(time.Date(9999, 1, 1, 1, 1, 1, 1, time.UTC)) p, err := NewFileCacheProvider("profile", c, fakeClock) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(p.IsExpired()).To(BeTrue()) }) }) @@ -117,14 +116,14 @@ var _ = Describe("filecache", func() { providername: stubProvider expiration: 0001-01-01T00:00:00Z `) - err := ioutil.WriteFile(filepath.Join(tmp, "credentials.yaml"), content, 0700) - Expect(err).ToNot(HaveOccurred()) + err := os.WriteFile(filepath.Join(tmp, "credentials.yaml"), content, 0700) + Expect(err).NotTo(HaveOccurred()) c := credentials.NewCredentials(&stubProviderExpirer{}) fakeClock := &fakes.FakeClock{} p, err := NewFileCacheProvider("profile", c, fakeClock) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) creds, err := p.Retrieve() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(creds.AccessKeyID).To(Equal("storedID")) Expect(creds.SecretAccessKey).To(Equal("storedSecret")) Expect(creds.SessionToken).To(Equal("storedToken")) @@ -142,9 +141,9 @@ var _ = Describe("filecache", func() { fakeClock := &fakes.FakeClock{} fakeClock.NowReturns(time.Date(9999, 1, 1, 1, 1, 1, 1, time.UTC)) p, err := NewFileCacheProvider("profile", credentials.NewStaticCredentials("id", "secret", "token"), fakeClock) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = p.Retrieve() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = os.Stat(filepath.Join(tmp, "credentials.yaml")) Expect(os.IsNotExist(err)).To(BeTrue()) }) @@ -153,8 +152,8 @@ var _ = Describe("filecache", func() { When("the cache file's permission is too broad", func() { It("will refuse to use that file", func() { content := []byte(`test:`) - err := ioutil.WriteFile(filepath.Join(tmp, "credentials.yaml"), content, 0777) - Expect(err).ToNot(HaveOccurred()) + err := os.WriteFile(filepath.Join(tmp, "credentials.yaml"), content, 0777) + Expect(err).NotTo(HaveOccurred()) c := credentials.NewCredentials(&stubProviderExpirer{}) fakeClock := &fakes.FakeClock{} _, err = NewFileCacheProvider("profile", c, fakeClock) @@ -164,8 +163,8 @@ var _ = Describe("filecache", func() { When("the cache data has been corrupted", func() { It("will return an appropriate error", func() { content := []byte(`not valid yaml`) - err := ioutil.WriteFile(filepath.Join(tmp, "credentials.yaml"), content, 0600) - Expect(err).ToNot(HaveOccurred()) + err := os.WriteFile(filepath.Join(tmp, "credentials.yaml"), content, 0600) + Expect(err).NotTo(HaveOccurred()) c := credentials.NewCredentials(&stubProviderExpirer{}) fakeClock := &fakes.FakeClock{} _, err = NewFileCacheProvider("profile", c, fakeClock) diff --git a/pkg/ctl/cmdutils/configfile_test.go b/pkg/ctl/cmdutils/configfile_test.go index bd33dcafae..f48319d0cf 100644 --- a/pkg/ctl/cmdutils/configfile_test.go +++ b/pkg/ctl/cmdutils/configfile_test.go @@ -35,7 +35,7 @@ var _ = Describe("cmdutils configfile", func() { } err := NewMetadataLoader(cmd).Load() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(cfg.Metadata.Name).To(Equal("foo-1")) } @@ -96,7 +96,7 @@ var _ = Describe("cmdutils configfile", func() { l.flagsIncompatibleWithConfigFile.Delete("name") err := l.Load() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) }) When("given as positional argument", func() { @@ -113,7 +113,7 @@ var _ = Describe("cmdutils configfile", func() { l.flagsIncompatibleWithConfigFile.Delete("name") err := l.Load() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) }) }) @@ -144,9 +144,9 @@ var _ = Describe("cmdutils configfile", func() { It("load all of example file", func() { examples, err := filepath.Glob(examplesDir + "*.yaml") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) - Expect(examples).ToNot(BeEmpty()) + Expect(examples).NotTo(BeEmpty()) for _, example := range examples { cmd := &Cmd{ CobraCommand: newCmd(), @@ -159,6 +159,7 @@ var _ = Describe("cmdutils configfile", func() { Expect(err).ToNot(HaveOccurred()) cfg := cmd.ClusterConfig + Expect(err).ToNot(HaveOccurred()) Expect(cfg.Metadata.Name).ToNot(BeEmpty()) Expect(cfg.Metadata.Region).ToNot(BeEmpty()) Expect(cfg.Metadata.Region).To(Equal(cmd.ProviderConfig.Region)) diff --git a/pkg/ctl/cmdutils/filter/filter_test.go b/pkg/ctl/cmdutils/filter/filter_test.go index 4095326e61..a264415aeb 100644 --- a/pkg/ctl/cmdutils/filter/filter_test.go +++ b/pkg/ctl/cmdutils/filter/filter_test.go @@ -43,7 +43,7 @@ var _ = Describe("filter", func() { It("should match include filter", func() { filter.AppendIncludeNames("banana") err := filter.doAppendIncludeGlobs(allItems, "fruits", "*apple", "*berry") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(filter.Match("a1")).To(BeFalse()) Expect(filter.Match("a2")).To(BeFalse()) @@ -65,7 +65,7 @@ var _ = Describe("filter", func() { It("should match exclude filter with names and globs", func() { filter.AppendExcludeNames("banana") err := filter.AppendExcludeGlobs("*apple", "*berry") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(filter.Match("a1")).To(BeTrue()) Expect(filter.Match("a2")).To(BeTrue()) @@ -87,10 +87,10 @@ var _ = Describe("filter", func() { It("should include an item when it exists as an inclusion name overwrite", func() { filter.AppendIncludeNames("raspberry") err := filter.doAppendIncludeGlobs(allItems, "fruit", "a?", "b?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = filter.AppendExcludeGlobs("*apple", "*berry") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.doMatchAll(allItems) Expect(included).To(HaveLen(5)) @@ -101,7 +101,7 @@ var _ = Describe("filter", func() { It("should not include an item when it exists as an exclusion name overwrite", func() { err := filter.doAppendIncludeGlobs(allItems, "fruit", "a?", "b?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) filter.AppendExcludeNames("a2") @@ -115,11 +115,11 @@ var _ = Describe("filter", func() { It("when a name is in both inclusion and exclusion overwrites the exclusion takes precedence", func() { filter.AppendIncludeNames("raspberry") err := filter.doAppendIncludeGlobs(allItems, "fruit", "a?", "b?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) filter.AppendExcludeNames("raspberry") err = filter.AppendExcludeGlobs("*apple", "*berry") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.doMatchAll(allItems) Expect(included).To(HaveLen(4)) @@ -130,10 +130,10 @@ var _ = Describe("filter", func() { It("when an item matches inclusion and exclusion globs exclusion takes precedence", func() { err := filter.doAppendIncludeGlobs(allItems, "fruit", "*berry", "*apple") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = filter.AppendExcludeGlobs("?aspberry", "a?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.doMatchAll(allItems) Expect(included).To(HaveLen(3)) diff --git a/pkg/ctl/cmdutils/filter/iamserviceaccount_filter_test.go b/pkg/ctl/cmdutils/filter/iamserviceaccount_filter_test.go index ffc09fcaa2..074abd3159 100644 --- a/pkg/ctl/cmdutils/filter/iamserviceaccount_filter_test.go +++ b/pkg/ctl/cmdutils/filter/iamserviceaccount_filter_test.go @@ -4,7 +4,7 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - kubernetes "github.com/weaveworks/eksctl/pkg/kubernetes" + "github.com/weaveworks/eksctl/pkg/kubernetes" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" @@ -48,7 +48,7 @@ var _ = Describe("iamserviceaccount filter", func() { "kube-system/aws-node", ) err := filter.SetDeleteFilter(mockLister, true, cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.MatchAll(cfg.IAM.ServiceAccounts) Expect(included).To(HaveLen(2)) @@ -76,7 +76,7 @@ var _ = Describe("iamserviceaccount filter", func() { "sa/only-remote-2", ) err := filter.SetExcludeExistingFilter(mockLister, clientSet, cfg.IAM.ServiceAccounts, true) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.MatchAll(cfg.IAM.ServiceAccounts) Expect(included).To(HaveLen(3)) @@ -110,12 +110,12 @@ var _ = Describe("iamserviceaccount filter", func() { sa2 := metav1.ObjectMeta{Name: "role-only", Namespace: "sa"} err := kubernetes.MaybeCreateServiceAccountOrUpdateMetadata(clientSet, sa1) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = kubernetes.MaybeCreateServiceAccountOrUpdateMetadata(clientSet, sa2) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = filter.SetExcludeExistingFilter(mockLister, clientSet, cfg.IAM.ServiceAccounts, false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.MatchAll(cfg.IAM.ServiceAccounts) Expect(included).To(HaveLen(3)) diff --git a/pkg/ctl/cmdutils/filter/nodegroup_filter_test.go b/pkg/ctl/cmdutils/filter/nodegroup_filter_test.go index 09936aae7a..5c0b9eef5f 100644 --- a/pkg/ctl/cmdutils/filter/nodegroup_filter_test.go +++ b/pkg/ctl/cmdutils/filter/nodegroup_filter_test.go @@ -51,7 +51,7 @@ var _ = Describe("nodegroup filter", func() { cfg.NodeGroups = append(cfg.NodeGroups, nonExistentNg) err := filter.AppendIncludeGlobs(getNodeGroupNames(cfg), "test-ng1?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(filter.Match("test-ng3x")).To(BeFalse()) Expect(filter.Match("test-ng3b")).To(BeFalse()) @@ -80,7 +80,7 @@ var _ = Describe("nodegroup filter", func() { "non-existing-in-cfg-2", ) err := filter.SetOnlyRemote(mockProvider.EKS(), mockLister, cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.matchAll(filter.collectNames(cfg.NodeGroups)) Expect(included).To(HaveLen(2)) @@ -98,7 +98,7 @@ var _ = Describe("nodegroup filter", func() { It("should match only local nodegroups", func() { err := filter.AppendIncludeGlobs(getNodeGroupNames(cfg), "test-ng1?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) mockLister := newMockStackLister( "test-ng1a", @@ -106,7 +106,7 @@ var _ = Describe("nodegroup filter", func() { "test-ng3a", ) err = filter.SetOnlyLocal(mockProvider.EKS(), mockLister, cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.matchAll(filter.collectNames(cfg.NodeGroups)) Expect(included).To(HaveLen(1)) @@ -117,7 +117,7 @@ var _ = Describe("nodegroup filter", func() { It("should match only local nodegroups with exclude and include rules", func() { err := filter.AppendIncludeGlobs(getNodeGroupNames(cfg), "test-ng?a", "test-ng?b") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) mockLister := newMockStackLister( "test-ng2a", @@ -125,10 +125,10 @@ var _ = Describe("nodegroup filter", func() { "test-ng2b", ) err = filter.SetOnlyLocal(mockProvider.EKS(), mockLister, cfg) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = filter.AppendExcludeGlobs("test-ng1a", "test-ng2?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) included, excluded := filter.matchAll(filter.collectNames(cfg.NodeGroups)) Expect(included).To(HaveLen(2)) @@ -152,17 +152,17 @@ var _ = Describe("nodegroup filter", func() { err := filter.ForEach(cfg.NodeGroups, func(i int, nodeGroup *api.NodeGroup) error { api.SetNodeGroupDefaults(nodeGroup, cfg.Metadata) err := api.ValidateNodeGroup(i, nodeGroup) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = filter.ForEach(cfg.NodeGroups, func(i int, nodeGroup *api.NodeGroup) error { Expect(nodeGroup).To(Equal(cfg.NodeGroups[i])) names = append(names, nodeGroup.Name) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(names).To(Equal([]string{"test-ng1a", "test-ng2a", "test-ng3a", "test-ng1b", "test-ng2b", "test-ng3b"})) w := &bytes.Buffer{} @@ -183,17 +183,17 @@ var _ = Describe("nodegroup filter", func() { err := filter.ForEach(cfg.NodeGroups, func(i int, nodeGroup *api.NodeGroup) error { api.SetNodeGroupDefaults(nodeGroup, cfg.Metadata) err := api.ValidateNodeGroup(i, nodeGroup) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) callback := false err = filter.ForEach(cfg.NodeGroups, func(_ int, _ *api.NodeGroup) error { callback = true return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(callback).To(BeFalse()) }) @@ -209,7 +209,7 @@ var _ = Describe("nodegroup filter", func() { names = append(names, nodeGroup.Name) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(names).To(Equal([]string{"test-ng1a", "test-ng2a", "test-ng3a"})) names = []string{} @@ -222,7 +222,7 @@ var _ = Describe("nodegroup filter", func() { names = append(names, nodeGroup.Name) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(names).To(Equal([]string{"ng-x0", "ng-x1", "ng-x2"})) }) @@ -239,7 +239,7 @@ var _ = Describe("nodegroup filter", func() { names = append(names, nodeGroup.Name) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(names).To(Equal([]string{"test-ng1a", "test-ng2a", "test-ng3a", "test-ng1b", "test-ng2b", "test-ng3b"})) names = []string{} @@ -249,13 +249,13 @@ var _ = Describe("nodegroup filter", func() { Expect(err.Error()).To(Equal(`no nodegroups match include glob filter specification: "t?xyz?,ab*z123?"`)) err = filter.AppendIncludeGlobs(getNodeGroupNames(cfg), "test-ng1?", "te*-ng3?") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = filter.ForEach(cfg.NodeGroups, func(i int, nodeGroup *api.NodeGroup) error { Expect(nodeGroup).To(Equal(cfg.NodeGroups[i])) names = append(names, nodeGroup.Name) return nil }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(names).To(Equal([]string{"test-ng1a", "test-ng3a", "test-ng1b", "test-ng3b"})) }) }) @@ -339,7 +339,7 @@ const expected = ` "metadata": { "name": "test-3x3-ngs", "region": "eu-central-1", - "version": "1.20" + "version": "1.21" }, "iam": { "withOIDC": false diff --git a/pkg/ctl/cmdutils/scale.go b/pkg/ctl/cmdutils/scale.go index 2cf6a38e82..cf84068825 100644 --- a/pkg/ctl/cmdutils/scale.go +++ b/pkg/ctl/cmdutils/scale.go @@ -7,7 +7,7 @@ import ( ) // NewScaleNodeGroupLoader will load config or use flags for 'eksctl scale nodegroup' -func NewScaleNodeGroupLoader(cmd *Cmd, ng *api.NodeGroup) ClusterConfigLoader { +func NewScaleNodeGroupLoader(cmd *Cmd, ng *api.NodeGroupBase) ClusterConfigLoader { l := newCommonClusterConfigLoader(cmd) l.flagsIncompatibleWithConfigFile.Insert( @@ -22,9 +22,9 @@ func NewScaleNodeGroupLoader(cmd *Cmd, ng *api.NodeGroup) ClusterConfigLoader { return err } - loadedNG := l.ClusterConfig.FindNodegroup(ng.Name) - if loadedNG == nil { - return fmt.Errorf("node group %s not found", ng.Name) + loadedNG, err := l.ClusterConfig.FindNodegroup(ng.Name) + if err != nil { + return err } if err := validateNumberOfNodes(loadedNG); err != nil { @@ -54,7 +54,7 @@ func NewScaleNodeGroupLoader(cmd *Cmd, ng *api.NodeGroup) ClusterConfigLoader { return l } -func validateNameArgument(cmd *Cmd, ng *api.NodeGroup) error { +func validateNameArgument(cmd *Cmd, ng *api.NodeGroupBase) error { if ng.Name != "" && cmd.NameArg != "" { return ErrFlagAndArg("--name", ng.Name, cmd.NameArg) } @@ -70,7 +70,7 @@ func validateNameArgument(cmd *Cmd, ng *api.NodeGroup) error { return nil } -func validateNumberOfNodes(ng *api.NodeGroup) error { +func validateNumberOfNodes(ng *api.NodeGroupBase) error { if ng.ScalingConfig == nil { ng.ScalingConfig = &api.ScalingConfig{} } @@ -103,7 +103,7 @@ func validateNumberOfNodes(ng *api.NodeGroup) error { } //only 1 of desired/min/max has to be set on the cli -func validateNumberOfNodesCLI(ng *api.NodeGroup) error { +func validateNumberOfNodesCLI(ng *api.NodeGroupBase) error { if ng.ScalingConfig == nil { ng.ScalingConfig = &api.ScalingConfig{} } diff --git a/pkg/ctl/cmdutils/scale_test.go b/pkg/ctl/cmdutils/scale_test.go index 185a547674..ce36263449 100644 --- a/pkg/ctl/cmdutils/scale_test.go +++ b/pkg/ctl/cmdutils/scale_test.go @@ -43,7 +43,7 @@ var _ = Describe("scale node group config file loader", func() { NameArg: params.name, } - ng := api.NewNodeGroup() + ng := api.NewNodeGroup().BaseNodeGroup() err := NewScaleNodeGroupLoader(cmd, ng).Load() if params.err != nil { Expect(err).To(HaveOccurred()) @@ -52,7 +52,7 @@ var _ = Describe("scale node group config file loader", func() { if params.minSize != nil { Expect(ng.MinSize).To(Equal(params.minSize)) } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } }, Entry("one node group matched", scaleNodeGroupCase{ @@ -60,7 +60,7 @@ var _ = Describe("scale node group config file loader", func() { }), Entry("no node group matched", scaleNodeGroupCase{ name: "123123", - err: fmt.Errorf("node group 123123 not found"), + err: fmt.Errorf("nodegroup 123123 not found in config file"), }), Entry("with no desired capacity", scaleNodeGroupCase{ name: "ng-no-desired-capacity", @@ -101,7 +101,7 @@ var _ = Describe("scale node group config file loader", func() { NameArg: params.name, } - ng := api.NewNodeGroup() + ng := api.NewNodeGroup().BaseNodeGroup() ng.MinSize = params.minSize ng.MaxSize = params.maxSize ng.DesiredCapacity = params.desiredSize @@ -113,7 +113,7 @@ var _ = Describe("scale node group config file loader", func() { if params.minSize != nil { Expect(ng.MinSize).To(Equal(params.minSize)) } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } }, Entry("only specifying min-nodes", scaleNodeGroupCLICase{ @@ -166,4 +166,39 @@ var _ = Describe("scale node group config file loader", func() { err: fmt.Errorf("at least one of minimum, maximum and desired nodes must be set"), }), ) + + Describe("for managed nodegroups", func() { + Context("when using a config file", func() { + It("setting --name finds that individual nodegroup", func() { + ngName := "mng-ng" + ng := &api.NodeGroupBase{ + Name: ngName, + ScalingConfig: &api.ScalingConfig{ + DesiredCapacity: aws.Int(2), + }, + } + + config := api.NewClusterConfig() + config.Metadata.Name = "test-cluster" + config.ManagedNodeGroups = []*api.ManagedNodeGroup{ + { + NodeGroupBase: &api.NodeGroupBase{ + Name: ngName, + ScalingConfig: &api.ScalingConfig{ + DesiredCapacity: aws.Int(2), + }, + }, + }, + } + cmd := &Cmd{ + CobraCommand: newCmd(), + ClusterConfig: config, + ProviderConfig: api.ProviderConfig{}, + } + + err := NewScaleNodeGroupLoader(cmd, ng).Load() + Expect(err).NotTo(HaveOccurred()) + }) + }) + }) }) diff --git a/pkg/ctl/completion/completion_test.go b/pkg/ctl/completion/completion_test.go index 4089f0a70e..2073cd0cff 100644 --- a/pkg/ctl/completion/completion_test.go +++ b/pkg/ctl/completion/completion_test.go @@ -14,14 +14,14 @@ var _ = Describe("completion", func() { It("with bash", func() { cmd := newMockCmd("bash") out, err := cmd.execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(out).To(ContainSubstring("bash completion for eksctl")) }) It("with zsh", func() { cmd := newMockCmd("zsh") out, err := cmd.execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(out).To(ContainSubstring("#compdef _eksctl eksctl")) }) diff --git a/pkg/ctl/create/cluster_test.go b/pkg/ctl/create/cluster_test.go index 2802ceec97..06fc0bbd7d 100644 --- a/pkg/ctl/create/cluster_test.go +++ b/pkg/ctl/create/cluster_test.go @@ -39,7 +39,7 @@ var _ = Describe("create cluster", func() { }) }) _, err := cmd.execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(count).To(Equal(1)) }, Entry("without cluster name", ""), diff --git a/pkg/ctl/create/iamidentitymapping.go b/pkg/ctl/create/iamidentitymapping.go index d5579f941d..cb598bd71e 100644 --- a/pkg/ctl/create/iamidentitymapping.go +++ b/pkg/ctl/create/iamidentitymapping.go @@ -125,7 +125,7 @@ func doCreateIAMIdentityMapping(cmd *cmdutils.Cmd, options iamIdentityMappingOpt } // Check whether role already exists. - identities, err := acm.Identities() + identities, err := acm.GetIdentities() if err != nil { return err } diff --git a/pkg/ctl/ctltest/utils.go b/pkg/ctl/ctltest/utils.go index 8c62c1805b..a8bbf5a7f7 100644 --- a/pkg/ctl/ctltest/utils.go +++ b/pkg/ctl/ctltest/utils.go @@ -2,8 +2,8 @@ package ctltest import ( "bytes" - "io/ioutil" "log" + "os" "github.com/spf13/cobra" "sigs.k8s.io/yaml" @@ -51,7 +51,7 @@ func CreateConfigFile(cfg *api.ClusterConfig) string { if err != nil { log.Fatalf("unable to marshal object: %s", err.Error()) } - file, err := ioutil.TempFile("", "enable-test-config-file") + file, err := os.CreateTemp("", "enable-test-config-file") if err != nil { log.Fatalf("unable to create temp config file: %s", err.Error()) } diff --git a/pkg/ctl/delete/iamidentitymapping.go b/pkg/ctl/delete/iamidentitymapping.go index f97bffa80c..77024e5d60 100644 --- a/pkg/ctl/delete/iamidentitymapping.go +++ b/pkg/ctl/delete/iamidentitymapping.go @@ -1,6 +1,8 @@ package delete import ( + "fmt" + "github.com/kris-nova/logger" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -15,14 +17,15 @@ func deleteIAMIdentityMappingCmd(cmd *cmdutils.Cmd) { cmd.ClusterConfig = cfg var ( - arn string - all bool + arn string + all bool + account string ) cmd.SetDescription("iamidentitymapping", "Delete a IAM identity mapping", "") cmd.CobraCommand.RunE = func(_ *cobra.Command, args []string) error { - return doDeleteIAMIdentityMapping(cmd, arn, all) + return doDeleteIAMIdentityMapping(cmd, arn, account, all) } cmd.FlagSetGroup.InFlagSet("General", func(fs *pflag.FlagSet) { @@ -32,12 +35,13 @@ func deleteIAMIdentityMappingCmd(cmd *cmdutils.Cmd) { cmdutils.AddRegionFlag(fs, &cmd.ProviderConfig) cmdutils.AddConfigFileFlag(fs, &cmd.ClusterConfigFile) cmdutils.AddTimeoutFlag(fs, &cmd.ProviderConfig.WaitTimeout) + fs.StringVar(&account, "account", "", "Account ID to delete") }) cmdutils.AddCommonFlagsForAWS(cmd.FlagSetGroup, &cmd.ProviderConfig, false) } -func doDeleteIAMIdentityMapping(cmd *cmdutils.Cmd, arn string, all bool) error { +func doDeleteIAMIdentityMapping(cmd *cmdutils.Cmd, arn, account string, all bool) error { if err := cmdutils.NewMetadataLoader(cmd).Load(); err != nil { return err } @@ -50,8 +54,8 @@ func doDeleteIAMIdentityMapping(cmd *cmdutils.Cmd, arn string, all bool) error { } cmdutils.LogRegionAndVersionInfo(cfg.Metadata) - if arn == "" { - return cmdutils.ErrMustBeSet("--arn") + if arn == "" && account == "" || arn != "" && account != "" { + return fmt.Errorf("either --arn or --account must be set") } if cfg.Metadata.Name == "" { return cmdutils.ErrMustBeSet(cmdutils.ClusterNameFlag(cmd)) @@ -69,15 +73,23 @@ func doDeleteIAMIdentityMapping(cmd *cmdutils.Cmd, arn string, all bool) error { return err } - if err := acm.RemoveIdentity(arn, all); err != nil { - return err + switch { + case account != "": + if err := acm.RemoveAccount(account); err != nil { + return err + } + case arn != "": + if err := acm.RemoveIdentity(arn, all); err != nil { + return err + } } + if err := acm.Save(); err != nil { return err } // Check whether we have more roles that match - identities, err := acm.Identities() + identities, err := acm.GetIdentities() if err != nil { return err } diff --git a/pkg/ctl/enable/flux.go b/pkg/ctl/enable/flux.go index ed692b66f0..4965e06680 100644 --- a/pkg/ctl/enable/flux.go +++ b/pkg/ctl/enable/flux.go @@ -1,7 +1,6 @@ package enable import ( - "io/ioutil" "os" "github.com/kris-nova/logger" @@ -58,7 +57,7 @@ func flux2Install(cmd *cmdutils.Cmd) error { return err } - kubeCfgPath, err := ioutil.TempFile("", cmd.ClusterConfig.Metadata.Name) + kubeCfgPath, err := os.CreateTemp("", cmd.ClusterConfig.Metadata.Name) if err != nil { return err } diff --git a/pkg/ctl/enable/flux_test.go b/pkg/ctl/enable/flux_test.go index 5855dc9be3..aefd36f98b 100644 --- a/pkg/ctl/enable/flux_test.go +++ b/pkg/ctl/enable/flux_test.go @@ -79,10 +79,10 @@ var _ = Describe("enable flux", func() { }) It("succeeds with the basic configuration", func() { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) fluxCfg := cmd.Cmd.ClusterConfig.GitOps.Flux - Expect(fluxCfg).ToNot(BeNil()) + Expect(fluxCfg).NotTo(BeNil()) Expect(fluxCfg.GitProvider).To(Equal("github")) }) diff --git a/pkg/ctl/enable/profile_test.go b/pkg/ctl/enable/profile_test.go index 2bc5d7a2cc..5f6ff71837 100644 --- a/pkg/ctl/enable/profile_test.go +++ b/pkg/ctl/enable/profile_test.go @@ -22,22 +22,22 @@ var _ = Describe("enable profile", func() { It("should accept a name argument", func() { cmd := newMockEnableProfileCmd("profile", "--cluster", "clus-1", "--region", "eu-north-1", "--git-url", "git@example.com:repo.git", "--git-email", "user@example.com", "app-dev") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.Source).To(Equal("app-dev")) }) It("should accept a --profile-source flag", func() { cmd := newMockEnableProfileCmd("profile", "--cluster", "clus-1", "--region", "eu-north-1", "--git-url", "git@example.com:repo.git", "--git-email", "user@example.com", "--profile-source", "app-dev") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.Source).To(Equal("app-dev")) }) @@ -107,20 +107,20 @@ var _ = Describe("enable profile", func() { "--profile-revision", "branch-2", ) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig Expect(cfg.Metadata.Name).To(Equal("clus-1")) Expect(cfg.Metadata.Region).To(Equal("us-west-2")) - Expect(cfg.Git).ToNot(BeNil()) - Expect(cfg.Git.Repo).ToNot(BeNil()) + Expect(cfg.Git).NotTo(BeNil()) + Expect(cfg.Git.Repo).NotTo(BeNil()) Expect(cfg.Git.Repo.URL).To(Equal("git@example.com:repo.git")) Expect(cfg.Git.Repo.Email).To(Equal("user@example.com")) Expect(cfg.Git.Repo.Branch).To(Equal("master")) Expect(cfg.Git.Repo.User).To(Equal("user1")) Expect(cfg.Git.Repo.PrivateSSHKeyPath).To(Equal("./profile_test.go")) - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.Source).To(Equal("app-dev")) Expect(cfg.Git.BootstrapProfile.Revision).To(Equal("branch-2")) }) @@ -159,7 +159,7 @@ var _ = Describe("enable profile", func() { cmd := newMockEnableProfileCmd("profile", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("loads the correct defaults", func() { @@ -167,10 +167,10 @@ var _ = Describe("enable profile", func() { cmd := newMockEnableProfileCmd("profile", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) gitCfg := cmd.Cmd.ClusterConfig.Git - Expect(gitCfg).ToNot(BeNil()) + Expect(gitCfg).NotTo(BeNil()) Expect(gitCfg.Repo.Branch).To(Equal("master")) Expect(gitCfg.Repo.User).To(Equal("Flux")) Expect(gitCfg.Repo.FluxPath).To(Equal("flux/")) @@ -179,7 +179,7 @@ var _ = Describe("enable profile", func() { Expect(gitCfg.Operator.Namespace).To(Equal("flux")) Expect(gitCfg.Operator.Label).To(Equal("flux")) - Expect(gitCfg.Operator.WithHelm).ToNot(BeNil()) + Expect(gitCfg.Operator.WithHelm).NotTo(BeNil()) Expect(*gitCfg.Operator.WithHelm).To(BeTrue()) Expect(gitCfg.BootstrapProfile.Revision).To(Equal("")) diff --git a/pkg/ctl/enable/repo_test.go b/pkg/ctl/enable/repo_test.go index 8db3416a10..0b48033e9e 100644 --- a/pkg/ctl/enable/repo_test.go +++ b/pkg/ctl/enable/repo_test.go @@ -85,13 +85,13 @@ var _ = Describe("enable repo", func() { "--additional-helm-operator-args", "--log-format=json,--workers=4", ) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig Expect(cfg.Metadata.Name).To(Equal("clus-1")) Expect(cfg.Metadata.Region).To(Equal("us-west-2")) - Expect(cfg.Git).ToNot(BeNil()) - Expect(cfg.Git.Repo).ToNot(BeNil()) + Expect(cfg.Git).NotTo(BeNil()) + Expect(cfg.Git.Repo).NotTo(BeNil()) Expect(cfg.Git.Repo.URL).To(Equal("git@example.com:repo.git")) Expect(cfg.Git.Repo.Email).To(Equal("user@example.com")) Expect(cfg.Git.Repo.Branch).To(Equal("master")) @@ -100,7 +100,7 @@ var _ = Describe("enable repo", func() { Expect(cfg.Git.Repo.Paths).To(ConsistOf("base", "flux", "upgrades")) Expect(cfg.Git.Repo.FluxPath).To(Equal("flux-dir/")) - Expect(cfg.Git.Operator).ToNot(BeNil()) + Expect(cfg.Git.Operator).NotTo(BeNil()) Expect(cfg.Git.Operator.Label).To(Equal("flux2")) Expect(cfg.Git.Operator.Namespace).To(Equal("gitops")) Expect(*cfg.Git.Operator.WithHelm).To(BeTrue()) @@ -118,18 +118,18 @@ var _ = Describe("enable repo", func() { "--git-email", "user@example.com", ) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git).ToNot(BeNil()) - Expect(cfg.Git.Repo).ToNot(BeNil()) + Expect(cfg.Git).NotTo(BeNil()) + Expect(cfg.Git.Repo).NotTo(BeNil()) Expect(cfg.Git.Repo.Branch).To(Equal("master")) Expect(cfg.Git.Repo.User).To(Equal("Flux")) Expect(cfg.Git.Repo.PrivateSSHKeyPath).To(Equal("")) Expect(cfg.Git.Repo.Paths).To(BeEmpty()) Expect(cfg.Git.Repo.FluxPath).To(Equal("flux/")) - Expect(cfg.Git.Operator).ToNot(BeNil()) + Expect(cfg.Git.Operator).NotTo(BeNil()) Expect(cfg.Git.Operator.Label).To(Equal("flux")) Expect(cfg.Git.Operator.Namespace).To(Equal("flux")) Expect(*cfg.Git.Operator.WithHelm).To(BeTrue()) @@ -173,7 +173,7 @@ var _ = Describe("enable repo", func() { cmd := newMockEnableRepoCmd("repo", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("fails without a cluster name", func() { @@ -241,10 +241,10 @@ var _ = Describe("enable repo", func() { cmd := newMockEnableRepoCmd("repo", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) gitCfg := cmd.Cmd.ClusterConfig.Git - Expect(gitCfg).ToNot(BeNil()) + Expect(gitCfg).NotTo(BeNil()) Expect(gitCfg.Repo.Branch).To(Equal("master")) Expect(gitCfg.Repo.User).To(Equal("Flux")) Expect(gitCfg.Repo.FluxPath).To(Equal("flux/")) @@ -253,7 +253,7 @@ var _ = Describe("enable repo", func() { Expect(gitCfg.Operator.Namespace).To(Equal("flux")) Expect(gitCfg.Operator.Label).To(Equal("flux")) - Expect(gitCfg.Operator.WithHelm).ToNot(BeNil()) + Expect(gitCfg.Operator.WithHelm).NotTo(BeNil()) Expect(*gitCfg.Operator.WithHelm).To(BeTrue()) Expect(gitCfg.Operator.ReadOnly).To(BeFalse()) Expect(*gitCfg.Operator.CommitOperatorManifests).To(BeTrue()) diff --git a/pkg/ctl/generate/profile_test.go b/pkg/ctl/generate/profile_test.go index 938a38a708..b7c0529634 100644 --- a/pkg/ctl/generate/profile_test.go +++ b/pkg/ctl/generate/profile_test.go @@ -21,22 +21,22 @@ var _ = Describe("generate profile", func() { It("should accept a name argument", func() { cmd := newMockGenerateProfileCmd("profile", "--cluster", "clus-1", "--region", "eu-north-1", "app-dev") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.Source).To(Equal("app-dev")) }) It("should accept --profile-source flag", func() { cmd := newMockGenerateProfileCmd("profile", "--cluster", "clus-1", "--region", "eu-north-1", "--profile-source", "app-dev") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.Source).To(Equal("app-dev")) }) @@ -78,14 +78,14 @@ var _ = Describe("generate profile", func() { "--region", "us-west-2", ) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig Expect(cfg.Metadata.Name).To(Equal("clus-1")) Expect(cfg.Metadata.Region).To(Equal("us-west-2")) - Expect(cfg.Git).ToNot(BeNil()) + Expect(cfg.Git).NotTo(BeNil()) - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.Source).To(Equal("app-dev")) Expect(cfg.Git.BootstrapProfile.Revision).To(Equal("branch-2")) Expect(cfg.Git.BootstrapProfile.OutputPath).To(Equal("test-output-dir/dir2")) @@ -99,11 +99,11 @@ var _ = Describe("generate profile", func() { "--region", "us-west-2", ) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.OutputPath).To(Equal("./app-dev")) }) @@ -115,11 +115,11 @@ var _ = Describe("generate profile", func() { "--region", "us-west-2", ) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.OutputPath).To(Equal("./eks-quickstart-app-dev")) }) @@ -152,7 +152,7 @@ var _ = Describe("generate profile", func() { cmd := newMockGenerateProfileCmd("profile", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("fails without a cluster name", func() { @@ -200,11 +200,11 @@ var _ = Describe("generate profile", func() { cmd := newMockGenerateProfileCmd("profile", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.OutputPath).To(Equal("./app-dev")) }) @@ -214,11 +214,11 @@ var _ = Describe("generate profile", func() { cmd := newMockGenerateProfileCmd("profile", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig - Expect(cfg.Git.BootstrapProfile).ToNot(BeNil()) + Expect(cfg.Git.BootstrapProfile).NotTo(BeNil()) Expect(cfg.Git.BootstrapProfile.OutputPath).To(Equal("./some-repo")) }) }) diff --git a/pkg/ctl/get/iamidentitymapping.go b/pkg/ctl/get/iamidentitymapping.go index 35a6a214f8..2db7fe7fcb 100644 --- a/pkg/ctl/get/iamidentitymapping.go +++ b/pkg/ctl/get/iamidentitymapping.go @@ -77,7 +77,7 @@ func doGetIAMIdentityMapping(cmd *cmdutils.Cmd, params *getCmdParams, arn string if err != nil { return err } - identities, err := acm.Identities() + identities, err := acm.GetIdentities() if err != nil { return err } @@ -119,4 +119,7 @@ func addIAMIdentityMappingTableColumns(printer *printers.TablePrinter) { printer.AddColumn("GROUPS", func(r iam.Identity) string { return strings.Join(r.Groups(), ",") }) + printer.AddColumn("ACCOUNT", func(r iam.Identity) string { + return r.Account() + }) } diff --git a/pkg/ctl/scale/nodegroup.go b/pkg/ctl/scale/nodegroup.go index 9720798388..de5cba9ff4 100644 --- a/pkg/ctl/scale/nodegroup.go +++ b/pkg/ctl/scale/nodegroup.go @@ -11,14 +11,14 @@ import ( ) func scaleNodeGroupCmd(cmd *cmdutils.Cmd) { - scaleNodeGroupWithRunFunc(cmd, func(cmd *cmdutils.Cmd, ng *api.NodeGroup) error { + scaleNodeGroupWithRunFunc(cmd, func(cmd *cmdutils.Cmd, ng *api.NodeGroupBase) error { return doScaleNodeGroup(cmd, ng) }) } -func scaleNodeGroupWithRunFunc(cmd *cmdutils.Cmd, runFunc func(cmd *cmdutils.Cmd, ng *api.NodeGroup) error) { +func scaleNodeGroupWithRunFunc(cmd *cmdutils.Cmd, runFunc func(cmd *cmdutils.Cmd, ng *api.NodeGroupBase) error) { cfg := api.NewClusterConfig() - ng := cfg.NewNodeGroup() + ng := cfg.NewNodeGroup().BaseNodeGroup() cmd.ClusterConfig = cfg cmd.SetDescription("nodegroup", "Scale a nodegroup", "", "ng") @@ -56,7 +56,7 @@ func scaleNodeGroupWithRunFunc(cmd *cmdutils.Cmd, runFunc func(cmd *cmdutils.Cmd cmdutils.AddCommonFlagsForAWS(cmd.FlagSetGroup, &cmd.ProviderConfig, true) } -func doScaleNodeGroup(cmd *cmdutils.Cmd, ng *api.NodeGroup) error { +func doScaleNodeGroup(cmd *cmdutils.Cmd, ng *api.NodeGroupBase) error { if err := cmdutils.NewScaleNodeGroupLoader(cmd, ng).Load(); err != nil { return err } diff --git a/pkg/ctl/scale/nodegroup_test.go b/pkg/ctl/scale/nodegroup_test.go index 38e4ef0b07..a6a9f359f2 100644 --- a/pkg/ctl/scale/nodegroup_test.go +++ b/pkg/ctl/scale/nodegroup_test.go @@ -13,12 +13,12 @@ import ( var _ = Describe("scale", func() { Describe("nodegroup", func() { - DescribeTable("create cluster successfully", + DescribeTable("scales a nodegroup successfully", func(args ...string) { cmd := newMockEmptyCmd(args...) count := 0 cmdutils.AddResourceCmd(cmdutils.NewGrouping(), cmd.parentCmd, func(cmd *cmdutils.Cmd) { - scaleNodeGroupWithRunFunc(cmd, func(cmd *cmdutils.Cmd, ng *v1alpha5.NodeGroup) error { + scaleNodeGroupWithRunFunc(cmd, func(cmd *cmdutils.Cmd, ng *v1alpha5.NodeGroupBase) error { if len(ng.Name) != 0 { Expect(ng.Name).To(Or(Equal("nodeGroup"), Equal(""))) } else { diff --git a/pkg/ctl/upgrade/cluster_test.go b/pkg/ctl/upgrade/cluster_test.go index 701a87a75f..d1280e4d9f 100644 --- a/pkg/ctl/upgrade/cluster_test.go +++ b/pkg/ctl/upgrade/cluster_test.go @@ -22,30 +22,30 @@ var _ = Describe("upgrade cluster", func() { It("should accept a name argument", func() { cmd := newMockUpgradeClusterCmd("cluster", "clus-1") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should accept a --name flag", func() { cmd := newMockUpgradeClusterCmd("cluster", "--name", "clus-1") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should accept the --region flag", func() { cmd := newMockUpgradeClusterCmd("cluster", "--name", "clus-1", "--region", "eu-north-1") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should accept the --version flag", func() { cmd := newMockUpgradeClusterCmd("cluster", "--name", "clus-1", "--region", "eu-north-1", "--version", "1.16") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("accepts --approve flag", func() { cmd := newMockUpgradeClusterCmd("cluster", "--name", "clus-1", "--approve") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("loads all flags correctly", func() { @@ -56,7 +56,7 @@ var _ = Describe("upgrade cluster", func() { "--approve", ) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cfg := cmd.Cmd.ClusterConfig Expect(cfg.Metadata.Name).To(Equal("clus-1")) @@ -99,14 +99,14 @@ var _ = Describe("upgrade cluster", func() { cmd := newMockUpgradeClusterCmd("cluster", "-f", configFile) _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("accepts --approve flag with the config file", func() { configFile = ctltest.CreateConfigFile(cfg) cmd := newMockUpgradeClusterCmd("cluster", "--config-file", configFile, "--approve") _, err := cmd.Execute() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("fails without a cluster name", func() { diff --git a/pkg/ctl/upgrade/nodegroup.go b/pkg/ctl/upgrade/nodegroup.go index 22d170ee85..ffbf47ec71 100644 --- a/pkg/ctl/upgrade/nodegroup.go +++ b/pkg/ctl/upgrade/nodegroup.go @@ -3,14 +3,13 @@ package upgrade import ( "time" - "github.com/weaveworks/eksctl/pkg/actions/nodegroup" - "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/weaveworks/eksctl/pkg/managed" + "github.com/weaveworks/eksctl/pkg/actions/nodegroup" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/ctl/cmdutils" + "github.com/weaveworks/eksctl/pkg/managed" ) const upgradeNodegroupTimeout = 45 * time.Minute @@ -33,15 +32,12 @@ func upgradeNodeGroupCmd(cmd *cmdutils.Cmd) { fs.StringVar(&options.KubernetesVersion, "kubernetes-version", "", "Kubernetes version") fs.BoolVar(&options.ForceUpgrade, "force-upgrade", false, "Force the update if the existing node group's pods are unable to be drained due to a pod disruption budget issue") fs.StringVar(&options.ReleaseVersion, "release-version", "", "AMI version of the EKS optimized AMI to use") + fs.BoolVar(&options.Wait, "wait", true, "nodegroup upgrade to complete") }) cmd.FlagSetGroup.InFlagSet("General", func(fs *pflag.FlagSet) { cmdutils.AddClusterFlag(fs, cmd.ClusterConfig.Metadata) - cmdutils.AddRegionFlag(fs, &cmd.ProviderConfig) - cmd.Wait = true - cmdutils.AddWaitFlag(fs, &cmd.Wait, "nodegroup upgrade to complete") - // found with experimentation cmdutils.AddTimeoutFlagWithValue(fs, &cmd.ProviderConfig.WaitTimeout, upgradeNodegroupTimeout) }) @@ -82,6 +78,6 @@ func upgradeNodeGroup(cmd *cmdutils.Cmd, options managed.UpgradeOptions) error { return err } - return nodegroup.New(cfg, ctl, clientSet).Upgrade(options, cmd.Wait) + return nodegroup.New(cfg, ctl, clientSet).Upgrade(options) } diff --git a/pkg/ctl/utils/schema.go b/pkg/ctl/utils/schema.go index ef5e41afb6..9e0aa2fa94 100644 --- a/pkg/ctl/utils/schema.go +++ b/pkg/ctl/utils/schema.go @@ -2,7 +2,6 @@ package utils import ( "fmt" - "log" "github.com/spf13/cobra" @@ -19,9 +18,5 @@ func schemaCmd(cmd *cmdutils.Cmd) { } func doSchemaCmd(cmd *cmdutils.Cmd) { - schema, err := api.Asset("schema.json") - if err != nil { - log.Fatal(err.Error()) - } - fmt.Printf("%s", schema) + fmt.Printf("%s", api.SchemaJSON) } diff --git a/pkg/eks/api.go b/pkg/eks/api.go index dc1621df2b..438fbe9c23 100644 --- a/pkg/eks/api.go +++ b/pkg/eks/api.go @@ -2,10 +2,14 @@ package eks import ( "fmt" - "io/ioutil" + "io" "os" "time" + "github.com/aws/aws-sdk-go/service/cloudwatchlogs" + + "github.com/aws/aws-sdk-go/service/cloudwatchlogs/cloudwatchlogsiface" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/client" "github.com/aws/aws-sdk-go/aws/credentials" @@ -46,7 +50,6 @@ import ( ekscreds "github.com/weaveworks/eksctl/pkg/credentials" "github.com/weaveworks/eksctl/pkg/kubernetes" kubewrapper "github.com/weaveworks/eksctl/pkg/kubernetes" - "github.com/weaveworks/eksctl/pkg/utils" "github.com/weaveworks/eksctl/pkg/version" ) @@ -83,7 +86,8 @@ type ProviderServices struct { ssm ssmiface.SSMAPI iam iamiface.IAMAPI - cloudtrail cloudtrailiface.CloudTrailAPI + cloudtrail cloudtrailiface.CloudTrailAPI + cloudwatchlogs cloudwatchlogsiface.CloudWatchLogsAPI session *session.Session } @@ -126,6 +130,11 @@ func (p ProviderServices) IAM() iamiface.IAMAPI { return p.iam } // CloudTrail returns a representation of the CloudTrail API func (p ProviderServices) CloudTrail() cloudtrailiface.CloudTrailAPI { return p.cloudtrail } +// CloudWatch returns a representation of the CloudWatch API. +func (p ProviderServices) CloudWatchLogs() cloudwatchlogsiface.CloudWatchLogsAPI { + return p.cloudwatchlogs +} + // Region returns provider-level region setting func (p ProviderServices) Region() string { return p.spec.Region } @@ -190,6 +199,7 @@ func New(spec *api.ProviderConfig, clusterSpec *api.ClusterConfig) (*ClusterProv provider.ssm = ssm.New(s) provider.iam = iam.New(s) provider.cloudtrail = cloudtrail.New(s) + provider.cloudwatchlogs = cloudwatchlogs.New(s) c.Status = &ProviderStatus{ sessionCreds: s.Config.Credentials, @@ -278,9 +288,9 @@ func LoadConfigFromFile(configFile string) (*api.ClusterConfig, error) { func readConfig(configFile string) ([]byte, error) { if configFile == "-" { - return ioutil.ReadAll(os.Stdin) + return io.ReadAll(os.Stdin) } - return ioutil.ReadFile(configFile) + return os.ReadFile(configFile) } // IsSupportedRegion check if given region is supported @@ -340,7 +350,7 @@ func ResolveAMI(provider api.ClusterProvider, version string, np api.NodePool) e return errors.Errorf("invalid AMI value: %q", ng.AMI) } - instanceType := SelectInstanceType(np) + instanceType := api.SelectInstanceType(np) id, err := resolver.Resolve(provider.Region(), version, instanceType, ng.AMIFamily) if err != nil { return errors.Wrap(err, "unable to determine AMI to use") @@ -352,33 +362,6 @@ func ResolveAMI(provider api.ClusterProvider, version string, np api.NodePool) e return nil } -// SelectInstanceType determines which instanceType is relevant for selecting an AMI -// If the nodegroup has mixed instances it will prefer a GPU instance type over a general class one -// This is to make sure that the AMI that is selected later is valid for all the types -func SelectInstanceType(np api.NodePool) string { - var instanceTypes []string - switch ng := np.(type) { - case *api.NodeGroup: - if ng.InstancesDistribution != nil { - instanceTypes = ng.InstancesDistribution.InstanceTypes - } - case *api.ManagedNodeGroup: - instanceTypes = ng.InstanceTypes - } - - hasMixedInstances := len(instanceTypes) > 0 - if hasMixedInstances { - for _, instanceType := range instanceTypes { - if utils.IsGPUInstanceType(instanceType) { - return instanceType - } - } - return instanceTypes[0] - } - - return np.BaseNodeGroup().InstanceType -} - func errTooFewAvailabilityZones(azs []string) error { return fmt.Errorf("only %d zones specified %v, %d are required (can be non-unique)", len(azs), azs, az.MinRequiredAvailabilityZones) } diff --git a/pkg/eks/api_test.go b/pkg/eks/api_test.go index d08618c2d3..f05e32995c 100644 --- a/pkg/eks/api_test.go +++ b/pkg/eks/api_test.go @@ -21,19 +21,19 @@ var _ = Describe("eksctl API", func() { BeforeEach(func() { err := api.Register() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should load a valid YAML config without error", func() { cfg, err := LoadConfigFromFile("../../examples/01-simple-cluster.yaml") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(cfg.Metadata.Name).To(Equal("cluster-1")) Expect(cfg.NodeGroups).To(HaveLen(1)) }) It("should load a valid JSON config without error", func() { cfg, err := LoadConfigFromFile("testdata/example.json") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(cfg.Metadata.Name).To(Equal("cluster-1")) Expect(cfg.NodeGroups).To(HaveLen(1)) }) @@ -94,7 +94,7 @@ var _ = Describe("eksctl API", func() { testEnsureAMI := func(matcher gomegatypes.GomegaMatcher) { err := ResolveAMI(provider, "1.14", ng) - ExpectWithOffset(1, err).ToNot(HaveOccurred()) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) ExpectWithOffset(1, ng.AMI).To(matcher) } diff --git a/pkg/eks/eks.go b/pkg/eks/eks.go index 80af3471c3..14a5d0abd7 100644 --- a/pkg/eks/eks.go +++ b/pkg/eks/eks.go @@ -81,7 +81,7 @@ func (c *ClusterProvider) RefreshClusterStatus(spec *api.ClusterConfig) error { // SupportsManagedNodes reports whether an existing cluster supports Managed Nodes // The minimum required control plane version and platform version are 1.14 and eks.3 respectively func (c *ClusterProvider) SupportsManagedNodes(clusterConfig *api.ClusterConfig) (bool, error) { - if err := c.maybeRefreshClusterStatus(clusterConfig); err != nil { + if err := c.RefreshClusterStatusIfStale(clusterConfig); err != nil { return false, err } @@ -126,7 +126,7 @@ func ClusterSupportsManagedNodes(cluster *awseks.Cluster) (bool, error) { // SupportsFargate reports whether an existing cluster supports Fargate. func (c *ClusterProvider) SupportsFargate(clusterConfig *api.ClusterConfig) (bool, error) { - if err := c.maybeRefreshClusterStatus(clusterConfig); err != nil { + if err := c.RefreshClusterStatusIfStale(clusterConfig); err != nil { return false, err } return ClusterSupportsFargate(c.Status.ClusterInfo.Cluster) @@ -179,7 +179,8 @@ func PlatformVersion(platformVersion string) (int, error) { return version, nil } -func (c *ClusterProvider) maybeRefreshClusterStatus(spec *api.ClusterConfig) error { +// RefreshClusterStatusIfStale refreshes the cluster status if enough time has passed since the last refresh +func (c *ClusterProvider) RefreshClusterStatusIfStale(spec *api.ClusterConfig) error { if c.clusterInfoNeedsUpdate() { return c.RefreshClusterStatus(spec) } @@ -188,7 +189,7 @@ func (c *ClusterProvider) maybeRefreshClusterStatus(spec *api.ClusterConfig) err // CanDelete return true when a cluster can be deleted, otherwise it returns false along with an error explaining the reason func (c *ClusterProvider) CanDelete(spec *api.ClusterConfig) (bool, error) { - err := c.maybeRefreshClusterStatus(spec) + err := c.RefreshClusterStatusIfStale(spec) if err != nil { if awsError, ok := errors.Unwrap(errors.Unwrap(err)).(awserr.Error); ok && awsError.Code() == awseks.ErrCodeResourceNotFoundException { @@ -202,7 +203,7 @@ func (c *ClusterProvider) CanDelete(spec *api.ClusterConfig) (bool, error) { // CanOperate returns true when a cluster can be operated, otherwise it returns false along with an error explaining the reason func (c *ClusterProvider) CanOperate(spec *api.ClusterConfig) (bool, error) { - err := c.maybeRefreshClusterStatus(spec) + err := c.RefreshClusterStatusIfStale(spec) if err != nil { return false, errors.Wrapf(err, "unable to fetch cluster status to determine operability") } @@ -217,7 +218,7 @@ func (c *ClusterProvider) CanOperate(spec *api.ClusterConfig) (bool, error) { // CanUpdate return true when a cluster or add-ons can be updated, otherwise it returns false along with an error explaining the reason func (c *ClusterProvider) CanUpdate(spec *api.ClusterConfig) (bool, error) { - err := c.maybeRefreshClusterStatus(spec) + err := c.RefreshClusterStatusIfStale(spec) if err != nil { return false, errors.Wrapf(err, "fetching cluster status to determine update status") } diff --git a/pkg/eks/eks_test.go b/pkg/eks/eks_test.go index bd032876dd..44335371ae 100644 --- a/pkg/eks/eks_test.go +++ b/pkg/eks/eks_test.go @@ -332,8 +332,8 @@ var _ = Describe("EKS API wrapper", func() { p.MockCloudFormation().On("ListStacksPages", mock.Anything, mock.Anything).Return(nil) clusters, err := c.ListClusters(chunkSize, false) - Expect(err).ToNot(HaveOccurred()) - Expect(clusters).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(clusters).NotTo(BeNil()) Expect(len(clusters)).To(Equal(0)) }) }) @@ -628,7 +628,7 @@ var _ = Describe("EKS API wrapper", func() { Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring(k.errSubstr)) } else { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } }, Entry("Invalid ARN", kmsSupportCase{ diff --git a/pkg/eks/instance_selection_test.go b/pkg/eks/instance_selection_test.go index 6ff6cf8e05..4f1677c9b3 100644 --- a/pkg/eks/instance_selection_test.go +++ b/pkg/eks/instance_selection_test.go @@ -4,7 +4,6 @@ import ( . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" - "github.com/weaveworks/eksctl/pkg/eks" ) type instanceTypeCase struct { @@ -42,7 +41,7 @@ var _ = DescribeTable("Instance type selection", func(t instanceTypeCase) { } for _, np := range []api.NodePool{ng, mng} { - instanceType := eks.SelectInstanceType(np) + instanceType := api.SelectInstanceType(np) Expect(instanceType).To(Equal(t.expectedInstanceType)) } }, diff --git a/pkg/eks/mocks/CloudWatchLogsAPI.go b/pkg/eks/mocks/CloudWatchLogsAPI.go new file mode 100644 index 0000000000..20b63495c1 --- /dev/null +++ b/pkg/eks/mocks/CloudWatchLogsAPI.go @@ -0,0 +1,3539 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import ( + cloudwatchlogs "github.com/aws/aws-sdk-go/service/cloudwatchlogs" + + context "context" + + mock "github.com/stretchr/testify/mock" + + request "github.com/aws/aws-sdk-go/aws/request" +) + +// CloudWatchLogsAPI is an autogenerated mock type for the CloudWatchLogsAPI type +type CloudWatchLogsAPI struct { + mock.Mock +} + +// AssociateKmsKey provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) AssociateKmsKey(_a0 *cloudwatchlogs.AssociateKmsKeyInput) (*cloudwatchlogs.AssociateKmsKeyOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.AssociateKmsKeyOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.AssociateKmsKeyInput) *cloudwatchlogs.AssociateKmsKeyOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.AssociateKmsKeyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.AssociateKmsKeyInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AssociateKmsKeyRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) AssociateKmsKeyRequest(_a0 *cloudwatchlogs.AssociateKmsKeyInput) (*request.Request, *cloudwatchlogs.AssociateKmsKeyOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.AssociateKmsKeyInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.AssociateKmsKeyOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.AssociateKmsKeyInput) *cloudwatchlogs.AssociateKmsKeyOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.AssociateKmsKeyOutput) + } + } + + return r0, r1 +} + +// AssociateKmsKeyWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) AssociateKmsKeyWithContext(_a0 context.Context, _a1 *cloudwatchlogs.AssociateKmsKeyInput, _a2 ...request.Option) (*cloudwatchlogs.AssociateKmsKeyOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.AssociateKmsKeyOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.AssociateKmsKeyInput, ...request.Option) *cloudwatchlogs.AssociateKmsKeyOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.AssociateKmsKeyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.AssociateKmsKeyInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CancelExportTask provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CancelExportTask(_a0 *cloudwatchlogs.CancelExportTaskInput) (*cloudwatchlogs.CancelExportTaskOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.CancelExportTaskOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CancelExportTaskInput) *cloudwatchlogs.CancelExportTaskOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CancelExportTaskOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CancelExportTaskInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CancelExportTaskRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CancelExportTaskRequest(_a0 *cloudwatchlogs.CancelExportTaskInput) (*request.Request, *cloudwatchlogs.CancelExportTaskOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CancelExportTaskInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.CancelExportTaskOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CancelExportTaskInput) *cloudwatchlogs.CancelExportTaskOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.CancelExportTaskOutput) + } + } + + return r0, r1 +} + +// CancelExportTaskWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) CancelExportTaskWithContext(_a0 context.Context, _a1 *cloudwatchlogs.CancelExportTaskInput, _a2 ...request.Option) (*cloudwatchlogs.CancelExportTaskOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.CancelExportTaskOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.CancelExportTaskInput, ...request.Option) *cloudwatchlogs.CancelExportTaskOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CancelExportTaskOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.CancelExportTaskInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateExportTask provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CreateExportTask(_a0 *cloudwatchlogs.CreateExportTaskInput) (*cloudwatchlogs.CreateExportTaskOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.CreateExportTaskOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CreateExportTaskInput) *cloudwatchlogs.CreateExportTaskOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CreateExportTaskOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CreateExportTaskInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateExportTaskRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CreateExportTaskRequest(_a0 *cloudwatchlogs.CreateExportTaskInput) (*request.Request, *cloudwatchlogs.CreateExportTaskOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CreateExportTaskInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.CreateExportTaskOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CreateExportTaskInput) *cloudwatchlogs.CreateExportTaskOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.CreateExportTaskOutput) + } + } + + return r0, r1 +} + +// CreateExportTaskWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) CreateExportTaskWithContext(_a0 context.Context, _a1 *cloudwatchlogs.CreateExportTaskInput, _a2 ...request.Option) (*cloudwatchlogs.CreateExportTaskOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.CreateExportTaskOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.CreateExportTaskInput, ...request.Option) *cloudwatchlogs.CreateExportTaskOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CreateExportTaskOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.CreateExportTaskInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateLogGroup provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CreateLogGroup(_a0 *cloudwatchlogs.CreateLogGroupInput) (*cloudwatchlogs.CreateLogGroupOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.CreateLogGroupOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CreateLogGroupInput) *cloudwatchlogs.CreateLogGroupOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CreateLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CreateLogGroupInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateLogGroupRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CreateLogGroupRequest(_a0 *cloudwatchlogs.CreateLogGroupInput) (*request.Request, *cloudwatchlogs.CreateLogGroupOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CreateLogGroupInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.CreateLogGroupOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CreateLogGroupInput) *cloudwatchlogs.CreateLogGroupOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.CreateLogGroupOutput) + } + } + + return r0, r1 +} + +// CreateLogGroupWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) CreateLogGroupWithContext(_a0 context.Context, _a1 *cloudwatchlogs.CreateLogGroupInput, _a2 ...request.Option) (*cloudwatchlogs.CreateLogGroupOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.CreateLogGroupOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.CreateLogGroupInput, ...request.Option) *cloudwatchlogs.CreateLogGroupOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CreateLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.CreateLogGroupInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateLogStream provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CreateLogStream(_a0 *cloudwatchlogs.CreateLogStreamInput) (*cloudwatchlogs.CreateLogStreamOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.CreateLogStreamOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CreateLogStreamInput) *cloudwatchlogs.CreateLogStreamOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CreateLogStreamOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CreateLogStreamInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateLogStreamRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) CreateLogStreamRequest(_a0 *cloudwatchlogs.CreateLogStreamInput) (*request.Request, *cloudwatchlogs.CreateLogStreamOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.CreateLogStreamInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.CreateLogStreamOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.CreateLogStreamInput) *cloudwatchlogs.CreateLogStreamOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.CreateLogStreamOutput) + } + } + + return r0, r1 +} + +// CreateLogStreamWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) CreateLogStreamWithContext(_a0 context.Context, _a1 *cloudwatchlogs.CreateLogStreamInput, _a2 ...request.Option) (*cloudwatchlogs.CreateLogStreamOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.CreateLogStreamOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.CreateLogStreamInput, ...request.Option) *cloudwatchlogs.CreateLogStreamOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.CreateLogStreamOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.CreateLogStreamInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteDestination provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteDestination(_a0 *cloudwatchlogs.DeleteDestinationInput) (*cloudwatchlogs.DeleteDestinationOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteDestinationOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteDestinationInput) *cloudwatchlogs.DeleteDestinationOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteDestinationOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteDestinationInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteDestinationRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteDestinationRequest(_a0 *cloudwatchlogs.DeleteDestinationInput) (*request.Request, *cloudwatchlogs.DeleteDestinationOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteDestinationInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteDestinationOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteDestinationInput) *cloudwatchlogs.DeleteDestinationOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteDestinationOutput) + } + } + + return r0, r1 +} + +// DeleteDestinationWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteDestinationWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteDestinationInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteDestinationOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteDestinationOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteDestinationInput, ...request.Option) *cloudwatchlogs.DeleteDestinationOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteDestinationOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteDestinationInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteLogGroup provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteLogGroup(_a0 *cloudwatchlogs.DeleteLogGroupInput) (*cloudwatchlogs.DeleteLogGroupOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteLogGroupOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteLogGroupInput) *cloudwatchlogs.DeleteLogGroupOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteLogGroupInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteLogGroupRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteLogGroupRequest(_a0 *cloudwatchlogs.DeleteLogGroupInput) (*request.Request, *cloudwatchlogs.DeleteLogGroupOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteLogGroupInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteLogGroupOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteLogGroupInput) *cloudwatchlogs.DeleteLogGroupOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteLogGroupOutput) + } + } + + return r0, r1 +} + +// DeleteLogGroupWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteLogGroupWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteLogGroupInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteLogGroupOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteLogGroupOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteLogGroupInput, ...request.Option) *cloudwatchlogs.DeleteLogGroupOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteLogGroupInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteLogStream provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteLogStream(_a0 *cloudwatchlogs.DeleteLogStreamInput) (*cloudwatchlogs.DeleteLogStreamOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteLogStreamOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteLogStreamInput) *cloudwatchlogs.DeleteLogStreamOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteLogStreamOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteLogStreamInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteLogStreamRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteLogStreamRequest(_a0 *cloudwatchlogs.DeleteLogStreamInput) (*request.Request, *cloudwatchlogs.DeleteLogStreamOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteLogStreamInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteLogStreamOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteLogStreamInput) *cloudwatchlogs.DeleteLogStreamOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteLogStreamOutput) + } + } + + return r0, r1 +} + +// DeleteLogStreamWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteLogStreamWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteLogStreamInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteLogStreamOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteLogStreamOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteLogStreamInput, ...request.Option) *cloudwatchlogs.DeleteLogStreamOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteLogStreamOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteLogStreamInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteMetricFilter provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteMetricFilter(_a0 *cloudwatchlogs.DeleteMetricFilterInput) (*cloudwatchlogs.DeleteMetricFilterOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteMetricFilterOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteMetricFilterInput) *cloudwatchlogs.DeleteMetricFilterOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteMetricFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteMetricFilterInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteMetricFilterRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteMetricFilterRequest(_a0 *cloudwatchlogs.DeleteMetricFilterInput) (*request.Request, *cloudwatchlogs.DeleteMetricFilterOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteMetricFilterInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteMetricFilterOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteMetricFilterInput) *cloudwatchlogs.DeleteMetricFilterOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteMetricFilterOutput) + } + } + + return r0, r1 +} + +// DeleteMetricFilterWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteMetricFilterWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteMetricFilterInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteMetricFilterOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteMetricFilterOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteMetricFilterInput, ...request.Option) *cloudwatchlogs.DeleteMetricFilterOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteMetricFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteMetricFilterInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteQueryDefinition provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteQueryDefinition(_a0 *cloudwatchlogs.DeleteQueryDefinitionInput) (*cloudwatchlogs.DeleteQueryDefinitionOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteQueryDefinitionOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteQueryDefinitionInput) *cloudwatchlogs.DeleteQueryDefinitionOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteQueryDefinitionOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteQueryDefinitionInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteQueryDefinitionRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteQueryDefinitionRequest(_a0 *cloudwatchlogs.DeleteQueryDefinitionInput) (*request.Request, *cloudwatchlogs.DeleteQueryDefinitionOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteQueryDefinitionInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteQueryDefinitionOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteQueryDefinitionInput) *cloudwatchlogs.DeleteQueryDefinitionOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteQueryDefinitionOutput) + } + } + + return r0, r1 +} + +// DeleteQueryDefinitionWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteQueryDefinitionWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteQueryDefinitionInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteQueryDefinitionOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteQueryDefinitionOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteQueryDefinitionInput, ...request.Option) *cloudwatchlogs.DeleteQueryDefinitionOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteQueryDefinitionOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteQueryDefinitionInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteResourcePolicy provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteResourcePolicy(_a0 *cloudwatchlogs.DeleteResourcePolicyInput) (*cloudwatchlogs.DeleteResourcePolicyOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteResourcePolicyOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteResourcePolicyInput) *cloudwatchlogs.DeleteResourcePolicyOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteResourcePolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteResourcePolicyInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteResourcePolicyRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteResourcePolicyRequest(_a0 *cloudwatchlogs.DeleteResourcePolicyInput) (*request.Request, *cloudwatchlogs.DeleteResourcePolicyOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteResourcePolicyInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteResourcePolicyOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteResourcePolicyInput) *cloudwatchlogs.DeleteResourcePolicyOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteResourcePolicyOutput) + } + } + + return r0, r1 +} + +// DeleteResourcePolicyWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteResourcePolicyWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteResourcePolicyInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteResourcePolicyOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteResourcePolicyOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteResourcePolicyInput, ...request.Option) *cloudwatchlogs.DeleteResourcePolicyOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteResourcePolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteResourcePolicyInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteRetentionPolicy provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteRetentionPolicy(_a0 *cloudwatchlogs.DeleteRetentionPolicyInput) (*cloudwatchlogs.DeleteRetentionPolicyOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteRetentionPolicyOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteRetentionPolicyInput) *cloudwatchlogs.DeleteRetentionPolicyOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteRetentionPolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteRetentionPolicyInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteRetentionPolicyRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteRetentionPolicyRequest(_a0 *cloudwatchlogs.DeleteRetentionPolicyInput) (*request.Request, *cloudwatchlogs.DeleteRetentionPolicyOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteRetentionPolicyInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteRetentionPolicyOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteRetentionPolicyInput) *cloudwatchlogs.DeleteRetentionPolicyOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteRetentionPolicyOutput) + } + } + + return r0, r1 +} + +// DeleteRetentionPolicyWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteRetentionPolicyWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteRetentionPolicyInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteRetentionPolicyOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteRetentionPolicyOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteRetentionPolicyInput, ...request.Option) *cloudwatchlogs.DeleteRetentionPolicyOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteRetentionPolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteRetentionPolicyInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteSubscriptionFilter provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteSubscriptionFilter(_a0 *cloudwatchlogs.DeleteSubscriptionFilterInput) (*cloudwatchlogs.DeleteSubscriptionFilterOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DeleteSubscriptionFilterOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteSubscriptionFilterInput) *cloudwatchlogs.DeleteSubscriptionFilterOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteSubscriptionFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteSubscriptionFilterInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteSubscriptionFilterRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DeleteSubscriptionFilterRequest(_a0 *cloudwatchlogs.DeleteSubscriptionFilterInput) (*request.Request, *cloudwatchlogs.DeleteSubscriptionFilterOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DeleteSubscriptionFilterInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DeleteSubscriptionFilterOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DeleteSubscriptionFilterInput) *cloudwatchlogs.DeleteSubscriptionFilterOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DeleteSubscriptionFilterOutput) + } + } + + return r0, r1 +} + +// DeleteSubscriptionFilterWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DeleteSubscriptionFilterWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DeleteSubscriptionFilterInput, _a2 ...request.Option) (*cloudwatchlogs.DeleteSubscriptionFilterOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DeleteSubscriptionFilterOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DeleteSubscriptionFilterInput, ...request.Option) *cloudwatchlogs.DeleteSubscriptionFilterOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DeleteSubscriptionFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DeleteSubscriptionFilterInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeDestinations provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeDestinations(_a0 *cloudwatchlogs.DescribeDestinationsInput) (*cloudwatchlogs.DescribeDestinationsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeDestinationsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeDestinationsInput) *cloudwatchlogs.DescribeDestinationsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeDestinationsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeDestinationsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeDestinationsPages provides a mock function with given fields: _a0, _a1 +func (_m *CloudWatchLogsAPI) DescribeDestinationsPages(_a0 *cloudwatchlogs.DescribeDestinationsInput, _a1 func(*cloudwatchlogs.DescribeDestinationsOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeDestinationsInput, func(*cloudwatchlogs.DescribeDestinationsOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeDestinationsPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *CloudWatchLogsAPI) DescribeDestinationsPagesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeDestinationsInput, _a2 func(*cloudwatchlogs.DescribeDestinationsOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeDestinationsInput, func(*cloudwatchlogs.DescribeDestinationsOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeDestinationsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeDestinationsRequest(_a0 *cloudwatchlogs.DescribeDestinationsInput) (*request.Request, *cloudwatchlogs.DescribeDestinationsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeDestinationsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeDestinationsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeDestinationsInput) *cloudwatchlogs.DescribeDestinationsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeDestinationsOutput) + } + } + + return r0, r1 +} + +// DescribeDestinationsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeDestinationsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeDestinationsInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeDestinationsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeDestinationsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeDestinationsInput, ...request.Option) *cloudwatchlogs.DescribeDestinationsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeDestinationsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeDestinationsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeExportTasks provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeExportTasks(_a0 *cloudwatchlogs.DescribeExportTasksInput) (*cloudwatchlogs.DescribeExportTasksOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeExportTasksOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeExportTasksInput) *cloudwatchlogs.DescribeExportTasksOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeExportTasksOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeExportTasksInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeExportTasksRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeExportTasksRequest(_a0 *cloudwatchlogs.DescribeExportTasksInput) (*request.Request, *cloudwatchlogs.DescribeExportTasksOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeExportTasksInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeExportTasksOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeExportTasksInput) *cloudwatchlogs.DescribeExportTasksOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeExportTasksOutput) + } + } + + return r0, r1 +} + +// DescribeExportTasksWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeExportTasksWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeExportTasksInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeExportTasksOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeExportTasksOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeExportTasksInput, ...request.Option) *cloudwatchlogs.DescribeExportTasksOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeExportTasksOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeExportTasksInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeLogGroups provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeLogGroups(_a0 *cloudwatchlogs.DescribeLogGroupsInput) (*cloudwatchlogs.DescribeLogGroupsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeLogGroupsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeLogGroupsInput) *cloudwatchlogs.DescribeLogGroupsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeLogGroupsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeLogGroupsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeLogGroupsPages provides a mock function with given fields: _a0, _a1 +func (_m *CloudWatchLogsAPI) DescribeLogGroupsPages(_a0 *cloudwatchlogs.DescribeLogGroupsInput, _a1 func(*cloudwatchlogs.DescribeLogGroupsOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeLogGroupsInput, func(*cloudwatchlogs.DescribeLogGroupsOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeLogGroupsPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *CloudWatchLogsAPI) DescribeLogGroupsPagesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeLogGroupsInput, _a2 func(*cloudwatchlogs.DescribeLogGroupsOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeLogGroupsInput, func(*cloudwatchlogs.DescribeLogGroupsOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeLogGroupsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeLogGroupsRequest(_a0 *cloudwatchlogs.DescribeLogGroupsInput) (*request.Request, *cloudwatchlogs.DescribeLogGroupsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeLogGroupsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeLogGroupsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeLogGroupsInput) *cloudwatchlogs.DescribeLogGroupsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeLogGroupsOutput) + } + } + + return r0, r1 +} + +// DescribeLogGroupsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeLogGroupsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeLogGroupsInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeLogGroupsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeLogGroupsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeLogGroupsInput, ...request.Option) *cloudwatchlogs.DescribeLogGroupsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeLogGroupsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeLogGroupsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeLogStreams provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeLogStreams(_a0 *cloudwatchlogs.DescribeLogStreamsInput) (*cloudwatchlogs.DescribeLogStreamsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeLogStreamsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeLogStreamsInput) *cloudwatchlogs.DescribeLogStreamsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeLogStreamsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeLogStreamsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeLogStreamsPages provides a mock function with given fields: _a0, _a1 +func (_m *CloudWatchLogsAPI) DescribeLogStreamsPages(_a0 *cloudwatchlogs.DescribeLogStreamsInput, _a1 func(*cloudwatchlogs.DescribeLogStreamsOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeLogStreamsInput, func(*cloudwatchlogs.DescribeLogStreamsOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeLogStreamsPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *CloudWatchLogsAPI) DescribeLogStreamsPagesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeLogStreamsInput, _a2 func(*cloudwatchlogs.DescribeLogStreamsOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeLogStreamsInput, func(*cloudwatchlogs.DescribeLogStreamsOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeLogStreamsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeLogStreamsRequest(_a0 *cloudwatchlogs.DescribeLogStreamsInput) (*request.Request, *cloudwatchlogs.DescribeLogStreamsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeLogStreamsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeLogStreamsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeLogStreamsInput) *cloudwatchlogs.DescribeLogStreamsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeLogStreamsOutput) + } + } + + return r0, r1 +} + +// DescribeLogStreamsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeLogStreamsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeLogStreamsInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeLogStreamsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeLogStreamsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeLogStreamsInput, ...request.Option) *cloudwatchlogs.DescribeLogStreamsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeLogStreamsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeLogStreamsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeMetricFilters provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeMetricFilters(_a0 *cloudwatchlogs.DescribeMetricFiltersInput) (*cloudwatchlogs.DescribeMetricFiltersOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeMetricFiltersOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeMetricFiltersInput) *cloudwatchlogs.DescribeMetricFiltersOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeMetricFiltersOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeMetricFiltersInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeMetricFiltersPages provides a mock function with given fields: _a0, _a1 +func (_m *CloudWatchLogsAPI) DescribeMetricFiltersPages(_a0 *cloudwatchlogs.DescribeMetricFiltersInput, _a1 func(*cloudwatchlogs.DescribeMetricFiltersOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeMetricFiltersInput, func(*cloudwatchlogs.DescribeMetricFiltersOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeMetricFiltersPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *CloudWatchLogsAPI) DescribeMetricFiltersPagesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeMetricFiltersInput, _a2 func(*cloudwatchlogs.DescribeMetricFiltersOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeMetricFiltersInput, func(*cloudwatchlogs.DescribeMetricFiltersOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeMetricFiltersRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeMetricFiltersRequest(_a0 *cloudwatchlogs.DescribeMetricFiltersInput) (*request.Request, *cloudwatchlogs.DescribeMetricFiltersOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeMetricFiltersInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeMetricFiltersOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeMetricFiltersInput) *cloudwatchlogs.DescribeMetricFiltersOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeMetricFiltersOutput) + } + } + + return r0, r1 +} + +// DescribeMetricFiltersWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeMetricFiltersWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeMetricFiltersInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeMetricFiltersOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeMetricFiltersOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeMetricFiltersInput, ...request.Option) *cloudwatchlogs.DescribeMetricFiltersOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeMetricFiltersOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeMetricFiltersInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeQueries provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeQueries(_a0 *cloudwatchlogs.DescribeQueriesInput) (*cloudwatchlogs.DescribeQueriesOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeQueriesOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeQueriesInput) *cloudwatchlogs.DescribeQueriesOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeQueriesOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeQueriesInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeQueriesRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeQueriesRequest(_a0 *cloudwatchlogs.DescribeQueriesInput) (*request.Request, *cloudwatchlogs.DescribeQueriesOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeQueriesInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeQueriesOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeQueriesInput) *cloudwatchlogs.DescribeQueriesOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeQueriesOutput) + } + } + + return r0, r1 +} + +// DescribeQueriesWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeQueriesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeQueriesInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeQueriesOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeQueriesOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeQueriesInput, ...request.Option) *cloudwatchlogs.DescribeQueriesOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeQueriesOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeQueriesInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeQueryDefinitions provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeQueryDefinitions(_a0 *cloudwatchlogs.DescribeQueryDefinitionsInput) (*cloudwatchlogs.DescribeQueryDefinitionsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeQueryDefinitionsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeQueryDefinitionsInput) *cloudwatchlogs.DescribeQueryDefinitionsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeQueryDefinitionsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeQueryDefinitionsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeQueryDefinitionsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeQueryDefinitionsRequest(_a0 *cloudwatchlogs.DescribeQueryDefinitionsInput) (*request.Request, *cloudwatchlogs.DescribeQueryDefinitionsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeQueryDefinitionsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeQueryDefinitionsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeQueryDefinitionsInput) *cloudwatchlogs.DescribeQueryDefinitionsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeQueryDefinitionsOutput) + } + } + + return r0, r1 +} + +// DescribeQueryDefinitionsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeQueryDefinitionsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeQueryDefinitionsInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeQueryDefinitionsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeQueryDefinitionsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeQueryDefinitionsInput, ...request.Option) *cloudwatchlogs.DescribeQueryDefinitionsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeQueryDefinitionsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeQueryDefinitionsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeResourcePolicies provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeResourcePolicies(_a0 *cloudwatchlogs.DescribeResourcePoliciesInput) (*cloudwatchlogs.DescribeResourcePoliciesOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeResourcePoliciesOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeResourcePoliciesInput) *cloudwatchlogs.DescribeResourcePoliciesOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeResourcePoliciesOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeResourcePoliciesInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeResourcePoliciesRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeResourcePoliciesRequest(_a0 *cloudwatchlogs.DescribeResourcePoliciesInput) (*request.Request, *cloudwatchlogs.DescribeResourcePoliciesOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeResourcePoliciesInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeResourcePoliciesOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeResourcePoliciesInput) *cloudwatchlogs.DescribeResourcePoliciesOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeResourcePoliciesOutput) + } + } + + return r0, r1 +} + +// DescribeResourcePoliciesWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeResourcePoliciesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeResourcePoliciesInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeResourcePoliciesOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeResourcePoliciesOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeResourcePoliciesInput, ...request.Option) *cloudwatchlogs.DescribeResourcePoliciesOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeResourcePoliciesOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeResourcePoliciesInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeSubscriptionFilters provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeSubscriptionFilters(_a0 *cloudwatchlogs.DescribeSubscriptionFiltersInput) (*cloudwatchlogs.DescribeSubscriptionFiltersOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DescribeSubscriptionFiltersOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeSubscriptionFiltersInput) *cloudwatchlogs.DescribeSubscriptionFiltersOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeSubscriptionFiltersOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeSubscriptionFiltersInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DescribeSubscriptionFiltersPages provides a mock function with given fields: _a0, _a1 +func (_m *CloudWatchLogsAPI) DescribeSubscriptionFiltersPages(_a0 *cloudwatchlogs.DescribeSubscriptionFiltersInput, _a1 func(*cloudwatchlogs.DescribeSubscriptionFiltersOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeSubscriptionFiltersInput, func(*cloudwatchlogs.DescribeSubscriptionFiltersOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeSubscriptionFiltersPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *CloudWatchLogsAPI) DescribeSubscriptionFiltersPagesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeSubscriptionFiltersInput, _a2 func(*cloudwatchlogs.DescribeSubscriptionFiltersOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeSubscriptionFiltersInput, func(*cloudwatchlogs.DescribeSubscriptionFiltersOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DescribeSubscriptionFiltersRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DescribeSubscriptionFiltersRequest(_a0 *cloudwatchlogs.DescribeSubscriptionFiltersInput) (*request.Request, *cloudwatchlogs.DescribeSubscriptionFiltersOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DescribeSubscriptionFiltersInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DescribeSubscriptionFiltersOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DescribeSubscriptionFiltersInput) *cloudwatchlogs.DescribeSubscriptionFiltersOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DescribeSubscriptionFiltersOutput) + } + } + + return r0, r1 +} + +// DescribeSubscriptionFiltersWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DescribeSubscriptionFiltersWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DescribeSubscriptionFiltersInput, _a2 ...request.Option) (*cloudwatchlogs.DescribeSubscriptionFiltersOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DescribeSubscriptionFiltersOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DescribeSubscriptionFiltersInput, ...request.Option) *cloudwatchlogs.DescribeSubscriptionFiltersOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DescribeSubscriptionFiltersOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DescribeSubscriptionFiltersInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DisassociateKmsKey provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DisassociateKmsKey(_a0 *cloudwatchlogs.DisassociateKmsKeyInput) (*cloudwatchlogs.DisassociateKmsKeyOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.DisassociateKmsKeyOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DisassociateKmsKeyInput) *cloudwatchlogs.DisassociateKmsKeyOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DisassociateKmsKeyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DisassociateKmsKeyInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DisassociateKmsKeyRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) DisassociateKmsKeyRequest(_a0 *cloudwatchlogs.DisassociateKmsKeyInput) (*request.Request, *cloudwatchlogs.DisassociateKmsKeyOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.DisassociateKmsKeyInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.DisassociateKmsKeyOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.DisassociateKmsKeyInput) *cloudwatchlogs.DisassociateKmsKeyOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.DisassociateKmsKeyOutput) + } + } + + return r0, r1 +} + +// DisassociateKmsKeyWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) DisassociateKmsKeyWithContext(_a0 context.Context, _a1 *cloudwatchlogs.DisassociateKmsKeyInput, _a2 ...request.Option) (*cloudwatchlogs.DisassociateKmsKeyOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.DisassociateKmsKeyOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.DisassociateKmsKeyInput, ...request.Option) *cloudwatchlogs.DisassociateKmsKeyOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.DisassociateKmsKeyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.DisassociateKmsKeyInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FilterLogEvents provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) FilterLogEvents(_a0 *cloudwatchlogs.FilterLogEventsInput) (*cloudwatchlogs.FilterLogEventsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.FilterLogEventsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.FilterLogEventsInput) *cloudwatchlogs.FilterLogEventsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.FilterLogEventsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.FilterLogEventsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FilterLogEventsPages provides a mock function with given fields: _a0, _a1 +func (_m *CloudWatchLogsAPI) FilterLogEventsPages(_a0 *cloudwatchlogs.FilterLogEventsInput, _a1 func(*cloudwatchlogs.FilterLogEventsOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.FilterLogEventsInput, func(*cloudwatchlogs.FilterLogEventsOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// FilterLogEventsPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *CloudWatchLogsAPI) FilterLogEventsPagesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.FilterLogEventsInput, _a2 func(*cloudwatchlogs.FilterLogEventsOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.FilterLogEventsInput, func(*cloudwatchlogs.FilterLogEventsOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// FilterLogEventsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) FilterLogEventsRequest(_a0 *cloudwatchlogs.FilterLogEventsInput) (*request.Request, *cloudwatchlogs.FilterLogEventsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.FilterLogEventsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.FilterLogEventsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.FilterLogEventsInput) *cloudwatchlogs.FilterLogEventsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.FilterLogEventsOutput) + } + } + + return r0, r1 +} + +// FilterLogEventsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) FilterLogEventsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.FilterLogEventsInput, _a2 ...request.Option) (*cloudwatchlogs.FilterLogEventsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.FilterLogEventsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.FilterLogEventsInput, ...request.Option) *cloudwatchlogs.FilterLogEventsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.FilterLogEventsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.FilterLogEventsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLogEvents provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetLogEvents(_a0 *cloudwatchlogs.GetLogEventsInput) (*cloudwatchlogs.GetLogEventsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.GetLogEventsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetLogEventsInput) *cloudwatchlogs.GetLogEventsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetLogEventsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetLogEventsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLogEventsPages provides a mock function with given fields: _a0, _a1 +func (_m *CloudWatchLogsAPI) GetLogEventsPages(_a0 *cloudwatchlogs.GetLogEventsInput, _a1 func(*cloudwatchlogs.GetLogEventsOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetLogEventsInput, func(*cloudwatchlogs.GetLogEventsOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetLogEventsPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *CloudWatchLogsAPI) GetLogEventsPagesWithContext(_a0 context.Context, _a1 *cloudwatchlogs.GetLogEventsInput, _a2 func(*cloudwatchlogs.GetLogEventsOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.GetLogEventsInput, func(*cloudwatchlogs.GetLogEventsOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetLogEventsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetLogEventsRequest(_a0 *cloudwatchlogs.GetLogEventsInput) (*request.Request, *cloudwatchlogs.GetLogEventsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetLogEventsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.GetLogEventsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetLogEventsInput) *cloudwatchlogs.GetLogEventsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.GetLogEventsOutput) + } + } + + return r0, r1 +} + +// GetLogEventsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) GetLogEventsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.GetLogEventsInput, _a2 ...request.Option) (*cloudwatchlogs.GetLogEventsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.GetLogEventsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.GetLogEventsInput, ...request.Option) *cloudwatchlogs.GetLogEventsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetLogEventsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.GetLogEventsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLogGroupFields provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetLogGroupFields(_a0 *cloudwatchlogs.GetLogGroupFieldsInput) (*cloudwatchlogs.GetLogGroupFieldsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.GetLogGroupFieldsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetLogGroupFieldsInput) *cloudwatchlogs.GetLogGroupFieldsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetLogGroupFieldsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetLogGroupFieldsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLogGroupFieldsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetLogGroupFieldsRequest(_a0 *cloudwatchlogs.GetLogGroupFieldsInput) (*request.Request, *cloudwatchlogs.GetLogGroupFieldsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetLogGroupFieldsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.GetLogGroupFieldsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetLogGroupFieldsInput) *cloudwatchlogs.GetLogGroupFieldsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.GetLogGroupFieldsOutput) + } + } + + return r0, r1 +} + +// GetLogGroupFieldsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) GetLogGroupFieldsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.GetLogGroupFieldsInput, _a2 ...request.Option) (*cloudwatchlogs.GetLogGroupFieldsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.GetLogGroupFieldsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.GetLogGroupFieldsInput, ...request.Option) *cloudwatchlogs.GetLogGroupFieldsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetLogGroupFieldsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.GetLogGroupFieldsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLogRecord provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetLogRecord(_a0 *cloudwatchlogs.GetLogRecordInput) (*cloudwatchlogs.GetLogRecordOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.GetLogRecordOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetLogRecordInput) *cloudwatchlogs.GetLogRecordOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetLogRecordOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetLogRecordInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLogRecordRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetLogRecordRequest(_a0 *cloudwatchlogs.GetLogRecordInput) (*request.Request, *cloudwatchlogs.GetLogRecordOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetLogRecordInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.GetLogRecordOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetLogRecordInput) *cloudwatchlogs.GetLogRecordOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.GetLogRecordOutput) + } + } + + return r0, r1 +} + +// GetLogRecordWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) GetLogRecordWithContext(_a0 context.Context, _a1 *cloudwatchlogs.GetLogRecordInput, _a2 ...request.Option) (*cloudwatchlogs.GetLogRecordOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.GetLogRecordOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.GetLogRecordInput, ...request.Option) *cloudwatchlogs.GetLogRecordOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetLogRecordOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.GetLogRecordInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetQueryResults provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetQueryResults(_a0 *cloudwatchlogs.GetQueryResultsInput) (*cloudwatchlogs.GetQueryResultsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.GetQueryResultsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetQueryResultsInput) *cloudwatchlogs.GetQueryResultsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetQueryResultsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetQueryResultsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetQueryResultsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) GetQueryResultsRequest(_a0 *cloudwatchlogs.GetQueryResultsInput) (*request.Request, *cloudwatchlogs.GetQueryResultsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.GetQueryResultsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.GetQueryResultsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.GetQueryResultsInput) *cloudwatchlogs.GetQueryResultsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.GetQueryResultsOutput) + } + } + + return r0, r1 +} + +// GetQueryResultsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) GetQueryResultsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.GetQueryResultsInput, _a2 ...request.Option) (*cloudwatchlogs.GetQueryResultsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.GetQueryResultsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.GetQueryResultsInput, ...request.Option) *cloudwatchlogs.GetQueryResultsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.GetQueryResultsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.GetQueryResultsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListTagsLogGroup provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) ListTagsLogGroup(_a0 *cloudwatchlogs.ListTagsLogGroupInput) (*cloudwatchlogs.ListTagsLogGroupOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.ListTagsLogGroupOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.ListTagsLogGroupInput) *cloudwatchlogs.ListTagsLogGroupOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.ListTagsLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.ListTagsLogGroupInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListTagsLogGroupRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) ListTagsLogGroupRequest(_a0 *cloudwatchlogs.ListTagsLogGroupInput) (*request.Request, *cloudwatchlogs.ListTagsLogGroupOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.ListTagsLogGroupInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.ListTagsLogGroupOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.ListTagsLogGroupInput) *cloudwatchlogs.ListTagsLogGroupOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.ListTagsLogGroupOutput) + } + } + + return r0, r1 +} + +// ListTagsLogGroupWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) ListTagsLogGroupWithContext(_a0 context.Context, _a1 *cloudwatchlogs.ListTagsLogGroupInput, _a2 ...request.Option) (*cloudwatchlogs.ListTagsLogGroupOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.ListTagsLogGroupOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.ListTagsLogGroupInput, ...request.Option) *cloudwatchlogs.ListTagsLogGroupOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.ListTagsLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.ListTagsLogGroupInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutDestination provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutDestination(_a0 *cloudwatchlogs.PutDestinationInput) (*cloudwatchlogs.PutDestinationOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutDestinationOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutDestinationInput) *cloudwatchlogs.PutDestinationOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutDestinationOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutDestinationInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutDestinationPolicy provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutDestinationPolicy(_a0 *cloudwatchlogs.PutDestinationPolicyInput) (*cloudwatchlogs.PutDestinationPolicyOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutDestinationPolicyOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutDestinationPolicyInput) *cloudwatchlogs.PutDestinationPolicyOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutDestinationPolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutDestinationPolicyInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutDestinationPolicyRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutDestinationPolicyRequest(_a0 *cloudwatchlogs.PutDestinationPolicyInput) (*request.Request, *cloudwatchlogs.PutDestinationPolicyOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutDestinationPolicyInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutDestinationPolicyOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutDestinationPolicyInput) *cloudwatchlogs.PutDestinationPolicyOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutDestinationPolicyOutput) + } + } + + return r0, r1 +} + +// PutDestinationPolicyWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutDestinationPolicyWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutDestinationPolicyInput, _a2 ...request.Option) (*cloudwatchlogs.PutDestinationPolicyOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutDestinationPolicyOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutDestinationPolicyInput, ...request.Option) *cloudwatchlogs.PutDestinationPolicyOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutDestinationPolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutDestinationPolicyInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutDestinationRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutDestinationRequest(_a0 *cloudwatchlogs.PutDestinationInput) (*request.Request, *cloudwatchlogs.PutDestinationOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutDestinationInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutDestinationOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutDestinationInput) *cloudwatchlogs.PutDestinationOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutDestinationOutput) + } + } + + return r0, r1 +} + +// PutDestinationWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutDestinationWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutDestinationInput, _a2 ...request.Option) (*cloudwatchlogs.PutDestinationOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutDestinationOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutDestinationInput, ...request.Option) *cloudwatchlogs.PutDestinationOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutDestinationOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutDestinationInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutLogEvents provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutLogEvents(_a0 *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutLogEventsOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutLogEventsInput) *cloudwatchlogs.PutLogEventsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutLogEventsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutLogEventsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutLogEventsRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutLogEventsRequest(_a0 *cloudwatchlogs.PutLogEventsInput) (*request.Request, *cloudwatchlogs.PutLogEventsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutLogEventsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutLogEventsOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutLogEventsInput) *cloudwatchlogs.PutLogEventsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutLogEventsOutput) + } + } + + return r0, r1 +} + +// PutLogEventsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutLogEventsWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutLogEventsInput, _a2 ...request.Option) (*cloudwatchlogs.PutLogEventsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutLogEventsOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutLogEventsInput, ...request.Option) *cloudwatchlogs.PutLogEventsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutLogEventsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutLogEventsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutMetricFilter provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutMetricFilter(_a0 *cloudwatchlogs.PutMetricFilterInput) (*cloudwatchlogs.PutMetricFilterOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutMetricFilterOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutMetricFilterInput) *cloudwatchlogs.PutMetricFilterOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutMetricFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutMetricFilterInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutMetricFilterRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutMetricFilterRequest(_a0 *cloudwatchlogs.PutMetricFilterInput) (*request.Request, *cloudwatchlogs.PutMetricFilterOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutMetricFilterInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutMetricFilterOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutMetricFilterInput) *cloudwatchlogs.PutMetricFilterOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutMetricFilterOutput) + } + } + + return r0, r1 +} + +// PutMetricFilterWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutMetricFilterWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutMetricFilterInput, _a2 ...request.Option) (*cloudwatchlogs.PutMetricFilterOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutMetricFilterOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutMetricFilterInput, ...request.Option) *cloudwatchlogs.PutMetricFilterOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutMetricFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutMetricFilterInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutQueryDefinition provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutQueryDefinition(_a0 *cloudwatchlogs.PutQueryDefinitionInput) (*cloudwatchlogs.PutQueryDefinitionOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutQueryDefinitionOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutQueryDefinitionInput) *cloudwatchlogs.PutQueryDefinitionOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutQueryDefinitionOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutQueryDefinitionInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutQueryDefinitionRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutQueryDefinitionRequest(_a0 *cloudwatchlogs.PutQueryDefinitionInput) (*request.Request, *cloudwatchlogs.PutQueryDefinitionOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutQueryDefinitionInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutQueryDefinitionOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutQueryDefinitionInput) *cloudwatchlogs.PutQueryDefinitionOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutQueryDefinitionOutput) + } + } + + return r0, r1 +} + +// PutQueryDefinitionWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutQueryDefinitionWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutQueryDefinitionInput, _a2 ...request.Option) (*cloudwatchlogs.PutQueryDefinitionOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutQueryDefinitionOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutQueryDefinitionInput, ...request.Option) *cloudwatchlogs.PutQueryDefinitionOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutQueryDefinitionOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutQueryDefinitionInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutResourcePolicy provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutResourcePolicy(_a0 *cloudwatchlogs.PutResourcePolicyInput) (*cloudwatchlogs.PutResourcePolicyOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutResourcePolicyOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutResourcePolicyInput) *cloudwatchlogs.PutResourcePolicyOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutResourcePolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutResourcePolicyInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutResourcePolicyRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutResourcePolicyRequest(_a0 *cloudwatchlogs.PutResourcePolicyInput) (*request.Request, *cloudwatchlogs.PutResourcePolicyOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutResourcePolicyInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutResourcePolicyOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutResourcePolicyInput) *cloudwatchlogs.PutResourcePolicyOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutResourcePolicyOutput) + } + } + + return r0, r1 +} + +// PutResourcePolicyWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutResourcePolicyWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutResourcePolicyInput, _a2 ...request.Option) (*cloudwatchlogs.PutResourcePolicyOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutResourcePolicyOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutResourcePolicyInput, ...request.Option) *cloudwatchlogs.PutResourcePolicyOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutResourcePolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutResourcePolicyInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutRetentionPolicy provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutRetentionPolicy(_a0 *cloudwatchlogs.PutRetentionPolicyInput) (*cloudwatchlogs.PutRetentionPolicyOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutRetentionPolicyOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutRetentionPolicyInput) *cloudwatchlogs.PutRetentionPolicyOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutRetentionPolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutRetentionPolicyInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutRetentionPolicyRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutRetentionPolicyRequest(_a0 *cloudwatchlogs.PutRetentionPolicyInput) (*request.Request, *cloudwatchlogs.PutRetentionPolicyOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutRetentionPolicyInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutRetentionPolicyOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutRetentionPolicyInput) *cloudwatchlogs.PutRetentionPolicyOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutRetentionPolicyOutput) + } + } + + return r0, r1 +} + +// PutRetentionPolicyWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutRetentionPolicyWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutRetentionPolicyInput, _a2 ...request.Option) (*cloudwatchlogs.PutRetentionPolicyOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutRetentionPolicyOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutRetentionPolicyInput, ...request.Option) *cloudwatchlogs.PutRetentionPolicyOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutRetentionPolicyOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutRetentionPolicyInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutSubscriptionFilter provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutSubscriptionFilter(_a0 *cloudwatchlogs.PutSubscriptionFilterInput) (*cloudwatchlogs.PutSubscriptionFilterOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.PutSubscriptionFilterOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutSubscriptionFilterInput) *cloudwatchlogs.PutSubscriptionFilterOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutSubscriptionFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutSubscriptionFilterInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PutSubscriptionFilterRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) PutSubscriptionFilterRequest(_a0 *cloudwatchlogs.PutSubscriptionFilterInput) (*request.Request, *cloudwatchlogs.PutSubscriptionFilterOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.PutSubscriptionFilterInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.PutSubscriptionFilterOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.PutSubscriptionFilterInput) *cloudwatchlogs.PutSubscriptionFilterOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.PutSubscriptionFilterOutput) + } + } + + return r0, r1 +} + +// PutSubscriptionFilterWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) PutSubscriptionFilterWithContext(_a0 context.Context, _a1 *cloudwatchlogs.PutSubscriptionFilterInput, _a2 ...request.Option) (*cloudwatchlogs.PutSubscriptionFilterOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.PutSubscriptionFilterOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.PutSubscriptionFilterInput, ...request.Option) *cloudwatchlogs.PutSubscriptionFilterOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.PutSubscriptionFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.PutSubscriptionFilterInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StartQuery provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) StartQuery(_a0 *cloudwatchlogs.StartQueryInput) (*cloudwatchlogs.StartQueryOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.StartQueryOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.StartQueryInput) *cloudwatchlogs.StartQueryOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.StartQueryOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.StartQueryInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StartQueryRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) StartQueryRequest(_a0 *cloudwatchlogs.StartQueryInput) (*request.Request, *cloudwatchlogs.StartQueryOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.StartQueryInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.StartQueryOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.StartQueryInput) *cloudwatchlogs.StartQueryOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.StartQueryOutput) + } + } + + return r0, r1 +} + +// StartQueryWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) StartQueryWithContext(_a0 context.Context, _a1 *cloudwatchlogs.StartQueryInput, _a2 ...request.Option) (*cloudwatchlogs.StartQueryOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.StartQueryOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.StartQueryInput, ...request.Option) *cloudwatchlogs.StartQueryOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.StartQueryOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.StartQueryInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StopQuery provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) StopQuery(_a0 *cloudwatchlogs.StopQueryInput) (*cloudwatchlogs.StopQueryOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.StopQueryOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.StopQueryInput) *cloudwatchlogs.StopQueryOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.StopQueryOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.StopQueryInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StopQueryRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) StopQueryRequest(_a0 *cloudwatchlogs.StopQueryInput) (*request.Request, *cloudwatchlogs.StopQueryOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.StopQueryInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.StopQueryOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.StopQueryInput) *cloudwatchlogs.StopQueryOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.StopQueryOutput) + } + } + + return r0, r1 +} + +// StopQueryWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) StopQueryWithContext(_a0 context.Context, _a1 *cloudwatchlogs.StopQueryInput, _a2 ...request.Option) (*cloudwatchlogs.StopQueryOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.StopQueryOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.StopQueryInput, ...request.Option) *cloudwatchlogs.StopQueryOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.StopQueryOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.StopQueryInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TagLogGroup provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) TagLogGroup(_a0 *cloudwatchlogs.TagLogGroupInput) (*cloudwatchlogs.TagLogGroupOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.TagLogGroupOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.TagLogGroupInput) *cloudwatchlogs.TagLogGroupOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.TagLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.TagLogGroupInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TagLogGroupRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) TagLogGroupRequest(_a0 *cloudwatchlogs.TagLogGroupInput) (*request.Request, *cloudwatchlogs.TagLogGroupOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.TagLogGroupInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.TagLogGroupOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.TagLogGroupInput) *cloudwatchlogs.TagLogGroupOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.TagLogGroupOutput) + } + } + + return r0, r1 +} + +// TagLogGroupWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) TagLogGroupWithContext(_a0 context.Context, _a1 *cloudwatchlogs.TagLogGroupInput, _a2 ...request.Option) (*cloudwatchlogs.TagLogGroupOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.TagLogGroupOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.TagLogGroupInput, ...request.Option) *cloudwatchlogs.TagLogGroupOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.TagLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.TagLogGroupInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TestMetricFilter provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) TestMetricFilter(_a0 *cloudwatchlogs.TestMetricFilterInput) (*cloudwatchlogs.TestMetricFilterOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.TestMetricFilterOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.TestMetricFilterInput) *cloudwatchlogs.TestMetricFilterOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.TestMetricFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.TestMetricFilterInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TestMetricFilterRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) TestMetricFilterRequest(_a0 *cloudwatchlogs.TestMetricFilterInput) (*request.Request, *cloudwatchlogs.TestMetricFilterOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.TestMetricFilterInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.TestMetricFilterOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.TestMetricFilterInput) *cloudwatchlogs.TestMetricFilterOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.TestMetricFilterOutput) + } + } + + return r0, r1 +} + +// TestMetricFilterWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) TestMetricFilterWithContext(_a0 context.Context, _a1 *cloudwatchlogs.TestMetricFilterInput, _a2 ...request.Option) (*cloudwatchlogs.TestMetricFilterOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.TestMetricFilterOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.TestMetricFilterInput, ...request.Option) *cloudwatchlogs.TestMetricFilterOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.TestMetricFilterOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.TestMetricFilterInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UntagLogGroup provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) UntagLogGroup(_a0 *cloudwatchlogs.UntagLogGroupInput) (*cloudwatchlogs.UntagLogGroupOutput, error) { + ret := _m.Called(_a0) + + var r0 *cloudwatchlogs.UntagLogGroupOutput + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.UntagLogGroupInput) *cloudwatchlogs.UntagLogGroupOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.UntagLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.UntagLogGroupInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UntagLogGroupRequest provides a mock function with given fields: _a0 +func (_m *CloudWatchLogsAPI) UntagLogGroupRequest(_a0 *cloudwatchlogs.UntagLogGroupInput) (*request.Request, *cloudwatchlogs.UntagLogGroupOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*cloudwatchlogs.UntagLogGroupInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *cloudwatchlogs.UntagLogGroupOutput + if rf, ok := ret.Get(1).(func(*cloudwatchlogs.UntagLogGroupInput) *cloudwatchlogs.UntagLogGroupOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*cloudwatchlogs.UntagLogGroupOutput) + } + } + + return r0, r1 +} + +// UntagLogGroupWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *CloudWatchLogsAPI) UntagLogGroupWithContext(_a0 context.Context, _a1 *cloudwatchlogs.UntagLogGroupInput, _a2 ...request.Option) (*cloudwatchlogs.UntagLogGroupOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *cloudwatchlogs.UntagLogGroupOutput + if rf, ok := ret.Get(0).(func(context.Context, *cloudwatchlogs.UntagLogGroupInput, ...request.Option) *cloudwatchlogs.UntagLogGroupOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*cloudwatchlogs.UntagLogGroupOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *cloudwatchlogs.UntagLogGroupInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/pkg/eks/mocks/EC2API.go b/pkg/eks/mocks/EC2API.go index d4d89c3225..bf61ba8ab0 100644 --- a/pkg/eks/mocks/EC2API.go +++ b/pkg/eks/mocks/EC2API.go @@ -30338,6 +30338,119 @@ func (_m *EC2API) GetHostReservationPurchasePreviewWithContext(_a0 context.Conte return r0, r1 } +// GetInstanceTypesFromInstanceRequirements provides a mock function with given fields: _a0 +func (_m *EC2API) GetInstanceTypesFromInstanceRequirements(_a0 *ec2.GetInstanceTypesFromInstanceRequirementsInput) (*ec2.GetInstanceTypesFromInstanceRequirementsOutput, error) { + ret := _m.Called(_a0) + + var r0 *ec2.GetInstanceTypesFromInstanceRequirementsOutput + if rf, ok := ret.Get(0).(func(*ec2.GetInstanceTypesFromInstanceRequirementsInput) *ec2.GetInstanceTypesFromInstanceRequirementsOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*ec2.GetInstanceTypesFromInstanceRequirementsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*ec2.GetInstanceTypesFromInstanceRequirementsInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetInstanceTypesFromInstanceRequirementsPages provides a mock function with given fields: _a0, _a1 +func (_m *EC2API) GetInstanceTypesFromInstanceRequirementsPages(_a0 *ec2.GetInstanceTypesFromInstanceRequirementsInput, _a1 func(*ec2.GetInstanceTypesFromInstanceRequirementsOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*ec2.GetInstanceTypesFromInstanceRequirementsInput, func(*ec2.GetInstanceTypesFromInstanceRequirementsOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetInstanceTypesFromInstanceRequirementsPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *EC2API) GetInstanceTypesFromInstanceRequirementsPagesWithContext(_a0 context.Context, _a1 *ec2.GetInstanceTypesFromInstanceRequirementsInput, _a2 func(*ec2.GetInstanceTypesFromInstanceRequirementsOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *ec2.GetInstanceTypesFromInstanceRequirementsInput, func(*ec2.GetInstanceTypesFromInstanceRequirementsOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetInstanceTypesFromInstanceRequirementsRequest provides a mock function with given fields: _a0 +func (_m *EC2API) GetInstanceTypesFromInstanceRequirementsRequest(_a0 *ec2.GetInstanceTypesFromInstanceRequirementsInput) (*request.Request, *ec2.GetInstanceTypesFromInstanceRequirementsOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*ec2.GetInstanceTypesFromInstanceRequirementsInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *ec2.GetInstanceTypesFromInstanceRequirementsOutput + if rf, ok := ret.Get(1).(func(*ec2.GetInstanceTypesFromInstanceRequirementsInput) *ec2.GetInstanceTypesFromInstanceRequirementsOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*ec2.GetInstanceTypesFromInstanceRequirementsOutput) + } + } + + return r0, r1 +} + +// GetInstanceTypesFromInstanceRequirementsWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *EC2API) GetInstanceTypesFromInstanceRequirementsWithContext(_a0 context.Context, _a1 *ec2.GetInstanceTypesFromInstanceRequirementsInput, _a2 ...request.Option) (*ec2.GetInstanceTypesFromInstanceRequirementsOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *ec2.GetInstanceTypesFromInstanceRequirementsOutput + if rf, ok := ret.Get(0).(func(context.Context, *ec2.GetInstanceTypesFromInstanceRequirementsInput, ...request.Option) *ec2.GetInstanceTypesFromInstanceRequirementsOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*ec2.GetInstanceTypesFromInstanceRequirementsOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *ec2.GetInstanceTypesFromInstanceRequirementsInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetLaunchTemplateData provides a mock function with given fields: _a0 func (_m *EC2API) GetLaunchTemplateData(_a0 *ec2.GetLaunchTemplateDataInput) (*ec2.GetLaunchTemplateDataOutput, error) { ret := _m.Called(_a0) @@ -30876,6 +30989,119 @@ func (_m *EC2API) GetSerialConsoleAccessStatusWithContext(_a0 context.Context, _ return r0, r1 } +// GetSpotPlacementScores provides a mock function with given fields: _a0 +func (_m *EC2API) GetSpotPlacementScores(_a0 *ec2.GetSpotPlacementScoresInput) (*ec2.GetSpotPlacementScoresOutput, error) { + ret := _m.Called(_a0) + + var r0 *ec2.GetSpotPlacementScoresOutput + if rf, ok := ret.Get(0).(func(*ec2.GetSpotPlacementScoresInput) *ec2.GetSpotPlacementScoresOutput); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*ec2.GetSpotPlacementScoresOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*ec2.GetSpotPlacementScoresInput) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSpotPlacementScoresPages provides a mock function with given fields: _a0, _a1 +func (_m *EC2API) GetSpotPlacementScoresPages(_a0 *ec2.GetSpotPlacementScoresInput, _a1 func(*ec2.GetSpotPlacementScoresOutput, bool) bool) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*ec2.GetSpotPlacementScoresInput, func(*ec2.GetSpotPlacementScoresOutput, bool) bool) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetSpotPlacementScoresPagesWithContext provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *EC2API) GetSpotPlacementScoresPagesWithContext(_a0 context.Context, _a1 *ec2.GetSpotPlacementScoresInput, _a2 func(*ec2.GetSpotPlacementScoresOutput, bool) bool, _a3 ...request.Option) error { + _va := make([]interface{}, len(_a3)) + for _i := range _a3 { + _va[_i] = _a3[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1, _a2) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *ec2.GetSpotPlacementScoresInput, func(*ec2.GetSpotPlacementScoresOutput, bool) bool, ...request.Option) error); ok { + r0 = rf(_a0, _a1, _a2, _a3...) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetSpotPlacementScoresRequest provides a mock function with given fields: _a0 +func (_m *EC2API) GetSpotPlacementScoresRequest(_a0 *ec2.GetSpotPlacementScoresInput) (*request.Request, *ec2.GetSpotPlacementScoresOutput) { + ret := _m.Called(_a0) + + var r0 *request.Request + if rf, ok := ret.Get(0).(func(*ec2.GetSpotPlacementScoresInput) *request.Request); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*request.Request) + } + } + + var r1 *ec2.GetSpotPlacementScoresOutput + if rf, ok := ret.Get(1).(func(*ec2.GetSpotPlacementScoresInput) *ec2.GetSpotPlacementScoresOutput); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*ec2.GetSpotPlacementScoresOutput) + } + } + + return r0, r1 +} + +// GetSpotPlacementScoresWithContext provides a mock function with given fields: _a0, _a1, _a2 +func (_m *EC2API) GetSpotPlacementScoresWithContext(_a0 context.Context, _a1 *ec2.GetSpotPlacementScoresInput, _a2 ...request.Option) (*ec2.GetSpotPlacementScoresOutput, error) { + _va := make([]interface{}, len(_a2)) + for _i := range _a2 { + _va[_i] = _a2[_i] + } + var _ca []interface{} + _ca = append(_ca, _a0, _a1) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *ec2.GetSpotPlacementScoresOutput + if rf, ok := ret.Get(0).(func(context.Context, *ec2.GetSpotPlacementScoresInput, ...request.Option) *ec2.GetSpotPlacementScoresOutput); ok { + r0 = rf(_a0, _a1, _a2...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*ec2.GetSpotPlacementScoresOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *ec2.GetSpotPlacementScoresInput, ...request.Option) error); ok { + r1 = rf(_a0, _a1, _a2...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetSubnetCidrReservations provides a mock function with given fields: _a0 func (_m *EC2API) GetSubnetCidrReservations(_a0 *ec2.GetSubnetCidrReservationsInput) (*ec2.GetSubnetCidrReservationsOutput, error) { ret := _m.Called(_a0) diff --git a/pkg/eks/mocks/mocks.go b/pkg/eks/mocks/mocks.go index 4532882243..ff50735d62 100644 --- a/pkg/eks/mocks/mocks.go +++ b/pkg/eks/mocks/mocks.go @@ -23,5 +23,6 @@ import ( //go:generate "${GOBIN}/mockery" --tags netgo --dir=${AWS_SDK_GO_DIR}/service/sts/stsiface --name=STSAPI --output=./ //go:generate "${GOBIN}/mockery" --tags netgo --dir=${AWS_SDK_GO_DIR}/service/iam/iamiface --name=IAMAPI --output=./ //go:generate "${GOBIN}/mockery" --tags netgo --dir=${AWS_SDK_GO_DIR}/service/cloudtrail/cloudtrailiface --name=CloudTrailAPI --output=./ +//go:generate "${GOBIN}/mockery" --tags netgo --dir=${AWS_SDK_GO_DIR}/service/cloudwatchlogs/cloudwatchlogsiface --name=CloudWatchLogsAPI --output=./ //go:generate "${GOBIN}/mockery" --tags netgo --dir=${AWS_SDK_GO_DIR}/service/ssm/ssmiface --name=SSMAPI --output=./ //go:generate "${GOBIN}/mockery" --tags netgo --dir=${AWS_SDK_GO_DIR}/aws/client --name=ConfigProvider --output=./ diff --git a/pkg/eks/nodegroup_service.go b/pkg/eks/nodegroup_service.go index 6eaf1812aa..ad73d84447 100644 --- a/pkg/eks/nodegroup_service.go +++ b/pkg/eks/nodegroup_service.go @@ -70,7 +70,7 @@ func (m *NodeGroupService) Normalize(nodePools []api.NodePool, clusterMeta *api. for _, np := range nodePools { switch ng := np.(type) { case *api.ManagedNodeGroup: - hasNativeAMIFamilySupport := ng.AMIFamily == api.NodeImageFamilyAmazonLinux2 + hasNativeAMIFamilySupport := ng.AMIFamily == api.NodeImageFamilyAmazonLinux2 || ng.AMIFamily == api.NodeImageFamilyBottlerocket if !hasNativeAMIFamilySupport && !api.IsAMI(ng.AMI) { if err := ResolveAMI(m.Provider, clusterMeta.Version, np); err != nil { return err @@ -269,7 +269,7 @@ func (m *NodeGroupService) ValidateExistingNodeGroupsForCompatibility(cfg *api.C numIncompatibleNodeGroups := len(incompatibleNodeGroups) if numIncompatibleNodeGroups == 0 { - logger.Info("all nodegroups have up-to-date configuration") + logger.Info("all nodegroups have up-to-date cloudformation templates") return nil } diff --git a/pkg/eks/nodegroup_service_test.go b/pkg/eks/nodegroup_service_test.go index 81cf45d975..202e607508 100644 --- a/pkg/eks/nodegroup_service_test.go +++ b/pkg/eks/nodegroup_service_test.go @@ -47,7 +47,7 @@ var _ = Describe("Instance Selector", func() { Expect(*instanceSelectorFake.FilterArgsForCall(i).AvailabilityZones).To(Equal(isc.expectedAZs)) } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) for _, np := range isc.nodeGroups { switch ng := np.(type) { case *api.NodeGroup: diff --git a/pkg/eks/tasks.go b/pkg/eks/tasks.go index b457a8b22a..0d10e45c16 100644 --- a/pkg/eks/tasks.go +++ b/pkg/eks/tasks.go @@ -5,6 +5,9 @@ import ( "fmt" "time" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/cloudwatchlogs" + "github.com/weaveworks/eksctl/pkg/actions/identityproviders" "github.com/weaveworks/eksctl/pkg/actions/irsa" @@ -19,7 +22,7 @@ import ( "github.com/weaveworks/eksctl/pkg/addons" "github.com/weaveworks/eksctl/pkg/fargate" iamoidc "github.com/weaveworks/eksctl/pkg/iam/oidc" - "github.com/weaveworks/eksctl/pkg/utils" + instanceutils "github.com/weaveworks/eksctl/pkg/utils/instance" "github.com/weaveworks/eksctl/pkg/utils/tasks" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" @@ -225,7 +228,27 @@ func (c *ClusterProvider) CreateExtraClusterConfigTasks(cfg *api.ClusterConfig, spec: cfg, call: c.UpdateClusterConfigForLogging, }) + + if logRetentionDays := cfg.CloudWatch.ClusterLogging.LogRetentionInDays; logRetentionDays != 0 { + newTasks.Append(&clusterConfigTask{ + info: "update CloudWatch log retention", + spec: cfg, + call: func(clusterConfig *api.ClusterConfig) error { + _, err := c.Provider.CloudWatchLogs().PutRetentionPolicy(&cloudwatchlogs.PutRetentionPolicyInput{ + // The format for log group name is documented here: https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html + LogGroupName: aws.String(fmt.Sprintf("/aws/eks/%s/cluster", cfg.Metadata.Name)), + RetentionInDays: aws.Int64(int64(logRetentionDays)), + }) + if err != nil { + return errors.Wrap(err, "error updating log retention settings") + } + logger.Info("set log retention to %d days for CloudWatch logging", logRetentionDays) + return nil + }, + }) + } } + c.maybeAppendTasksForEndpointAccessUpdates(cfg, newTasks) if len(cfg.VPC.PublicAccessCIDRs) > 0 { @@ -272,16 +295,16 @@ func (c *ClusterProvider) ClusterTasksForNodeGroups(cfg *api.ClusterConfig, inst IsSubTask: false, } var needsNvidiaButNotNeuron = func(t string) bool { - return utils.IsGPUInstanceType(t) && !utils.IsInferentiaInstanceType(t) + return instanceutils.IsGPUInstanceType(t) && !instanceutils.IsInferentiaInstanceType(t) } var haveNeuronInstanceType, haveNvidiaInstanceType, efaEnabled bool for _, ng := range cfg.NodeGroups { - haveNeuronInstanceType = haveNeuronInstanceType || api.HasInstanceType(ng, utils.IsInferentiaInstanceType) + haveNeuronInstanceType = haveNeuronInstanceType || api.HasInstanceType(ng, instanceutils.IsInferentiaInstanceType) haveNvidiaInstanceType = haveNvidiaInstanceType || api.HasInstanceType(ng, needsNvidiaButNotNeuron) efaEnabled = efaEnabled || api.IsEnabled(ng.EFAEnabled) } for _, ng := range cfg.ManagedNodeGroups { - haveNeuronInstanceType = haveNeuronInstanceType || api.HasInstanceTypeManaged(ng, utils.IsInferentiaInstanceType) + haveNeuronInstanceType = haveNeuronInstanceType || api.HasInstanceTypeManaged(ng, instanceutils.IsInferentiaInstanceType) haveNvidiaInstanceType = haveNvidiaInstanceType || api.HasInstanceTypeManaged(ng, needsNvidiaButNotNeuron) efaEnabled = efaEnabled || api.IsEnabled(ng.EFAEnabled) } diff --git a/pkg/eks/update_test.go b/pkg/eks/update_test.go index e97b9af156..68c0738c14 100644 --- a/pkg/eks/update_test.go +++ b/pkg/eks/update_test.go @@ -37,7 +37,7 @@ var _ = Describe("EKS API wrapper", func() { updateClusterTagsOutput := &awseks.TagResourceOutput{} p.MockEKS().On("TagResource", mock.MatchedBy(func(input *awseks.TagResourceInput) bool { - Expect(input.Tags).ToNot(BeEmpty()) + Expect(input.Tags).NotTo(BeEmpty()) sentTags = utilsstrings.ToValuesMap(input.Tags) @@ -111,10 +111,10 @@ var _ = Describe("EKS API wrapper", func() { })).Return(describeClusterOutput, nil) p.MockEKS().On("UpdateClusterConfig", mock.MatchedBy(func(input *awseks.UpdateClusterConfigInput) bool { - Expect(input.Logging).ToNot(BeNil()) + Expect(input.Logging).NotTo(BeNil()) - Expect(input.Logging.ClusterLogging[0].Enabled).ToNot(BeNil()) - Expect(input.Logging.ClusterLogging[1].Enabled).ToNot(BeNil()) + Expect(input.Logging.ClusterLogging[0].Enabled).NotTo(BeNil()) + Expect(input.Logging.ClusterLogging[1].Enabled).NotTo(BeNil()) Expect(*input.Logging.ClusterLogging[0].Enabled).To(BeTrue()) Expect(*input.Logging.ClusterLogging[1].Enabled).To(BeFalse()) @@ -162,7 +162,7 @@ var _ = Describe("EKS API wrapper", func() { Expect(sentClusterLogging[0].Types).To(BeEmpty()) - Expect(sentClusterLogging[1].Types).ToNot(BeEmpty()) + Expect(sentClusterLogging[1].Types).NotTo(BeEmpty()) Expect(sentClusterLogging[1].Types).To(Equal(aws.StringSlice(api.SupportedCloudWatchClusterLogTypes()))) }) @@ -178,7 +178,7 @@ var _ = Describe("EKS API wrapper", func() { err = ctl.UpdateClusterConfigForLogging(cfg) Expect(err).NotTo(HaveOccurred()) - Expect(sentClusterLogging[0].Types).ToNot(BeEmpty()) + Expect(sentClusterLogging[0].Types).NotTo(BeEmpty()) Expect(sentClusterLogging[0].Types).To(Equal(aws.StringSlice(cfg.CloudWatch.ClusterLogging.EnableTypes))) Expect(sentClusterLogging[1].Types).To(BeEmpty()) @@ -196,10 +196,10 @@ var _ = Describe("EKS API wrapper", func() { err = ctl.UpdateClusterConfigForLogging(cfg) Expect(err).NotTo(HaveOccurred()) - Expect(sentClusterLogging[0].Types).ToNot(BeEmpty()) + Expect(sentClusterLogging[0].Types).NotTo(BeEmpty()) Expect(sentClusterLogging[0].Types).To(Equal(aws.StringSlice(cfg.CloudWatch.ClusterLogging.EnableTypes))) - Expect(sentClusterLogging[1].Types).ToNot(BeEmpty()) + Expect(sentClusterLogging[1].Types).NotTo(BeEmpty()) Expect(sentClusterLogging[1].Types).To(Equal(aws.StringSlice([]string{"api", "audit", "scheduler"}))) }) }) diff --git a/pkg/flux/flux_test.go b/pkg/flux/flux_test.go index 1d9f3e8a5d..24752c150b 100644 --- a/pkg/flux/flux_test.go +++ b/pkg/flux/flux_test.go @@ -2,7 +2,6 @@ package flux_test import ( "errors" - "io/ioutil" "os" "path/filepath" @@ -34,7 +33,7 @@ var _ = Describe("Flux", func() { fluxClient.SetExecutor(fakeExecutor) fakeExecutor.ExecWithOutReturns([]byte("flux version 0.13.3\n"), nil) - binDir, err := ioutil.TempDir("", "bin") + binDir, err := os.MkdirTemp("", "bin") Expect(err).NotTo(HaveOccurred()) f, err := os.Create(filepath.Join(binDir, "flux")) Expect(err).NotTo(HaveOccurred()) diff --git a/pkg/git/git.go b/pkg/git/git.go index eb632400d7..33c1871a12 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -3,7 +3,6 @@ package git import ( "fmt" - "io/ioutil" "os" "os/exec" "strings" @@ -83,7 +82,7 @@ func (git *Client) WithDir(dir string) { // CloneRepoInTmpDir clones a repo specified in the gitURL in a temporary directory and checks out the specified branch func (git *Client) CloneRepoInTmpDir(tmpDirPrefix string, options CloneOptions) (string, error) { - cloneDir, err := ioutil.TempDir(os.TempDir(), tmpDirPrefix) + cloneDir, err := os.MkdirTemp(os.TempDir(), tmpDirPrefix) if err != nil { return "", fmt.Errorf("cannot create temporary directory: %s", err) } diff --git a/pkg/git/git_test.go b/pkg/git/git_test.go index 1b7cbc13f0..09ed54f73f 100644 --- a/pkg/git/git_test.go +++ b/pkg/git/git_test.go @@ -2,7 +2,6 @@ package git_test import ( - "io/ioutil" "os" "os/exec" "strings" @@ -53,12 +52,12 @@ var _ = Describe("git", func() { // The directory was created _, err = os.Stat(tempCloneDir) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) // It can delete it err = gitClient.DeleteLocalRepo() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = os.Stat(tempCloneDir) Expect(err).To(HaveOccurred()) Expect(os.IsNotExist(err)).To(BeTrue()) @@ -115,19 +114,19 @@ var _ = Describe("git", func() { Describe("RepoName", func() { It("can parse the repository name from a URL", func() { name, err := git.RepoName("git@github.com:weaveworks/eksctl.git") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(name).To(Equal("eksctl")) name, err = git.RepoName("git@github.com:weaveworks/sock-shop.git") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(name).To(Equal("sock-shop")) name, err = git.RepoName("https://example.com/department1/team1/some-repo-name.git") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(name).To(Equal("some-repo-name")) name, err = git.RepoName("https://github.com/department1/team2/another-repo-name") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(name).To(Equal("another-repo-name")) }) }) @@ -183,7 +182,7 @@ var _ = Describe("git", func() { }) It("succeeds when a valid path is provided", func() { - privateSSHKey, err := ioutil.TempFile("", "fake_id_rsa") + privateSSHKey, err := os.CreateTemp("", "fake_id_rsa") Expect(err).To(Not(HaveOccurred())) defer os.Remove(privateSSHKey.Name()) // clean up diff --git a/pkg/gitops/profile.go b/pkg/gitops/profile.go index 62e25d42fd..de8aad840d 100644 --- a/pkg/gitops/profile.go +++ b/pkg/gitops/profile.go @@ -4,7 +4,6 @@ import ( "bufio" "fmt" "io" - "io/ioutil" "os" "path" "path/filepath" @@ -52,7 +51,7 @@ func (p *Profile) Install(clusterConfig *api.ClusterConfig) error { if err != nil { return err } - usersRepoDir, err := ioutil.TempDir("", usersRepoName+"-") + usersRepoDir, err := os.MkdirTemp("", usersRepoName+"-") if err != nil { return errors.Wrapf(err, "unable to create temporary directory for %q", usersRepoName) } diff --git a/pkg/gitops/profile_test.go b/pkg/gitops/profile_test.go index 798df75b36..2f98300c77 100644 --- a/pkg/gitops/profile_test.go +++ b/pkg/gitops/profile_test.go @@ -74,23 +74,23 @@ var _ = Describe("gitops profile", func() { Revision: "master", OutputPath: outputDir}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) template1, err := io.ReadFile(filepath.Join(outputDir, "a/good-template1.yaml")) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(template1).To(MatchYAML([]byte("cluster: test-cluster"))) template2, err := io.ReadFile(filepath.Join(outputDir, "a/b/good-template2.yaml")) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(template2).To(MatchYAML([]byte("name: test-cluster"))) }) It("can load files and ignore .git/ files", func() { err := profile.ignoreFiles(testDir) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) files, err := profile.loadFiles(testDir) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(files).To(HaveLen(4)) Expect(files).To(ConsistOf( fileprocessor.File{ @@ -150,7 +150,7 @@ metadata: files, err := profile.processFiles(inputFiles, "dir0") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(files).To(HaveLen(4)) Expect(files).To(ConsistOf( fileprocessor.File{ diff --git a/pkg/iam/arn_test.go b/pkg/iam/arn_test.go index b38c840ed0..5d294aafa6 100644 --- a/pkg/iam/arn_test.go +++ b/pkg/iam/arn_test.go @@ -10,7 +10,7 @@ var _ = Describe("iam", func() { It("determines if it is a user", func() { role := "arn:aws:iam::123456:role/testing" arn, err := Parse(role) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(arn.IsUser()).To(BeFalse()) Expect(arn.IsRole()).To(BeTrue()) @@ -18,7 +18,7 @@ var _ = Describe("iam", func() { It("determines if it is a role", func() { user := "arn:aws:iam::123456:user/testing" arn, err := Parse(user) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(arn.IsUser()).To(BeTrue()) Expect(arn.IsRole()).To(BeFalse()) diff --git a/pkg/iam/mapping.go b/pkg/iam/mapping.go index 934d912446..0defb12b0c 100644 --- a/pkg/iam/mapping.go +++ b/pkg/iam/mapping.go @@ -5,6 +5,11 @@ import ( "fmt" ) +const ( + // ResourceTypeAccount is the resource type of Accounts + ResourceTypeAccount = "account" +) + var ( // ErrNeitherUserNorRole is the error returned when an identity is missing both UserARN // and RoleARN. @@ -21,6 +26,7 @@ type Identity interface { Type() string Username() string Groups() []string + Account() string } // KubernetesIdentity represents a kubernetes identity to be used in iam mappings @@ -41,6 +47,27 @@ type RoleIdentity struct { KubernetesIdentity } +// AccountIdentity represents a mapping from an IAM role to a kubernetes identity +type AccountIdentity struct { + KubernetesAccount string `json:"account,omitempty"` + KubernetesIdentity +} + +// ARN returns the ARN of the iam mapping +func (a AccountIdentity) ARN() string { + return "" +} + +// Account returns the Account of the iam mapping +func (a AccountIdentity) Account() string { + return a.KubernetesAccount +} + +// Type returns the resource type of the iam mapping +func (a AccountIdentity) Type() string { + return ResourceTypeAccount +} + // Username returns the Kubernetes username func (k KubernetesIdentity) Username() string { return k.KubernetesUsername @@ -61,11 +88,21 @@ func (u UserIdentity) Type() string { return ResourceTypeUser } +// Account returns the Account of the iam mapping +func (u UserIdentity) Account() string { + return "" +} + // ARN returns the ARN of the iam mapping func (r RoleIdentity) ARN() string { return r.RoleARN } +// Account returns the Account of the iam mapping +func (r RoleIdentity) Account() string { + return "" +} + // Type returns the resource type of the iam mapping func (r RoleIdentity) Type() string { return ResourceTypeRole diff --git a/pkg/iam/oidc/api_test.go b/pkg/iam/oidc/api_test.go index 1b8e5883b3..b17a7ebae5 100644 --- a/pkg/iam/oidc/api_test.go +++ b/pkg/iam/oidc/api_test.go @@ -5,9 +5,9 @@ import ( "encoding/json" "encoding/pem" "fmt" - "io/ioutil" "net" "net/http" + "os" "os/exec" "github.com/aws/aws-sdk-go/aws" @@ -29,7 +29,7 @@ var _ = BeforeSuite(func() { session, err := gexec.Start(exec.Command("make", "-C", "testdata", "all"), GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) Eventually(session, 3).Should(gexec.Exit()) - rawCert, err := ioutil.ReadFile("testdata/test-server.pem") + rawCert, err := os.ReadFile("testdata/test-server.pem") Expect(err).NotTo(HaveOccurred()) block, rest := pem.Decode(rawCert) Expect(rest).To(BeEmpty()) @@ -107,7 +107,7 @@ var _ = Describe("EKS/IAM API wrapper", func() { Expect(srv.close()).To(Succeed()) Expect(err).NotTo(HaveOccurred()) - Expect(oidc.issuerCAThumbprint).ToNot(BeEmpty()) + Expect(oidc.issuerCAThumbprint).NotTo(BeEmpty()) Expect(oidc.issuerCAThumbprint).To(Equal(thumbprint)) }) @@ -128,7 +128,7 @@ var _ = Describe("EKS/IAM API wrapper", func() { Expect(srv.close()).To(Succeed()) Expect(err).NotTo(HaveOccurred()) - Expect(oidc.issuerCAThumbprint).ToNot(BeEmpty()) + Expect(oidc.issuerCAThumbprint).NotTo(BeEmpty()) Expect(oidc.issuerCAThumbprint).To(Equal(thumbprint)) }) }) @@ -231,7 +231,7 @@ var _ = Describe("EKS/IAM API wrapper", func() { Expect(exists).To(BeTrue()) document := oidc.MakeAssumeRolePolicyDocumentWithServiceAccountConditions("test-ns1", "test-sa1") - Expect(document).ToNot(BeEmpty()) + Expect(document).NotTo(BeEmpty()) expected := `{ "Version": "2012-10-17", @@ -263,7 +263,7 @@ var _ = Describe("EKS/IAM API wrapper", func() { Expect(exists).To(BeTrue()) document := oidc.MakeAssumeRolePolicyDocument() - Expect(document).ToNot(BeEmpty()) + Expect(document).NotTo(BeEmpty()) expected := `{ "Version": "2012-10-17", @@ -315,7 +315,7 @@ var _ = Describe("EKS/IAM API wrapper", func() { "cluster": "oidc", "resource": "oidc-provider", }) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) oidc.insecureSkipVerify = true var tagsInput []*awsiam.Tag @@ -374,7 +374,7 @@ var _ = Describe("EKS/IAM API wrapper", func() { oidc, err := NewOpenIDConnectManager(provider.IAM(), "12345", "https://localhost:10028/", partition, nil) oidc.insecureSkipVerify = true - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(oidc.CreateProvider()).To(Succeed()) document := oidc.MakeAssumeRolePolicyDocumentWithServiceAccountConditions("test-ns", "test-sa") @@ -398,7 +398,7 @@ var _ = Describe("EKS/IAM API wrapper", func() { }`, fmt.Sprintf("arn:%s:iam::12345:oidc-provider/localhost/", partition), expectedAudience) actual, err := json.Marshal(document) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(actual).To(MatchJSON(expected)) }, Entry("Default AWS partition", "aws", "sts.amazonaws.com"), diff --git a/pkg/info/info_test.go b/pkg/info/info_test.go index 813c86104a..c9917f5805 100644 --- a/pkg/info/info_test.go +++ b/pkg/info/info_test.go @@ -4,7 +4,7 @@ import ( "encoding/json" "strings" - semver "github.com/Masterminds/semver/v3" + "github.com/Masterminds/semver/v3" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) @@ -14,9 +14,9 @@ var _ = Describe("Info", func() { It("returns the eksctl and kubectl versions, and the host os", func() { result := GetInfo() - Expect(result.EksctlVersion).ToNot(Equal("")) - Expect(result.KubectlVersion).ToNot(Equal("")) - Expect(result.OS).ToNot(Equal("")) + Expect(result.EksctlVersion).NotTo(Equal("")) + Expect(result.KubectlVersion).NotTo(Equal("")) + Expect(result.OS).NotTo(Equal("")) _, err := semver.NewVersion(strings.TrimSpace(result.EksctlVersion)) Expect(err).NotTo(HaveOccurred()) @@ -37,9 +37,9 @@ var _ = Describe("Info", func() { err := json.Unmarshal([]byte(result), &infos) Expect(err).NotTo(HaveOccurred()) - Expect(infos.EksctlVersion).ToNot(Equal("")) - Expect(infos.KubectlVersion).ToNot(Equal("")) - Expect(infos.OS).ToNot(Equal("")) + Expect(infos.EksctlVersion).NotTo(Equal("")) + Expect(infos.KubectlVersion).NotTo(Equal("")) + Expect(infos.OS).NotTo(Equal("")) }) }) diff --git a/pkg/kubernetes/client_test.go b/pkg/kubernetes/client_test.go index aa037e04ef..631072c372 100644 --- a/pkg/kubernetes/client_test.go +++ b/pkg/kubernetes/client_test.go @@ -23,20 +23,20 @@ var _ = Describe("Kubernetes client wrappers", func() { rc, track := testutils.NewFakeRawResource(item, false, false, ct) exists, err := rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource already exists. _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) - Expect(track).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(track).NotTo(BeNil()) Expect(track.Methods()).To(Equal([]string{"GET", "GET", "GET", "PUT"})) exists, err = rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource still exists. } - Expect(ct.Updated()).ToNot(BeEmpty()) + Expect(ct.Updated()).NotTo(BeEmpty()) Expect(ct.UpdatedItems()).To(HaveLen(10)) Expect(ct.Created()).To(BeEmpty()) Expect(ct.CreatedItems()).To(BeEmpty()) @@ -50,20 +50,20 @@ var _ = Describe("Kubernetes client wrappers", func() { rc, track := testutils.NewFakeRawResource(item, false, false, ct) exists, err := rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource already exists. _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) - Expect(track).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(track).NotTo(BeNil()) Expect(track.Methods()).To(Equal([]string{"GET", "GET", "GET", "PUT"})) exists, err = rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource still exists. } - Expect(ct.Updated()).ToNot(BeEmpty()) + Expect(ct.Updated()).NotTo(BeEmpty()) Expect(ct.UpdatedItems()).To(HaveLen(10)) Expect(ct.Created()).To(BeEmpty()) Expect(ct.CreatedItems()).To(BeEmpty()) @@ -77,20 +77,20 @@ var _ = Describe("Kubernetes client wrappers", func() { rc, track := testutils.NewFakeRawResource(item, true, false, ct) exists, err := rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeFalse()) // The Kubernetes resource has not been created yet. _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) - Expect(track).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(track).NotTo(BeNil()) Expect(track.Methods()).To(Equal([]string{"GET", "GET", "POST"})) exists, err = rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource has not been created yet. } - Expect(ct.Created()).ToNot(BeEmpty()) + Expect(ct.Created()).NotTo(BeEmpty()) Expect(ct.CreatedItems()).To(HaveLen(10)) Expect(ct.Updated()).To(BeEmpty()) Expect(ct.UpdatedItems()).To(BeEmpty()) @@ -104,20 +104,20 @@ var _ = Describe("Kubernetes client wrappers", func() { rc, track := testutils.NewFakeRawResource(item, false, false, ct) exists, err := rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource already exists. _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) - Expect(track).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(track).NotTo(BeNil()) Expect(track.Methods()).To(Equal([]string{"GET", "GET", "GET", "PUT"})) exists, err = rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource still exists. } - Expect(ct.Updated()).ToNot(BeEmpty()) + Expect(ct.Updated()).NotTo(BeEmpty()) Expect(ct.UpdatedItems()).To(HaveLen(10)) Expect(ct.Created()).To(BeEmpty()) Expect(ct.CreatedItems()).To(BeEmpty()) @@ -132,24 +132,24 @@ var _ = Describe("Kubernetes client wrappers", func() { for _, item := range sampleAddons { rc, err := rawClient.NewRawResource(item) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } ct := rawClient.Collection - Expect(ct.Created()).ToNot(BeEmpty()) + Expect(ct.Created()).NotTo(BeEmpty()) Expect(ct.CreatedItems()).To(HaveLen(10)) Expect(ct.Updated()).To(BeEmpty()) Expect(ct.UpdatedItems()).To(BeEmpty()) dsl, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).List(context.TODO(), metav1.ListOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(dsl.Items).To(HaveLen(2)) awsNode, err := rawClient.ClientSet().AppsV1().DaemonSets(metav1.NamespaceSystem).Get(context.TODO(), "aws-node", metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(awsNode.Spec.Template.Spec.Containers).To(HaveLen(1)) Expect(awsNode.Spec.Template.Spec.Containers[0].Image).To( Equal("602401143452.dkr.ecr.eu-west-1.amazonaws.com/amazon-k8s-cni:v1.5.7"), @@ -191,27 +191,27 @@ var _ = Describe("Kubernetes client wrappers", func() { for _, item := range []runtime.Object{saTest1, saTest2a, saTest2b} { rc, err := rawClient.NewRawResource(item) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rc.CreateOrReplace(false) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } - Expect(ct.Created()).ToNot(BeEmpty()) + Expect(ct.Created()).NotTo(BeEmpty()) Expect(ct.CreatedItems()).To(HaveLen(10 + 2)) - Expect(ct.UpdatedItems()).ToNot(BeEmpty()) + Expect(ct.UpdatedItems()).NotTo(BeEmpty()) Expect(ct.UpdatedItems()).To(HaveLen(1)) _, err = rawClient.ClientSet().CoreV1().ServiceAccounts(metav1.NamespaceDefault).Get(context.TODO(), "test1", metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rawClient.ClientSet().CoreV1().ServiceAccounts(metav1.NamespaceDefault).Get(context.TODO(), "test2", metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rawClient.ClientSet().CoreV1().ServiceAccounts(metav1.NamespaceDefault).Create(context.TODO(), saTest1, metav1.CreateOptions{}) Expect(err).To(HaveOccurred()) err = rawClient.ClientSet().CoreV1().ServiceAccounts(metav1.NamespaceDefault).Delete(context.TODO(), "test1", metav1.DeleteOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) // saving a clientset instance results in objects being trackable, // but only as far as the clientset instance is concerned @@ -219,15 +219,15 @@ var _ = Describe("Kubernetes client wrappers", func() { // this limitation c := rawClient.ClientSet().CoreV1().ServiceAccounts(metav1.NamespaceDefault) err = c.Delete(context.TODO(), "test1", metav1.DeleteOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) err = c.Delete(context.TODO(), "test1", metav1.DeleteOptions{}) Expect(err).To(HaveOccurred()) // however deletions of raw resources are trackable rc, err := rawClient.NewRawResource(saTest1) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rc.Helper.Delete(rc.Info.Namespace, rc.Info.Name) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) _, err = rawClient.ClientSet().CoreV1().ServiceAccounts(metav1.NamespaceDefault).Get(context.TODO(), "test1", metav1.GetOptions{}) Expect(err).To(HaveOccurred()) }) @@ -240,17 +240,17 @@ var _ = Describe("Kubernetes client wrappers", func() { rc, track := testutils.NewFakeRawResource(item, false, false, ct) exists, err := rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeTrue()) // The Kubernetes resource already exists. status, err := rc.DeleteSync() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(status).To(Equal(fmt.Sprintf("deleted %q", rc))) - Expect(track).ToNot(BeNil()) + Expect(track).NotTo(BeNil()) Expect(track.Methods()).To(Equal([]string{"GET", "GET", "DELETE", "GET"})) exists, err = rc.Exists() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(exists).To(BeFalse()) // The Kubernetes resource no longer exists. } @@ -258,7 +258,7 @@ var _ = Describe("Kubernetes client wrappers", func() { Expect(ct.CreatedItems()).To(BeEmpty()) Expect(ct.Updated()).To(BeEmpty()) Expect(ct.UpdatedItems()).To(BeEmpty()) - Expect(ct.Deleted()).ToNot(BeEmpty()) + Expect(ct.Deleted()).NotTo(BeEmpty()) Expect(ct.DeletedItems()).To(HaveLen(10)) }) }) diff --git a/pkg/kubernetes/manifests_test.go b/pkg/kubernetes/manifests_test.go index a7afc5446a..a16040507e 100644 --- a/pkg/kubernetes/manifests_test.go +++ b/pkg/kubernetes/manifests_test.go @@ -1,7 +1,7 @@ package kubernetes_test import ( - "io/ioutil" + "os" "testing" . "github.com/onsi/ginkgo" @@ -15,36 +15,36 @@ var _ = Describe("Kubernetes client toolkit", func() { Context("can load and flatten deeply nested lists", func() { It("loads all items into flattened list without errors", func() { - jb, err := ioutil.ReadFile("testdata/misc-sample-nested-list-1.json") + jb, err := os.ReadFile("testdata/misc-sample-nested-list-1.json") Expect(err).To(Not(HaveOccurred())) list, err := NewList(jb) - Expect(err).ToNot(HaveOccurred()) - Expect(list).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(list).NotTo(BeNil()) Expect(list.Items).To(HaveLen(6)) }) }) Context("can load and flatten deeply nested lists", func() { It("flatten all items into an empty list without errors", func() { - jb, err := ioutil.ReadFile("testdata/misc-sample-empty-list-1.json") + jb, err := os.ReadFile("testdata/misc-sample-empty-list-1.json") Expect(err).To(Not(HaveOccurred())) list, err := NewList(jb) - Expect(err).ToNot(HaveOccurred()) - Expect(list).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(list).NotTo(BeNil()) Expect(list.Items).To(HaveLen(0)) }) }) Context("can combine empty nested lists from a multidoc", func() { It("can load without errors", func() { - yb, err := ioutil.ReadFile("testdata/misc-sample-multidoc-empty-lists-1.yaml") + yb, err := os.ReadFile("testdata/misc-sample-multidoc-empty-lists-1.yaml") Expect(err).To(Not(HaveOccurred())) list, err := NewList(yb) - Expect(err).ToNot(HaveOccurred()) - Expect(list).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(list).NotTo(BeNil()) Expect(list.Items).To(HaveLen(0)) }) }) @@ -52,35 +52,35 @@ var _ = Describe("Kubernetes client toolkit", func() { Context("can combine two empty lists from a multidoc", func() { It("can load without errors", func() { - yb, err := ioutil.ReadFile("testdata/misc-sample-multidoc-empty-lists-2.yaml") + yb, err := os.ReadFile("testdata/misc-sample-multidoc-empty-lists-2.yaml") Expect(err).To(Not(HaveOccurred())) list, err := NewList(yb) - Expect(err).ToNot(HaveOccurred()) - Expect(list).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(list).NotTo(BeNil()) Expect(list.Items).To(HaveLen(0)) }) }) Context("can combine empty and non-empty lists from a multidoc", func() { It("can load without errors", func() { - yb, err := ioutil.ReadFile("testdata/misc-sample-multidoc-nested-lists-1.yaml") + yb, err := os.ReadFile("testdata/misc-sample-multidoc-nested-lists-1.yaml") Expect(err).To(Not(HaveOccurred())) list, err := NewList(yb) - Expect(err).ToNot(HaveOccurred()) - Expect(list).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(list).NotTo(BeNil()) Expect(list.Items).To(HaveLen(4)) }) }) Context("can handle comment nodes", func() { It("should be able to parse lists with comment nodes", func() { - bytes, err := ioutil.ReadFile("testdata/list-with-comment-nodes.yaml") - Expect(err).ToNot(HaveOccurred()) + bytes, err := os.ReadFile("testdata/list-with-comment-nodes.yaml") + Expect(err).NotTo(HaveOccurred()) list, err := NewList(bytes) - Expect(err).ToNot(HaveOccurred()) - Expect(list).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(list).NotTo(BeNil()) Expect(list.Items).To(HaveLen(4)) }) }) diff --git a/pkg/kubernetes/namespace_test.go b/pkg/kubernetes/namespace_test.go index 1dd6e71246..f4a449a1b5 100644 --- a/pkg/kubernetes/namespace_test.go +++ b/pkg/kubernetes/namespace_test.go @@ -33,7 +33,7 @@ var _ = Describe("Kubernetes namespace object helpers", func() { Expect(ns.Labels).To(BeEmpty()) js, err := json.Marshal(ns) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) expected := `{ "apiVersion": "v1", @@ -54,7 +54,7 @@ var _ = Describe("Kubernetes namespace object helpers", func() { err = yaml.Unmarshal(ys, ns) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ns.APIVersion).To(Equal("v1")) Expect(ns.Kind).To(Equal("Namespace")) @@ -65,10 +65,10 @@ var _ = Describe("Kubernetes namespace object helpers", func() { It("can create namespace using fake client and check confirm that it exists", func() { err = MaybeCreateNamespace(clientSet, "ns-1") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) ok, err := CheckNamespaceExists(clientSet, "ns-1") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ok).To(BeTrue()) }) }) diff --git a/pkg/kubernetes/nodegroup_test.go b/pkg/kubernetes/nodegroup_test.go index f73679e150..7dfb19b7fa 100644 --- a/pkg/kubernetes/nodegroup_test.go +++ b/pkg/kubernetes/nodegroup_test.go @@ -41,7 +41,7 @@ var _ = Describe("NodeGroup", func() { return } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(version).To(Equal(t.expectedVersion)) }, diff --git a/pkg/kubernetes/serviceaccount_test.go b/pkg/kubernetes/serviceaccount_test.go index ce3ed30518..db736ec53e 100644 --- a/pkg/kubernetes/serviceaccount_test.go +++ b/pkg/kubernetes/serviceaccount_test.go @@ -34,7 +34,7 @@ var _ = Describe("Kubernetes serviceaccount object helpers", func() { Expect(sa.Labels).To(BeEmpty()) js, err := json.Marshal(sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) expected := `{ "apiVersion": "v1", @@ -52,19 +52,19 @@ var _ = Describe("Kubernetes serviceaccount object helpers", func() { sa := metav1.ObjectMeta{Name: "sa-1", Namespace: "ns-1"} err = MaybeCreateServiceAccountOrUpdateMetadata(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) ok, err := CheckNamespaceExists(clientSet, sa.Namespace) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ok).To(BeTrue()) ok, err = CheckServiceAccountExists(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ok).To(BeTrue()) { resp, err := clientSet.CoreV1().ServiceAccounts(sa.Namespace).Get(context.TODO(), sa.Name, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(resp.Labels).To(BeEmpty()) Expect(resp.Annotations).To(BeEmpty()) @@ -78,11 +78,11 @@ var _ = Describe("Kubernetes serviceaccount object helpers", func() { } err = MaybeCreateServiceAccountOrUpdateMetadata(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) { resp, err := clientSet.CoreV1().ServiceAccounts(sa.Namespace).Get(context.TODO(), sa.Name, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(resp.Labels).To(HaveKey("foo")) Expect(resp.Annotations).To(HaveKeyWithValue("test", "1")) @@ -92,11 +92,11 @@ var _ = Describe("Kubernetes serviceaccount object helpers", func() { sa.Annotations["test"] = "2" err = MaybeCreateServiceAccountOrUpdateMetadata(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) { resp, err := clientSet.CoreV1().ServiceAccounts(sa.Namespace).Get(context.TODO(), sa.Name, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(resp.Labels).To(HaveKey("foo")) Expect(resp.Annotations).To(HaveKeyWithValue("test", "2")) @@ -107,26 +107,26 @@ var _ = Describe("Kubernetes serviceaccount object helpers", func() { sa := metav1.ObjectMeta{Name: "sa-2", Namespace: "ns-2"} err = MaybeCreateServiceAccountOrUpdateMetadata(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) ok, err := CheckServiceAccountExists(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ok).To(BeTrue()) // should delete it err = MaybeDeleteServiceAccount(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) ok, err = CheckServiceAccountExists(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ok).To(BeFalse()) // shouldn't fail if it doesn't exist err = MaybeDeleteServiceAccount(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) ok, err = CheckServiceAccountExists(clientSet, sa) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ok).To(BeFalse()) }) }) diff --git a/pkg/managed/release_version_test.go b/pkg/managed/release_version_test.go index 23d6bffdf2..2d01dc1508 100644 --- a/pkg/managed/release_version_test.go +++ b/pkg/managed/release_version_test.go @@ -33,7 +33,7 @@ var _ = Describe("AMI Release Version", func() { Expect(err.Error()).To(ContainSubstring(vc.errMsg)) return } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(cmp).To(Equal(vc.cmp)) }, Entry("Equal", versionCase{ diff --git a/pkg/managed/service.go b/pkg/managed/service.go index 983dfba82b..be19fec7ad 100644 --- a/pkg/managed/service.go +++ b/pkg/managed/service.go @@ -19,17 +19,19 @@ import ( "github.com/pkg/errors" "github.com/tidwall/gjson" "github.com/tidwall/sjson" - "github.com/weaveworks/eksctl/pkg/version" "github.com/weaveworks/goformation/v4/cloudformation" - "github.com/weaveworks/eksctl/pkg/ami" - api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" - "github.com/weaveworks/eksctl/pkg/cfn/builder" - "github.com/weaveworks/eksctl/pkg/cfn/manager" + "github.com/weaveworks/eksctl/pkg/version" + "github.com/weaveworks/goformation/v4" gfnec2 "github.com/weaveworks/goformation/v4/cloudformation/ec2" gfneks "github.com/weaveworks/goformation/v4/cloudformation/eks" gfnt "github.com/weaveworks/goformation/v4/cloudformation/types" + + "github.com/weaveworks/eksctl/pkg/ami" + api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/cfn/builder" + "github.com/weaveworks/eksctl/pkg/cfn/manager" ) // A Service provides methods for managing managed nodegroups @@ -60,6 +62,8 @@ type UpgradeOptions struct { ForceUpgrade bool // ReleaseVersion AMI version of the EKS optimized AMI to use ReleaseVersion string + // Wait for the upgrade to finish + Wait bool } // TODO use goformation types @@ -135,7 +139,7 @@ func (m *Service) UpdateLabels(nodeGroupName string, labelsToAdd map[string]stri return err } - return m.stackCollection.UpdateNodeGroupStack(nodeGroupName, template) + return m.stackCollection.UpdateNodeGroupStack(nodeGroupName, template, true) } // GetLabels fetches the labels for a nodegroup @@ -185,12 +189,12 @@ func (m *Service) UpgradeNodeGroup(options UpgradeOptions) error { return errors.New("unexpected error: failed to find nodegroup resource in nodegroup stack") } - updateStack := func(stack *cloudformation.Template) error { + updateStack := func(stack *cloudformation.Template, wait bool) error { bytes, err := stack.JSON() if err != nil { return err } - if err := m.stackCollection.UpdateNodeGroupStack(options.NodegroupName, string(bytes)); err != nil { + if err := m.stackCollection.UpdateNodeGroupStack(options.NodegroupName, string(bytes), true); err != nil { return errors.Wrap(err, "error updating nodegroup stack") } return nil @@ -202,7 +206,8 @@ func (m *Service) UpgradeNodeGroup(options UpgradeOptions) error { } if requiresUpdate { logger.Info("updating nodegroup stack to a newer format before upgrading nodegroup version") - if err := updateStack(stack); err != nil { + // always wait for the main stack update + if err := updateStack(stack, true); err != nil { return err } } @@ -268,7 +273,7 @@ func (m *Service) UpgradeNodeGroup(options UpgradeOptions) error { ngResource.ForceUpdateEnabled = gfnt.NewBoolean(options.ForceUpgrade) logger.Info("upgrading nodegroup version") - if err := updateStack(stack); err != nil { + if err := updateStack(stack, options.Wait); err != nil { return err } logger.Info("nodegroup successfully upgraded") diff --git a/pkg/nodebootstrap/al2.go b/pkg/nodebootstrap/al2.go index b5c587fa80..241d15019f 100644 --- a/pkg/nodebootstrap/al2.go +++ b/pkg/nodebootstrap/al2.go @@ -4,6 +4,7 @@ import ( "github.com/kris-nova/logger" "github.com/pkg/errors" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/nodebootstrap/assets" ) const ( @@ -23,13 +24,13 @@ func NewAL2Bootstrapper(clusterConfig *api.ClusterConfig, ng *api.NodeGroup) *Am } func (b *AmazonLinux2) UserData() (string, error) { - var scripts []string + var scripts []script if api.IsEnabled(b.ng.EFAEnabled) { - scripts = append(scripts, "efa.al2.sh") + scripts = append(scripts, script{name: "efa.al2.sh", contents: assets.EfaAl2Sh}) } - body, err := linuxConfig(b.clusterConfig, al2BootScript, b.ng, scripts...) + body, err := linuxConfig(b.clusterConfig, al2BootScript, assets.BootstrapAl2Sh, b.ng, scripts...) if err != nil { return "", errors.Wrap(err, "encoding user data") } diff --git a/pkg/nodebootstrap/al2_test.go b/pkg/nodebootstrap/al2_test.go index ef371e4d0f..4d7ff935b4 100644 --- a/pkg/nodebootstrap/al2_test.go +++ b/pkg/nodebootstrap/al2_test.go @@ -46,7 +46,7 @@ var _ = Describe("AmazonLinux2 User Data", func() { for _, f := range cloudCfg.WriteFiles { paths = append(paths, f.Path) } - Expect(paths).ToNot(ContainElement("/var/lib/cloud/scripts/eksctl/install-ssm.al2.sh")) + Expect(paths).NotTo(ContainElement("/var/lib/cloud/scripts/eksctl/install-ssm.al2.sh")) }) }) @@ -82,7 +82,7 @@ var _ = Describe("AmazonLinux2 User Data", func() { be.ng.AMIFamily = "AmazonLinux2" bootstrapper := newBootstrapper(be.clusterConfig, be.ng) userData, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) cloudCfg := decode(userData) file := cloudCfg.WriteFiles[1] Expect(file.Path).To(Equal("/etc/eksctl/kubelet.env")) diff --git a/pkg/nodebootstrap/assets/assets.go b/pkg/nodebootstrap/assets/assets.go new file mode 100644 index 0000000000..d622110cac --- /dev/null +++ b/pkg/nodebootstrap/assets/assets.go @@ -0,0 +1,38 @@ +package assets + +import ( + // Import go:embed + _ "embed" +) + +//EksctlAl2Conf holds the eksctl.al2.conf contents +//go:embed scripts/10-eksctl.al2.conf +var EksctlAl2Conf string + +//BootstrapAl2Sh holds the bootstrap.al2.sh contents +//go:embed scripts/bootstrap.al2.sh +var BootstrapAl2Sh string + +//BootstrapHelperSh holds the bootstrap.helper.sh contents +//go:embed scripts/bootstrap.helper.sh +var BootstrapHelperSh string + +//BootstrapUbuntuSh holds the bootstrap.ubuntu.sh contents +//go:embed scripts/bootstrap.ubuntu.sh +var BootstrapUbuntuSh string + +//EfaAl2Sh holds the efa.al2.sh contents +//go:embed scripts/efa.al2.sh +var EfaAl2Sh string + +//EfaManagedBoothook holds the efa.managed.boothook contents +//go:embed scripts/efa.managed.boothook +var EfaManagedBoothook string + +//InstallSsmAl2Sh holds the install-ssm.al2.sh contents +//go:embed scripts/install-ssm.al2.sh +var InstallSsmAl2Sh string + +//KubeletYaml holds the kubelet.yaml contents +//go:embed scripts/kubelet.yaml +var KubeletYaml string diff --git a/pkg/nodebootstrap/bindata/assets/10-eksctl.al2.conf b/pkg/nodebootstrap/assets/scripts/10-eksctl.al2.conf similarity index 100% rename from pkg/nodebootstrap/bindata/assets/10-eksctl.al2.conf rename to pkg/nodebootstrap/assets/scripts/10-eksctl.al2.conf diff --git a/pkg/nodebootstrap/bindata/assets/bootstrap.al2.sh b/pkg/nodebootstrap/assets/scripts/bootstrap.al2.sh similarity index 100% rename from pkg/nodebootstrap/bindata/assets/bootstrap.al2.sh rename to pkg/nodebootstrap/assets/scripts/bootstrap.al2.sh diff --git a/pkg/nodebootstrap/bindata/assets/bootstrap.helper.sh b/pkg/nodebootstrap/assets/scripts/bootstrap.helper.sh similarity index 100% rename from pkg/nodebootstrap/bindata/assets/bootstrap.helper.sh rename to pkg/nodebootstrap/assets/scripts/bootstrap.helper.sh diff --git a/pkg/nodebootstrap/bindata/assets/bootstrap.ubuntu.sh b/pkg/nodebootstrap/assets/scripts/bootstrap.ubuntu.sh similarity index 100% rename from pkg/nodebootstrap/bindata/assets/bootstrap.ubuntu.sh rename to pkg/nodebootstrap/assets/scripts/bootstrap.ubuntu.sh diff --git a/pkg/nodebootstrap/bindata/assets/efa.al2.sh b/pkg/nodebootstrap/assets/scripts/efa.al2.sh similarity index 100% rename from pkg/nodebootstrap/bindata/assets/efa.al2.sh rename to pkg/nodebootstrap/assets/scripts/efa.al2.sh diff --git a/pkg/nodebootstrap/bindata/assets/efa.managed.boothook b/pkg/nodebootstrap/assets/scripts/efa.managed.boothook similarity index 100% rename from pkg/nodebootstrap/bindata/assets/efa.managed.boothook rename to pkg/nodebootstrap/assets/scripts/efa.managed.boothook diff --git a/pkg/nodebootstrap/bindata/assets/install-ssm.al2.sh b/pkg/nodebootstrap/assets/scripts/install-ssm.al2.sh similarity index 100% rename from pkg/nodebootstrap/bindata/assets/install-ssm.al2.sh rename to pkg/nodebootstrap/assets/scripts/install-ssm.al2.sh diff --git a/pkg/nodebootstrap/bindata/assets/kubelet.yaml b/pkg/nodebootstrap/assets/scripts/kubelet.yaml similarity index 100% rename from pkg/nodebootstrap/bindata/assets/kubelet.yaml rename to pkg/nodebootstrap/assets/scripts/kubelet.yaml diff --git a/pkg/nodebootstrap/bindata/assets.go b/pkg/nodebootstrap/bindata/assets.go deleted file mode 100644 index f72a7775d9..0000000000 --- a/pkg/nodebootstrap/bindata/assets.go +++ /dev/null @@ -1,485 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// bindata/assets/10-eksctl.al2.conf (1.025kB) -// bindata/assets/bootstrap.al2.sh (755B) -// bindata/assets/bootstrap.helper.sh (1.403kB) -// bindata/assets/bootstrap.legacy.al2.sh (1.286kB) -// bindata/assets/bootstrap.legacy.ubuntu.sh (2.275kB) -// bindata/assets/bootstrap.ubuntu.sh (597B) -// bindata/assets/efa.al2.sh (351B) -// bindata/assets/efa.managed.boothook (484B) -// bindata/assets/install-ssm.al2.sh (159B) -// bindata/assets/kubelet.yaml (480B) - -package bindata - -import ( - "bytes" - "compress/gzip" - "crypto/sha256" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo - digest [sha256.Size]byte -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _bindataAssets10EksctlAl2Conf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x52\xdf\x6b\xdb\x30\x10\x7e\xf7\x5f\x71\x90\x3e\x6c\x10\xd9\xac\x7d\x2b\xf8\xc1\x8b\xdd\x12\x96\x3a\x25\x76\xb7\xc1\x36\x8c\x2c\x5d\xd2\x23\xb2\x64\x24\x39\x69\x57\xf2\xbf\x0f\xc7\xf1\x96\xb2\x32\xf6\x26\xdd\x77\xf7\x7d\xdf\xfd\x98\x00\x6e\x9d\xf0\x8a\xb9\x16\x05\xad\x49\x80\x7b\x76\x1e\x1b\x09\xd2\x9a\x96\x91\x86\x4e\x93\x87\xb5\xb1\xb0\xed\x6a\x54\xe8\xa7\xc7\x4f\xd2\xf0\x9f\x46\xc3\x82\x74\xf7\x04\x97\xf0\x2e\x59\x5c\xbe\x0f\x26\x50\x2e\xd3\x25\xa4\xd8\x5a\x14\xdc\xa3\x9c\xc2\x9e\x94\x82\x1a\xc1\x62\x63\x76\x28\xc1\x19\xa3\x83\xe0\x5b\x81\x76\x47\x02\x7f\x04\x13\x58\x18\xc1\x15\x34\xe8\xb9\xe4\x9e\x43\xcb\x2d\x6f\xd0\xa3\x75\xd7\xb0\xca\x6e\xe7\xcb\x7c\x0a\xc9\x97\xa2\x4a\xb3\x9b\xe4\x61\x51\x56\x43\x2c\xc8\xf4\x8e\xac\xd1\x0d\x6a\x7f\x43\x0a\xe3\x08\xbd\x88\x86\x56\xa2\x91\x2b\x44\xbd\x0b\x26\x70\xab\x4c\xcd\x15\x70\x2d\xc1\x79\xee\x49\xbc\xd2\x98\x2d\x1e\x8a\x32\x5b\x55\x69\x5e\x4c\x21\x5f\xa6\x59\xb5\x48\x3e\x66\x8b\xf1\x53\x26\xf3\xbc\x2c\xfe\x29\x77\x9a\xcb\x49\x6d\x68\x47\x1b\xcd\xde\x10\x3b\x52\xce\xef\xa7\x30\xcf\x8b\x32\xc9\x67\x59\x35\x4f\xff\x8b\x5b\xf5\xac\x47\x85\x20\x7b\x42\x51\x78\x6e\x7d\x7c\xf6\x8c\x3a\x67\xa3\x9a\xf4\x58\x00\xdf\x03\x00\xc6\xb4\x91\xc8\xa8\x8d\x2f\x5e\x4e\xca\x87\x73\x40\xf1\x1a\x95\x1b\xc1\xa1\xed\xc3\x94\xab\xf6\x91\x87\x83\x7e\x48\x26\x22\xed\x3c\xd7\x02\x19\xc9\xf8\xe2\xe5\xcc\xf8\xc8\xd5\xf0\x27\xd6\x1a\xd9\x13\xdd\x25\x5f\xab\xfb\x65\x5a\x8c\x90\xc5\x0d\x39\x8f\xf6\xa8\x17\x7b\xdb\xe1\x79\x70\x4f\xfe\x91\x79\x4e\xda\xff\x36\x31\x8c\x7b\x2c\x17\xca\x74\x92\xb5\xd6\xec\x48\xa2\x8d\xf9\xde\x8d\x80\xd1\x7d\x1d\x5a\x66\x3b\xed\xa9\xc1\x58\x1a\xb1\x45\x3b\x76\x87\x7e\x6f\xec\x96\xb5\xaa\xdb\x90\x8e\x85\xa6\xb1\x4e\x13\xab\x49\x33\x49\x36\x8e\x4c\xeb\x23\xa1\xa9\x1f\xdb\x19\x2c\x8c\x5e\x0f\x78\xbf\x86\x1e\xd7\xe8\x43\x79\xca\x68\x8d\x64\xa4\xd7\x96\x9f\x59\xa0\x86\x6f\x30\xbe\x78\xe9\xaf\x34\xfb\x54\x54\xd9\x6c\x55\x25\xb3\xd9\xf2\x21\x2f\x0f\xa1\xdc\xda\x10\x85\x0d\x07\xf8\xf5\x11\x1f\x4e\xd1\x22\x5b\x7d\x9e\xcf\xb2\xa2\x4a\x97\x77\xc9\x3c\x3f\xf4\xcb\x8f\x5a\xde\x39\xbc\xbe\x0a\xaf\x18\x6e\x5d\xdd\x91\x92\xe1\x87\x93\x89\x7e\xc7\xbd\x4d\xda\xfc\x75\x2b\x43\x38\x7c\xe6\x8d\xfa\x33\xaa\xb7\x12\xfb\xa3\xea\xb3\x82\x5f\x01\x00\x00\xff\xff\x04\xfc\xe9\x45\x01\x04\x00\x00") - -func bindataAssets10EksctlAl2ConfBytes() ([]byte, error) { - return bindataRead( - _bindataAssets10EksctlAl2Conf, - "bindata/assets/10-eksctl.al2.conf", - ) -} - -func bindataAssets10EksctlAl2Conf() (*asset, error) { - bytes, err := bindataAssets10EksctlAl2ConfBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/10-eksctl.al2.conf", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb0, 0x2b, 0x5f, 0x5a, 0xc4, 0x94, 0x74, 0x90, 0x34, 0x26, 0x3b, 0xc9, 0x7, 0x3f, 0x89, 0x8f, 0xe9, 0x6f, 0xe5, 0x33, 0x58, 0x2b, 0x82, 0x48, 0xd, 0xca, 0x2b, 0x91, 0x5f, 0x6f, 0x4a, 0xab}} - return a, nil -} - -var _bindataAssetsBootstrapAl2Sh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x92\xd1\x6a\xdb\x4c\x10\x85\xef\xf7\x29\xe6\xd7\x1f\x30\x14\x56\x6a\x21\xe4\xa2\x17\x05\xc5\x55\x83\xa9\xa3\x04\x59\x2e\x81\x34\x88\xd5\x6a\x6c\x6f\x2c\xed\xaa\x3b\x23\x93\x12\xfc\xee\x65\xdb\x5a\x71\x9d\x5c\xee\xcc\x77\xce\xcc\x1c\xf6\xff\xff\x92\xda\xd8\xa4\x56\xb4\x11\x82\x90\x41\x3a\x40\xef\xf1\xc9\xf0\xe1\xd9\x9b\x1e\x57\xca\xb4\x87\xb7\x75\x83\x25\x64\x21\xc8\x0d\x5e\x23\x24\x3b\xe5\x93\xd6\xd4\x89\x6e\xdd\xd0\x24\xa4\xbd\xe9\x99\x12\xdc\x92\xe6\x36\xa9\x9d\x63\x62\xaf\xfa\x78\x83\x6d\x8f\x3e\x0e\x83\x50\x6f\x1c\x44\x7f\x88\x8f\xe0\x07\x6b\x8d\x5d\x43\x82\xac\x83\xec\x45\x13\x89\xd7\xb5\x98\x36\x10\x9d\x3d\x4f\xe7\xcb\x45\x99\x15\x55\x9e\x5e\x67\xfb\x08\xbe\x0b\x00\x29\x55\x6f\x08\xfd\x0e\xbd\x44\xdb\xf4\xce\x58\x0e\x68\x7a\x3b\xab\x16\x59\xf1\x2d\x2b\xaa\x65\x31\x1f\xe1\xfa\xe2\x5c\xea\x76\x20\x46\x2f\xb5\x0a\xe0\xe5\xc5\x79\x75\xf0\x9d\xa6\x23\xd8\x58\x1a\x41\xd3\x1f\x0f\xff\x9c\x2f\x46\x6a\x3b\xd4\xd8\x22\x4b\x7c\x62\xaf\xa4\xf2\x6b\x0a\xe4\xd7\xe5\x65\x36\xcf\xca\x2a\xbb\x2b\x8b\xb4\x4a\x8b\xab\x17\x81\x76\x96\x95\xb1\xe8\xa5\x1f\x2c\x9b\x0e\x7f\x3b\xdf\xe4\x65\x3a\xcb\xb3\xa2\x2a\x96\x79\x39\x0b\xb7\x9d\xc6\xd5\xa1\x5f\x87\xb8\x06\x42\x0f\xae\x67\xe3\x2c\x81\xb1\xec\xe0\xb0\x82\x76\x76\x65\xd6\xf1\x23\x39\x1b\x89\x90\x19\x4c\x7c\x07\x72\x05\x67\xcf\xe5\xf5\x6d\x15\x76\xaa\xa6\x37\xf9\x97\xfd\x04\xb2\xbb\x59\x29\x1e\x7f\x80\x24\x98\xc4\xf7\xef\x1f\xe0\x1d\xc4\xf7\x1f\x1e\x26\xc7\xbb\x07\x74\x76\xb5\x8f\x5e\xdf\x33\x76\x3e\x85\xde\xbf\xde\x91\xe8\x76\x6f\x54\xdf\x32\x16\x82\x7e\x12\x63\xa7\xb9\x85\x46\x61\xe7\xac\xf4\xd8\x3a\xd5\x9c\x7e\x14\x24\x56\x9e\xc3\xf1\x63\xda\x5b\x8a\x8e\xd4\x7f\x89\x43\xfb\x44\xdf\x38\x8b\x91\xf8\x15\x00\x00\xff\xff\xb9\x79\x57\x7c\xf3\x02\x00\x00") - -func bindataAssetsBootstrapAl2ShBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsBootstrapAl2Sh, - "bindata/assets/bootstrap.al2.sh", - ) -} - -func bindataAssetsBootstrapAl2Sh() (*asset, error) { - bytes, err := bindataAssetsBootstrapAl2ShBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/bootstrap.al2.sh", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0x1a, 0x18, 0x7b, 0x3b, 0xc, 0x5a, 0xfe, 0xcd, 0xaf, 0x4a, 0x56, 0xd7, 0xbb, 0x38, 0x7e, 0x27, 0xdf, 0x36, 0xa8, 0x4d, 0x27, 0x12, 0xce, 0x6d, 0x48, 0x6f, 0x84, 0xab, 0x31, 0x57, 0xc9}} - return a, nil -} - -var _bindataAssetsBootstrapHelperSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x54\x7f\x6f\xda\x48\x10\xfd\x7f\x3f\xc5\xdc\x82\x9a\xa0\xcb\xe2\x36\xea\x45\x3a\x24\xa4\x23\xe0\xf6\xac\x12\x83\xc0\x9c\x72\x8a\x22\x6b\xb1\x87\xb0\xc5\xec\x5a\xbb\xe3\x92\x2a\xf2\x77\x3f\xd9\xc4\x89\xc9\xa9\xf9\x6b\x3d\x3f\xde\x9b\x37\xe3\xd1\x74\x7e\xf3\xd6\x4a\x7b\x6b\xe9\xb6\x8c\x39\x24\x10\x06\xd0\x5a\x7c\x54\xd4\x98\xb9\xca\x71\x23\x55\xd6\xd8\xda\x14\xda\x21\x31\xe6\x4c\x61\x13\x04\x0f\x29\xf1\x70\xe7\x12\xca\xbc\x5d\xb1\xc6\x0c\xa9\x8f\xfa\x07\x74\x60\xa3\x32\x84\x83\x55\x44\xa8\x61\xfd\x13\xd6\xc6\x90\x23\x2b\xf3\x1c\x2d\x63\x1d\x58\x39\x84\xe0\x66\xb2\xfc\x71\x09\x64\xe0\x01\x09\xf6\x48\x32\x95\x24\x59\x34\xfb\xe6\x87\x43\xde\x3d\x4f\x0a\x9b\x81\x10\x4e\x65\xa8\x09\xc4\x2d\xcc\x57\x11\x88\xbf\x81\xdf\x0a\x79\x70\x02\x93\x4b\xd1\x80\x04\x99\x1d\x6a\x41\x94\x09\x87\x89\xd1\xa9\x1b\xc0\xd5\xc7\x8f\x1c\xb6\x44\xf9\xc0\xf3\x3e\x5d\xfd\xd9\xbf\xfc\xe3\x73\xff\xf9\xf5\x32\x49\xe8\xc8\x93\xb9\xf2\x6a\x64\x8f\xb3\x4d\xa1\x13\x52\x46\x57\x62\xe2\x86\xf7\xbc\x07\x4f\x0c\xe0\x8d\x92\x77\x24\x0c\xa0\x5b\xeb\xe7\xc0\xdf\x2f\x5d\xc1\x44\x85\xf3\xba\x9f\x38\x2b\x19\x1b\xcd\x83\x78\xe9\x2f\xfe\xf1\x17\xf1\x6a\x31\x1d\xf2\xee\xd3\xa9\xa7\xe4\xec\xfa\xea\x73\x3c\x9e\xae\x96\x91\xbf\x88\xc7\xa3\x2a\xe5\xd4\x53\x72\x16\x84\xcb\x68\x14\x8e\xfd\x38\x98\x54\x23\x6c\xf7\x02\x4a\x3b\x92\x3a\x41\xa1\xd2\x5e\x2b\x73\x1a\x7c\xf1\xc7\xff\x8e\xa7\xfe\xaf\x01\x99\xda\xa0\x48\x7e\x26\x19\xf6\x38\x6b\xea\x4d\xc2\x65\x25\xa1\x65\x0e\x44\xc9\x59\x38\x9b\xf8\x71\x34\x0a\xc2\xa8\x0e\xb7\xcc\x3a\x7c\x33\xba\x8d\xe7\xb3\x49\x1d\x6b\xbe\x5f\x71\xd3\xd1\xb5\x3f\x7d\xc5\x1d\xcd\xf2\x42\x9b\xf4\x28\xa2\xd6\x30\xec\x3e\xfd\x5f\x7c\x79\x21\xb3\x7c\x2b\xfb\xc7\x6d\xec\x2b\xe3\xb5\xda\x6d\x23\x82\x49\xc9\x19\xfb\xb6\xba\xf6\xa7\x7e\x14\x8f\x16\x5f\x97\xc3\x73\x2e\xc4\xb1\x84\x5c\x63\xe6\x86\xa7\xd5\x79\x8f\xdd\xdd\x81\xd0\x70\xda\x4d\xc9\xe1\xfe\x1e\x3e\x7c\x80\x36\xd5\xef\x35\x97\xc5\x07\xe5\x08\xad\x38\x28\xda\x0a\x92\x4a\xd3\x0b\x69\x03\xee\xb1\x0e\x08\xb1\x97\x8f\x22\x37\xa9\x03\xe9\x40\xc2\x78\x1a\x80\xb4\x0f\xc5\xbe\xda\x32\xe5\x20\xc5\xdc\x62\x22\x09\xd3\x0b\xa0\xad\x72\x95\x4f\xc2\xc1\xd8\x9d\xb4\xa6\xd0\x29\x14\x9a\x54\x06\x07\x7c\xcd\x04\x57\xe4\xb9\xb1\x04\x1b\x63\x61\x2f\x1f\xe7\x26\x75\x73\xb4\xa1\x49\xf1\xb5\x8b\x66\xee\xef\xb4\xd0\x08\x1b\xb6\xb3\x7b\x2f\x63\xf3\x6f\xa3\xc5\xe8\x38\x3c\xde\x7d\x6a\xc3\xef\xfe\xba\xaf\xe6\xdb\x6c\x45\x38\xba\xf1\xdb\x5b\x52\xd9\x25\x7f\xe1\x19\xcf\xc2\x2f\xc1\xd7\xe1\x59\x7d\x48\xaa\x0b\x62\x35\x12\xba\xe6\x98\x34\xaf\x48\x8c\xde\xa8\x87\xfe\x77\x67\xf4\xd9\x1b\x11\x27\x14\xa7\xb7\x48\xe0\x23\x59\xf9\x8c\x8a\x6e\xe6\x71\x85\xac\x01\xc3\x33\x8f\xf6\xf9\x09\xfd\x73\xda\x78\x16\x56\xbf\xc8\x5f\xc4\x8b\x55\x18\x05\xcf\xea\xdf\x3a\x07\x22\x35\xc9\x0e\x6d\x5a\x72\xe8\x40\x8a\x1b\x59\x64\xc7\x99\xcb\xec\x12\xbe\x17\x8e\x40\x69\x48\xa4\xc3\x0b\xd0\x86\xa0\x70\x98\x56\x9e\x62\x5d\x68\x2a\xd8\x7f\x01\x00\x00\xff\xff\xf7\xbf\x51\x00\x7b\x05\x00\x00") - -func bindataAssetsBootstrapHelperShBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsBootstrapHelperSh, - "bindata/assets/bootstrap.helper.sh", - ) -} - -func bindataAssetsBootstrapHelperSh() (*asset, error) { - bytes, err := bindataAssetsBootstrapHelperShBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/bootstrap.helper.sh", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x45, 0x8c, 0xa1, 0xd0, 0x1e, 0x75, 0xe, 0x4b, 0x2f, 0x73, 0xb3, 0x29, 0x78, 0xe7, 0x17, 0x48, 0xff, 0x1e, 0x0, 0xa7, 0xca, 0xe1, 0x49, 0x7b, 0x15, 0x9c, 0xb8, 0xf8, 0x11, 0x53, 0x96, 0x8a}} - return a, nil -} - -var _bindataAssetsBootstrapLegacyAl2Sh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x93\x61\x4f\x02\x47\x10\x86\xbf\xef\xaf\x98\x1e\x17\x23\xa9\xcb\xa9\xb1\x26\xa2\x34\xa1\xdc\x99\x5e\x8a\x40\x0a\xb6\x1a\x63\x2f\xcb\xde\x50\x36\x2e\xbb\x97\xdb\x01\x35\xe4\xfa\xdb\x9b\xc5\xc3\x82\x5a\x3f\xc1\xcc\xbc\xb3\xf3\xee\x33\xb7\x8d\x1f\xa2\xa9\x32\xd1\x54\xb8\x39\x6b\xc0\x64\x18\x0f\x21\xc6\xa2\x44\x29\x08\xf3\x23\x78\x56\x5a\xc3\x14\xa1\xc4\x85\x5d\x61\x0e\xce\x5a\xc3\x98\x43\x02\x6e\x01\xcb\x12\x5f\x14\x6d\xc3\x42\x15\x38\x13\x4a\x6f\x63\x63\x97\xc6\x21\x31\x36\x5b\x1a\x49\xca\x1a\xf8\x1b\x29\x5b\x88\x97\xac\xb0\xb9\x3b\x6c\xc2\x9a\x01\x3c\xcf\x95\xf6\xc7\x8b\x1c\x94\x71\x24\x8c\xc4\x8c\x5e\x0b\x04\xaf\xb9\x84\xdc\x32\x00\x00\x35\x03\x78\x78\x80\x20\x5c\xef\x89\xaa\x00\x3a\x1d\x9f\x3d\xa9\x02\x78\x7c\x84\x83\x83\x5a\xe5\x9b\x7d\xf1\x1f\xf8\xeb\xe1\x98\x5f\x3c\xfe\x18\xfa\xf2\x25\xd0\x1c\xcd\xe6\x40\x00\x94\x73\x0b\xb5\xb2\x4e\x95\x48\xcb\xf2\xad\x3e\x53\x0c\x20\xb7\x06\xe1\x0a\x22\x24\x19\xe1\x93\x93\xa4\xa3\xad\xfb\xd6\x42\x14\xac\x62\xac\x01\xb7\x0e\x21\xbd\x89\xc7\xab\x53\x20\xeb\x6f\x08\x0b\x24\x91\x0b\x12\x6c\x32\xfc\x2d\x19\x74\x82\xf0\x50\x2e\x4b\x0d\x9c\x3b\xa5\xd1\x10\xf0\x3b\x18\xdd\x4e\x80\xff\x0a\xc1\x1d\x17\xcf\x8e\xa3\x3c\xe5\xdb\x26\x4e\xf6\x09\x0d\x27\xd2\xdc\xa1\xb4\x26\x77\x6d\x38\x3f\x3e\x0e\x60\x4e\x54\xb4\xa3\xe8\xe4\xfc\xa2\x75\xfa\xd3\x59\xab\xfe\x8d\xb4\x20\x74\x14\x89\x42\x45\x9b\xce\x66\xf0\x01\x77\x7d\x6e\x8d\xfb\x83\x93\x6f\x2c\xb4\x21\xdc\xf8\x0f\x20\xf8\x7e\xb4\x6f\xe3\xbe\x2f\x0a\x4f\x02\xcf\x64\x30\x8c\x93\x2c\x1d\xf9\x8b\xef\x3a\x00\x6d\xa5\xd0\x5c\x15\xab\xb3\x66\xc0\xd2\xc1\x78\xd2\x1d\xf4\x92\x2c\x8d\x3f\x09\xb7\x3b\xe6\x2a\xdf\x55\x4e\xee\x47\xc9\xff\x6b\xfd\xf7\xd0\x0c\x58\xf7\xcf\x71\x36\x4e\x7e\xff\x23\xed\x25\xe3\x2c\x1e\xde\x74\xd3\xc1\xa7\x1e\x87\xe5\x4a\x49\x74\x51\x6e\x17\x42\x79\x64\x8c\x39\xbb\x2c\x25\xee\xed\xfa\x69\x39\x45\x8d\xd4\x42\xb3\x82\x06\xd0\x5c\x39\x90\xc2\x80\x5d\x61\x59\xaa\x1c\xe1\xa6\x7b\x97\x8d\x86\xf1\x98\xfd\x67\xb1\x9f\x5e\x27\xbd\xfb\x5e\xff\x1b\x9f\x5a\xcd\x90\xcb\x57\xa9\xbd\xdb\x0d\xaa\x7e\xf7\x97\xa4\x3f\xee\x04\xe1\x7a\x27\xac\x8e\x8c\xcd\xdf\xd4\x1b\x71\x27\x5c\x7f\x9e\x52\x79\xe7\x52\x10\xfc\xfc\xa5\xf1\x0d\xf0\x8d\xfd\xab\xab\x64\x78\xfd\xbe\x98\x7a\x50\x3a\xaa\xf6\xd6\xb0\x33\x21\x8d\xab\x0f\xdc\x77\x8a\x3e\xae\xbe\x04\x1d\xae\xbf\xc8\x56\x6c\x0b\xaa\x13\xae\xb7\x7f\xdb\xbc\xe6\x53\xbf\x27\xff\x68\xf7\x07\x04\xcd\x6a\x0f\xcf\x3e\x1d\xe6\xef\xc3\xdc\xab\x23\x5c\x48\xd2\x90\x0b\x5c\x58\xc3\x4b\xd4\x56\xe4\x3b\x79\x34\x62\xaa\x11\x6a\x22\x3b\x05\x47\xa2\xa4\xf7\xfc\xbf\x01\x00\x00\xff\xff\x46\x01\xeb\xc2\x06\x05\x00\x00") - -func bindataAssetsBootstrapLegacyAl2ShBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsBootstrapLegacyAl2Sh, - "bindata/assets/bootstrap.legacy.al2.sh", - ) -} - -func bindataAssetsBootstrapLegacyAl2Sh() (*asset, error) { - bytes, err := bindataAssetsBootstrapLegacyAl2ShBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/bootstrap.legacy.al2.sh", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x35, 0xb1, 0x58, 0xf5, 0xe6, 0x40, 0x92, 0xbe, 0xa6, 0x27, 0xc2, 0xfc, 0xbd, 0xc2, 0xe8, 0x54, 0x5e, 0x40, 0x37, 0x77, 0x73, 0x87, 0x9, 0xf, 0x97, 0xc4, 0xbc, 0x10, 0x5, 0x1b, 0x44, 0xf8}} - return a, nil -} - -var _bindataAssetsBootstrapLegacyUbuntuSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x55\xf1\x6f\x1a\xb9\x12\xfe\xdd\x7f\xc5\xbc\x0d\xea\x0b\x7a\x31\xdb\xa4\x7d\x95\x9a\x96\xd3\x71\x81\xde\xa1\xa6\x10\x15\x72\xd7\x2a\xca\x21\x63\x0f\x59\x0b\xaf\xbd\xb2\x67\xa1\x51\xc4\xfd\xed\x27\x2f\xbb\x84\xd0\x36\x3f\xb1\xf6\xf7\xcd\xf8\xf3\xf8\x9b\xe1\xe8\x3f\xe9\x5c\xdb\x74\x2e\x42\xc6\x8e\x60\x3a\xee\x8f\xa1\x8f\x85\x47\x29\x08\xd5\x09\xac\xb5\x31\x30\x47\xf0\x98\xbb\x15\x2a\x08\xce\x59\xc6\x02\x12\x70\x07\xe8\x3d\x7e\xd3\xd4\x2c\x0b\x5d\xe0\x42\x68\xd3\xac\xad\x2b\x6d\x40\x62\x6c\x51\x5a\x49\xda\x59\xb8\x43\x9a\xe5\xe2\xdb\xac\x70\x2a\x1c\xb7\xe1\x81\x01\xac\x33\x6d\x62\x7a\xa1\x40\xdb\x40\xc2\x4a\x9c\xd1\x7d\x81\x10\x39\xef\x40\x39\x06\x00\xa0\x17\x00\x37\x37\x90\xb4\x1e\x9e\x90\x36\x09\x74\xbb\x71\xf7\x74\x93\xc0\xed\x2d\xbc\x78\x51\xb3\x62\x70\x04\xff\x81\xbf\x6f\x5e\xf2\xb7\xb7\xff\x6b\x45\xf8\x1d\x50\x86\xb6\x4a\x08\x80\x32\x73\x50\x33\xdf\xd5\x7b\x1e\xa9\xf4\x5b\xc2\x42\x33\x00\xe5\x2c\xc2\x7b\x48\x91\x64\x8a\xcb\x20\xc9\xa4\x8d\xfc\x4e\x2e\x0a\xb6\x61\xec\x08\xae\x03\xc2\xf0\x53\x7f\xb2\x3a\x03\x72\xf1\x8a\x90\x23\x09\x25\x48\xb0\xe9\xf8\xe3\x60\xd4\x4d\x5a\xc7\xb2\xf4\x06\x38\x0f\xda\xa0\x25\xe0\x5f\xe0\xea\x7a\x0a\xfc\x0f\x48\xbe\x70\xb1\x0e\x1c\xe5\x19\x6f\x82\x38\xb9\x25\x5a\x4e\x64\x78\x40\xe9\xac\x0a\xe7\xf0\xe6\xe5\xcb\x04\x32\xa2\xe2\x3c\x4d\x4f\xdf\xbc\xed\x9c\xfd\xff\x75\xa7\xfe\x4d\x8d\x20\x0c\x94\x8a\x42\xa7\x55\x64\x3b\x39\xa8\x77\x9d\xb7\xae\xf7\x81\x92\x67\x24\x9c\x43\xab\xd2\x9f\x40\xf2\xfc\xd1\x31\x8c\xc7\xb8\xb4\x75\x9a\xc4\x9a\x8c\xc6\xfd\xc1\x6c\x78\x15\x2f\xbe\xaf\x00\x8c\x93\xc2\x70\x5d\xac\x5e\xb7\x13\x36\x1c\x4d\xa6\xbd\xd1\xc5\x60\x36\xec\x7f\x47\x6c\x1e\x99\x6b\xb5\xcf\x9c\x7e\xbd\x1a\xfc\x9c\x1b\x0d\xd1\x4e\x58\xef\xaf\xc9\x6c\x32\xf8\xfc\xe7\xf0\x62\x30\x99\xf5\xc7\x9f\x7a\xc3\xd1\x77\x31\x01\xfd\x4a\x4b\x0c\xa9\x72\xb9\xd0\xb1\x64\x2c\xb8\xd2\x4b\x7c\xf2\xd4\xcb\x72\x8e\x06\xa9\x83\x76\x05\x47\x40\x99\x0e\x20\x85\x05\xb7\x42\xef\xb5\x42\xf8\xd4\xfb\x32\xbb\x1a\xf7\x27\x8c\x3d\x4a\xbc\x1c\x7e\x18\x5c\x7c\xbd\xb8\x7c\x46\xa7\xd1\x0b\xe4\xf2\x5e\x9a\xa8\x96\x49\x41\xf0\xcb\x0f\x8f\xad\xaa\x55\x1d\xfe\xfe\xfd\x60\xfc\x61\x57\xd5\xd6\x43\xfd\xb5\x79\x52\xc3\xd6\xc3\xde\x6a\x73\x50\xb4\x3d\x30\xae\x37\xac\xd1\xde\x6d\x3d\x34\x9f\xe7\xbc\x56\x5c\x3b\x3c\xf6\xd1\xd3\xa8\xa4\xbd\x61\x51\x09\x0b\x56\x14\x20\x8c\x16\x01\x6a\xb5\x1c\x97\xa1\x53\x7f\x37\x7b\x87\x34\x49\x66\x47\x93\x64\x9a\xbd\x2d\x2d\x90\x2b\xf6\x93\xb1\x70\x1f\x08\xf3\xc8\xf3\x18\x90\x78\x9c\x2c\xa8\x18\x3b\x66\x00\xdb\x41\x75\x1e\xdb\x39\x20\x84\xcc\x95\x46\xc5\x29\x65\x9c\x5b\xa2\x02\x41\x80\x2b\xf4\xf7\x40\x3a\xc7\x26\x29\x04\x12\x9e\x02\x94\xc5\x49\x95\x61\x9d\x69\x99\x81\x0e\xb0\xce\x04\xc1\x1a\x41\x39\xd0\x16\x7a\x97\x67\x70\xbc\xc3\xe6\x22\xa0\x02\x67\xa1\x30\x42\x5b\xd8\x6a\x52\xdb\x04\xc2\x2a\xc8\x51\x58\x8a\x6d\x3f\x8f\x03\xcb\x93\x98\x1b\x8c\xcb\xdc\x05\x6a\xd8\xa0\x74\x20\xef\x42\xfb\x04\xe6\x25\x81\xa6\xff\x86\x2a\xde\x3a\x02\x69\x50\x78\xc8\xdc\x3a\x06\x19\x27\x54\x7d\xa5\x85\x77\xf9\xa3\xf0\x58\x9f\xb5\xa6\xcc\x95\x04\x99\x58\x69\x7b\x57\x25\x20\x07\xb2\x0c\xe4\x72\x1d\x30\xc6\x6d\x89\x9a\x02\x9a\x05\x03\x78\xc6\xd1\x3b\x6b\x3d\x4f\xfb\x29\xa1\x31\x75\xc5\x60\x00\x0b\x23\xee\x42\xf7\xb8\x1a\x9c\x89\x75\x0a\xb9\x2e\xf6\x7c\x9a\x6c\x81\x5c\x7c\xe3\xd1\x58\x7b\x9e\x6b\xa0\x2a\xc6\x88\x39\x9a\xd0\xc4\x5d\xf6\x7e\x1b\x5c\x4e\x36\x27\xc2\x14\x99\xe8\x6c\x0f\xee\x68\x97\xee\xcd\x86\x03\xcf\x9f\x6c\xb3\xe8\x05\x56\xdd\xb5\x8f\xee\xda\xb2\x39\xb0\x70\x8a\x6b\xbb\xf0\x82\x4b\x67\x49\x68\x8b\x9e\xeb\x5c\xdc\xc5\xa8\x38\x41\x06\x1f\x27\xb3\xc1\xc5\xe7\x59\xef\xe2\x62\x7c\x3d\x9a\x6e\x3a\x6a\xe9\x3b\x28\x7d\x67\x0b\xf7\x07\x1f\x7a\xd7\x97\xd3\xd9\xe7\xc1\xef\xc3\xf1\x68\x53\xef\x1e\x8c\x9d\x4d\x2c\x57\x5a\x88\x32\xe0\xf9\xab\xce\xab\xe8\xea\x79\xa9\x8d\xea\x9c\xd6\x22\xa4\x71\xa5\xe2\x85\x77\x2b\xad\xd0\x77\xc5\x3a\x34\x80\xd5\x7c\xae\x2d\x57\xda\x77\x53\x57\x50\x2a\xad\x8e\x7f\xd3\x7b\xb0\x74\x76\xb1\xc5\xe3\xbb\x44\xdc\x22\x75\x54\xc3\xd8\x5d\xca\x97\x36\x76\x41\x57\x39\xb9\x44\xdf\x94\x1b\x69\xed\xfc\x92\x17\xa6\xbc\xd3\xb6\x2b\xad\xae\x01\x8f\x77\x3a\x10\x7a\x1e\x4b\xd9\x25\x5f\xe2\x21\x10\x7d\xc8\x63\x6e\xda\xbd\xd4\xb4\x37\x1c\x4d\x77\x4f\x59\x75\xb5\xb3\x0b\x7d\xd7\x3d\xf4\xd4\x76\xbb\x73\x2f\x72\xf3\xa8\xf3\x47\xc4\x68\xbe\x86\xd5\x8e\x06\xdb\x8e\x88\xc7\xd1\x12\x6b\x19\xe7\x53\x65\xbc\x9b\x5f\x6f\x37\x09\x6b\xb3\x66\x90\x08\xff\x84\xc7\xfe\x0d\x00\x00\xff\xff\x76\x63\xcb\x48\xe3\x08\x00\x00") - -func bindataAssetsBootstrapLegacyUbuntuShBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsBootstrapLegacyUbuntuSh, - "bindata/assets/bootstrap.legacy.ubuntu.sh", - ) -} - -func bindataAssetsBootstrapLegacyUbuntuSh() (*asset, error) { - bytes, err := bindataAssetsBootstrapLegacyUbuntuShBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/bootstrap.legacy.ubuntu.sh", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0xdc, 0xce, 0x7f, 0x6d, 0x30, 0x36, 0x5b, 0x8b, 0xc2, 0x38, 0x8d, 0x9e, 0xe4, 0xf8, 0x27, 0xd5, 0x77, 0x77, 0x8b, 0xaf, 0x59, 0xb3, 0x1a, 0xcd, 0x96, 0xe1, 0xcd, 0xc6, 0x2b, 0x19, 0x6b}} - return a, nil -} - -var _bindataAssetsBootstrapUbuntuSh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x91\xdf\x6b\xdb\x30\x10\xc7\xdf\xf5\x57\xdc\xb4\x82\x61\x20\x6b\x7b\xdd\xc3\x20\xeb\xbc\x52\xd6\x66\x23\x71\xa1\x90\x05\x23\x2b\x17\x5b\x89\x23\x69\x3a\x39\x04\x82\xff\xf7\x21\x86\xb3\x34\xc9\xe3\xdd\xf7\xc7\x7d\x6c\xbd\x7f\x27\x6b\x63\x65\xad\xa8\x65\x8c\x30\x82\x70\x80\x21\xe0\xc1\xc4\x71\xf4\xc6\xe3\x5a\x99\x6e\x9c\xad\xeb\x2d\x61\x64\x8c\x5c\x1f\x34\x82\xdc\xab\x20\x3b\x53\x4b\xdd\xb9\x7e\x25\x49\x07\xe3\x23\x49\xdc\x92\x8e\x9d\xac\x9d\x8b\x14\x83\xf2\x79\x8b\x9d\xc7\x90\xa7\x43\xa8\x5b\x07\xfc\x9f\xe3\x33\x84\xde\x5a\x63\x1b\x90\x18\x75\x8a\xfd\xcf\x70\x76\xbd\xcb\xa9\x05\x7e\x77\xbc\x7f\x7a\x99\x97\xc5\xac\x9a\x4e\x9e\x8b\x81\xc3\x6f\x06\x20\xc4\xca\x92\xd0\x5d\x4f\x11\x83\x30\xfe\xdc\xf6\x6d\x3a\x3f\xb9\xb6\x7d\x8d\x1d\x46\x81\x87\x18\x94\x50\xa1\xa1\xe4\xfc\xf1\xf2\xb5\x78\x2a\xca\xaa\x78\x2d\x67\x93\x6a\x32\x7b\x98\x0f\xfc\x92\x74\x87\xa1\x49\xa4\x3d\x61\x00\xe7\xa3\x71\x96\xc0\xd8\xe8\x60\xec\xd4\xce\xae\x4d\x93\x6f\xc8\x59\xce\x12\x2e\x64\x61\x07\x62\x0d\x77\xc7\xf2\xf9\x57\x95\x8e\x54\xf7\x3f\xa7\xdf\x87\x0c\x8a\xd7\xc7\x92\x6d\xfe\x80\x20\xc8\xf2\xc5\xc7\x25\x7c\x80\x7c\xf1\x69\x99\x9d\xc3\x24\xeb\xe3\xc3\xc0\xaf\x01\x4f\xca\x97\xa4\xbd\xed\xe6\x6c\xb7\xbf\xb1\xbd\x55\x7c\xf5\x16\x48\x51\x85\x98\x3e\xf2\xf4\x9b\xb6\xc4\x19\x59\xe5\x47\xf1\x5c\xb9\x88\xaf\x9c\x45\xce\xfe\x06\x00\x00\xff\xff\xad\x08\x49\xa5\x55\x02\x00\x00") - -func bindataAssetsBootstrapUbuntuShBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsBootstrapUbuntuSh, - "bindata/assets/bootstrap.ubuntu.sh", - ) -} - -func bindataAssetsBootstrapUbuntuSh() (*asset, error) { - bytes, err := bindataAssetsBootstrapUbuntuShBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/bootstrap.ubuntu.sh", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0x94, 0xc2, 0xe1, 0x4f, 0x4c, 0xb5, 0x4d, 0x57, 0x4a, 0xa2, 0x51, 0x56, 0xf7, 0x8a, 0x83, 0xfe, 0xe7, 0x9c, 0xf3, 0x3f, 0x7b, 0xb6, 0x17, 0xc1, 0x29, 0x5b, 0x9c, 0x33, 0x76, 0xed, 0x28}} - return a, nil -} - -var _bindataAssetsEfaAl2Sh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\xd0\x4d\x6a\xc3\x40\x0c\x05\xe0\xbd\x4e\xa1\xd2\xb5\x46\x25\xdd\x15\xba\xea\x01\x7a\x84\xa0\xa4\x1a\x7b\xc0\xf3\xd3\x91\x8c\x93\x9c\xbe\x38\x4d\xe8\xc2\x34\x9b\x81\x37\x7c\x12\x3c\x3d\x3f\xf1\x21\x15\x3e\x88\x8d\x00\xa6\x8e\x54\x51\x7b\xd7\x53\xf2\x7b\x6c\xa9\x69\x94\x34\xdd\x73\xa9\x73\x31\x75\x80\xf3\x9c\x31\x15\x73\x99\x26\xa4\x33\x2e\x83\x3a\xac\x0f\xd2\x37\x12\x79\xca\x5a\x67\x7f\xdf\xbd\xe0\xe8\xde\xec\x8d\xd9\x5e\x69\x36\x5a\xd4\x9c\x76\x41\xb2\x5c\x6a\x91\xc5\xc2\xb1\x66\x96\xc5\x48\xa3\xd0\x6d\x9f\xf6\xed\x0f\x4d\xe2\x6a\x1e\x5c\x7a\x18\x2e\x48\x9f\xc8\x9e\xdb\xd6\xdd\x00\xb8\x74\xa4\x53\x7c\xac\x90\x3e\xae\x00\x8e\x5f\xff\x40\x08\xac\x51\xf6\x7f\x83\x36\xae\x6d\x69\x00\xae\xcd\xf9\xb7\xc6\x4a\xae\x87\x8c\x69\x9f\x4a\xac\x48\x0d\x35\x0a\xfc\x04\x00\x00\xff\xff\x8f\x52\xee\x9a\x5f\x01\x00\x00") - -func bindataAssetsEfaAl2ShBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsEfaAl2Sh, - "bindata/assets/efa.al2.sh", - ) -} - -func bindataAssetsEfaAl2Sh() (*asset, error) { - bytes, err := bindataAssetsEfaAl2ShBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/efa.al2.sh", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0xd9, 0x1d, 0x49, 0x21, 0x82, 0x43, 0xb0, 0xeb, 0x4d, 0xa2, 0x59, 0x42, 0xc6, 0xba, 0xc9, 0xb5, 0x60, 0xcd, 0x1d, 0x96, 0x18, 0x48, 0x80, 0x1b, 0x66, 0xda, 0x3e, 0x7, 0x93, 0xdb, 0x9e}} - return a, nil -} - -var _bindataAssetsEfaManagedBoothook = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x90\x4d\x4e\xc4\x30\x0c\x85\xf7\x39\x85\x2f\xe0\x04\x0d\x3b\x24\x56\x1c\x80\x23\x54\xa6\xe3\xb4\x91\x9a\x1f\x62\x47\x65\xe6\xf4\x28\xed\x88\x0d\xad\x60\x67\xf9\x3d\x7f\xcf\x7a\xe3\x92\xdb\x15\x43\x0a\x8a\x85\x2b\xe4\x34\x32\xdc\x5a\x1c\xd6\x89\xb5\x0f\x10\x92\x28\x2d\x0b\xe0\x0d\xfa\xce\x1c\x1d\x74\x61\x60\x4f\xdb\x00\xf8\x09\x88\x1a\x22\xe7\xa6\xaf\x97\x27\x98\x55\x8b\xbc\x38\x27\xcf\xd8\x04\x57\x16\xc5\x8b\xa5\x48\xf7\x9c\x68\x15\x3b\xe6\xe8\x68\x15\x64\x4f\xf8\x08\xe3\xfa\x7b\x83\x0b\x29\x8b\x5a\xa5\x6a\xa7\x3b\xe0\x3b\x38\x8d\xe5\x2f\x9f\x39\xfc\x57\xa9\x6e\xef\x2a\x55\xc0\x2f\xff\x2f\x12\xe0\xdb\xe6\x33\xa5\xc9\x7c\x3d\x39\x39\x4c\x7b\xa8\x5b\xa2\x75\xec\x69\xf8\xf1\x5b\x99\x7b\xb1\x38\x99\x92\xcb\x19\xf3\x10\xba\x63\x7c\x06\x97\x8b\xba\xbd\xcd\xce\x76\x1f\x21\x39\x1f\x76\x0d\x4b\xf7\x99\xef\x00\x00\x00\xff\xff\xd7\xd4\x31\xc2\xe4\x01\x00\x00") - -func bindataAssetsEfaManagedBoothookBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsEfaManagedBoothook, - "bindata/assets/efa.managed.boothook", - ) -} - -func bindataAssetsEfaManagedBoothook() (*asset, error) { - bytes, err := bindataAssetsEfaManagedBoothookBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/efa.managed.boothook", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa6, 0x40, 0xf1, 0xae, 0x67, 0xa7, 0xe, 0xc, 0x31, 0x61, 0x86, 0x41, 0x8b, 0xd1, 0x55, 0x3f, 0x84, 0xbd, 0x4c, 0xdd, 0x84, 0xc9, 0xee, 0x9d, 0x36, 0xda, 0x8f, 0x6c, 0xbc, 0x6a, 0xaf, 0xed}} - return a, nil -} - -var _bindataAssetsInstallSsmAl2Sh = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\xca\x41\x0a\x02\x31\x0c\x05\xd0\x7d\x4f\x11\x71\x5d\xe6\x4c\xa9\x44\x0d\xa4\xe9\xd0\xff\x07\xac\xa7\x77\x35\x2b\x61\x96\x0f\xde\xfd\xb6\x35\xcf\xad\x29\xde\xa5\xc0\x28\x75\x88\xcd\x69\x1f\xe7\xc9\xdd\x77\x7b\xaa\xc7\xe9\x1c\x47\xc2\x58\xca\x3a\xba\x78\x82\x1a\x21\x75\x89\x76\xfd\x8e\xac\x40\xaf\xfa\xb2\x64\xc1\x02\xad\x3f\x18\x62\xa9\x2d\xec\x6a\x80\x3a\xf9\x1f\x7e\x01\x00\x00\xff\xff\x93\x2c\xf6\x43\x9f\x00\x00\x00") - -func bindataAssetsInstallSsmAl2ShBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsInstallSsmAl2Sh, - "bindata/assets/install-ssm.al2.sh", - ) -} - -func bindataAssetsInstallSsmAl2Sh() (*asset, error) { - bytes, err := bindataAssetsInstallSsmAl2ShBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/install-ssm.al2.sh", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x18, 0xf9, 0xf8, 0x5e, 0xb9, 0xcf, 0xfb, 0x94, 0xb4, 0x85, 0xa3, 0x62, 0xf0, 0x3b, 0x88, 0x44, 0xe3, 0x84, 0xfa, 0x85, 0x39, 0xdb, 0xed, 0xa2, 0x6a, 0x1, 0x7b, 0xe5, 0x49, 0x21, 0xef, 0x3d}} - return a, nil -} - -var _bindataAssetsKubeletYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x91\xc1\xca\xdb\x30\x10\x84\xef\x7a\x8a\x85\x5e\x8b\xed\xb4\x04\x5a\xdd\xd2\x84\xf6\xd0\x40\xa0\x71\xdb\xf3\x5a\x1a\x37\xc2\xb2\x36\x48\xeb\xa4\xed\xd3\x97\xd8\xee\x0f\x81\x1f\x9d\x86\x99\x61\x3e\x49\x6f\xa8\x3d\x1d\x4e\x74\xc0\x35\xc3\xb1\xc2\xbf\xa5\x7b\x88\x91\x3a\x50\xc6\x28\x37\x78\x2a\x22\xc9\x0c\x21\x79\x4b\x5f\xa7\x0e\x11\xba\x97\xd4\x87\x5f\x53\x66\x0d\x92\x0c\x5f\xc3\x0f\xe4\x12\x24\x59\x1a\x96\x40\xe5\xe6\x44\x35\x7c\x28\x55\x90\xfa\xb6\xe9\xa0\xbc\x31\x86\xbd\xcf\x28\xc5\x52\x53\xcd\xc7\xb8\x38\x15\x45\x3e\xc8\xc8\x21\x59\x5a\x65\x15\xc5\x71\x34\x86\x27\xbd\x20\x69\x70\xf3\x90\x35\x44\x9c\x24\xfd\x19\x65\x2a\x0f\x41\x84\xc4\x5d\x84\xb7\xd4\x73\x2c\x30\x44\x77\x74\x17\x91\x61\x71\x1d\xbb\x0b\xda\xf6\x68\xe9\xdd\xd8\x94\xe7\x82\xe6\xe9\x91\xff\xbd\x6d\x3e\xae\xe1\x18\x90\x74\xbf\xfb\x1c\x22\x2c\xd5\x50\x57\x63\x28\x4e\x63\xed\xb8\x72\x59\x17\x1a\xc9\xe1\xef\x0b\xcc\x28\x1e\x96\x7e\x2e\x93\xaf\x8e\xef\xd6\x0a\xfc\x8c\xb1\xfd\x8f\x31\x9b\xdf\x13\x3f\xdb\xef\x9b\x62\x4c\x41\xbe\x21\xb7\xc7\xf3\x27\x11\x2d\x9a\xf9\xba\xc2\x9a\x1e\xac\x53\xc6\x17\x56\xcc\xd7\xff\x26\xca\x8a\xf5\x4b\xce\x73\x6d\x8f\xac\xa1\x7f\xbc\x17\xd6\xd6\xbf\x00\x00\x00\xff\xff\x46\x42\xbb\xf2\xe0\x01\x00\x00") - -func bindataAssetsKubeletYamlBytes() ([]byte, error) { - return bindataRead( - _bindataAssetsKubeletYaml, - "bindata/assets/kubelet.yaml", - ) -} - -func bindataAssetsKubeletYaml() (*asset, error) { - bytes, err := bindataAssetsKubeletYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bindata/assets/kubelet.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x90, 0x31, 0x7a, 0x5b, 0xa3, 0xbf, 0x93, 0x44, 0x7, 0x84, 0xfb, 0x4e, 0x10, 0x44, 0x47, 0xaa, 0xd1, 0x9, 0x71, 0x33, 0xdc, 0x75, 0x6b, 0x7c, 0x1c, 0x25, 0x25, 0xfa, 0x82, 0x6d, 0xc4, 0xf}} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// AssetString returns the asset contents as a string (instead of a []byte). -func AssetString(name string) (string, error) { - data, err := Asset(name) - return string(data), err -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// MustAssetString is like AssetString but panics when Asset would return an -// error. It simplifies safe initialization of global variables. -func MustAssetString(name string) string { - return string(MustAsset(name)) -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetDigest returns the digest of the file with the given name. It returns an -// error if the asset could not be found or the digest could not be loaded. -func AssetDigest(name string) ([sha256.Size]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) - } - return a.digest, nil - } - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) -} - -// Digests returns a map of all known files and their checksums. -func Digests() (map[string][sha256.Size]byte, error) { - mp := make(map[string][sha256.Size]byte, len(_bindata)) - for name := range _bindata { - a, err := _bindata[name]() - if err != nil { - return nil, err - } - mp[name] = a.digest - } - return mp, nil -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "bindata/assets/10-eksctl.al2.conf": bindataAssets10EksctlAl2Conf, - "bindata/assets/bootstrap.al2.sh": bindataAssetsBootstrapAl2Sh, - "bindata/assets/bootstrap.helper.sh": bindataAssetsBootstrapHelperSh, - "bindata/assets/bootstrap.legacy.al2.sh": bindataAssetsBootstrapLegacyAl2Sh, - "bindata/assets/bootstrap.legacy.ubuntu.sh": bindataAssetsBootstrapLegacyUbuntuSh, - "bindata/assets/bootstrap.ubuntu.sh": bindataAssetsBootstrapUbuntuSh, - "bindata/assets/efa.al2.sh": bindataAssetsEfaAl2Sh, - "bindata/assets/efa.managed.boothook": bindataAssetsEfaManagedBoothook, - "bindata/assets/install-ssm.al2.sh": bindataAssetsInstallSsmAl2Sh, - "bindata/assets/kubelet.yaml": bindataAssetsKubeletYaml, -} - -// AssetDebug is true if the assets were built with the debug flag enabled. -const AssetDebug = false - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"}, -// AssetDir("data/img") would return []string{"a.png", "b.png"}, -// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - canonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(canonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "bindata": {nil, map[string]*bintree{ - "assets": {nil, map[string]*bintree{ - "10-eksctl.al2.conf": {bindataAssets10EksctlAl2Conf, map[string]*bintree{}}, - "bootstrap.al2.sh": {bindataAssetsBootstrapAl2Sh, map[string]*bintree{}}, - "bootstrap.helper.sh": {bindataAssetsBootstrapHelperSh, map[string]*bintree{}}, - "bootstrap.legacy.al2.sh": {bindataAssetsBootstrapLegacyAl2Sh, map[string]*bintree{}}, - "bootstrap.legacy.ubuntu.sh": {bindataAssetsBootstrapLegacyUbuntuSh, map[string]*bintree{}}, - "bootstrap.ubuntu.sh": {bindataAssetsBootstrapUbuntuSh, map[string]*bintree{}}, - "efa.al2.sh": {bindataAssetsEfaAl2Sh, map[string]*bintree{}}, - "efa.managed.boothook": {bindataAssetsEfaManagedBoothook, map[string]*bintree{}}, - "install-ssm.al2.sh": {bindataAssetsInstallSsmAl2Sh, map[string]*bintree{}}, - "kubelet.yaml": {bindataAssetsKubeletYaml, map[string]*bintree{}}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory. -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively. -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - canonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) -} diff --git a/pkg/nodebootstrap/bottlerocket.go b/pkg/nodebootstrap/bottlerocket.go index 3adc3edbd7..05926712af 100644 --- a/pkg/nodebootstrap/bottlerocket.go +++ b/pkg/nodebootstrap/bottlerocket.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "github.com/pelletier/go-toml" + toml "github.com/pelletier/go-toml" "github.com/pkg/errors" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" ) @@ -25,9 +25,6 @@ func NewBottlerocketBootstrapper(clusterConfig *api.ClusterConfig, np api.NodePo // NewUserDataForBottlerocket generates TOML userdata for bootstrapping a Bottlerocket node. func (b *Bottlerocket) UserData() (string, error) { ng := b.np.BaseNodeGroup() - if ng.Bottlerocket.Settings == nil { - ng.Bottlerocket.Settings = &api.InlineDocument{} - } // Update settings based on NodeGroup configuration. Values set here are not // allowed to be set by the user - the values are owned by the NodeGroup and @@ -57,30 +54,21 @@ func (b *Bottlerocket) UserData() (string, error) { } func setDerivedBottlerocketSettings(np api.NodePool) error { - ng := np.BaseNodeGroup() - settings := *ng.Bottlerocket.Settings - - var kubernetesSettings map[string]interface{} - - if val, ok := settings["kubernetes"]; ok { - kubernetesSettings, ok = val.(map[string]interface{}) - if !ok { - return errors.Errorf("expected settings.kubernetes to be of type %T; got %T", kubernetesSettings, val) - } - } else { - kubernetesSettings = make(map[string]interface{}) - settings["kubernetes"] = kubernetesSettings + kubernetesSettings, err := extractKubernetesSettings(np) + if err != nil { + return err } + ng := np.BaseNodeGroup() if len(ng.Labels) != 0 { kubernetesSettings["node-labels"] = ng.Labels } - if ng.MaxPodsPerNode != 0 { - kubernetesSettings["max-pods"] = ng.MaxPodsPerNode - } if taints := np.NGTaints(); len(taints) != 0 { kubernetesSettings["node-taints"] = taintsToMap(taints) } + if ng.MaxPodsPerNode != 0 { + kubernetesSettings["max-pods"] = ng.MaxPodsPerNode + } if ng, ok := np.(*api.NodeGroup); ok { if ng.ClusterDNS != "" { @@ -90,6 +78,22 @@ func setDerivedBottlerocketSettings(np api.NodePool) error { return nil } +func extractKubernetesSettings(np api.NodePool) (map[string]interface{}, error) { + settings := *np.BaseNodeGroup().Bottlerocket.Settings + + var kubernetesSettings map[string]interface{} + if val, ok := settings["kubernetes"]; ok { + kubernetesSettings, ok = val.(map[string]interface{}) + if !ok { + return nil, errors.Errorf("expected settings.kubernetes to be of type %T; got %T", kubernetesSettings, val) + } + } else { + kubernetesSettings = make(map[string]interface{}) + settings["kubernetes"] = kubernetesSettings + } + return kubernetesSettings, nil +} + func taintsToMap(taints []api.NodeGroupTaint) map[string]string { ret := map[string]string{} for _, t := range taints { @@ -150,7 +154,7 @@ func bottlerocketSettingsTOML(spec *api.ClusterConfig, ng *api.NodeGroupBase, tr // Provide value only if given, with `enabled` // commented out otherwise. enabled := false - isUnset := ng.Bottlerocket == nil || ng.Bottlerocket.EnableAdminContainer == nil + isUnset := ng.Bottlerocket.EnableAdminContainer == nil if !isUnset { enabled = *ng.Bottlerocket.EnableAdminContainer } diff --git a/pkg/nodebootstrap/bottlerocket_test.go b/pkg/nodebootstrap/bottlerocket_test.go index e6b50633f0..e1a060c0cb 100644 --- a/pkg/nodebootstrap/bottlerocket_test.go +++ b/pkg/nodebootstrap/bottlerocket_test.go @@ -7,10 +7,10 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + toml "github.com/pelletier/go-toml" "github.com/stretchr/testify/require" "github.com/tj/assert" - "github.com/pelletier/go-toml" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/nodebootstrap" ) @@ -33,33 +33,32 @@ var _ = Describe("Bottlerocket", func() { ng = api.NewNodeGroup() ng.AMIFamily = "Bottlerocket" - // SetNodeGroupDefaults ensures this is non-nil for Bottlerocket nodegroups - ng.Bottlerocket = &api.NodeGroupBottlerocket{} + api.SetNodeGroupDefaults(ng, clusterConfig.Metadata) }) Describe("with no user settings", func() { It("produces standard TOML userdata", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) settings, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(settings.Has("settings.kubernetes.cluster-name")).To(BeTrue()) }) It("leaves settings.host-containers.admin.enabled commented", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) settings, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(settings.Has("settings.host-containers.admin.enabled")).To(BeFalse()) tomlStr, err := settings.ToTomlString() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) // Generated TOML should contain a section (with the enabled // key=value) for the unset, commented out setting. Expect(tomlStr).To(ContainSubstring("[settings.host-containers.admin]")) @@ -84,11 +83,11 @@ var _ = Describe("Bottlerocket", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) tree, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) // Verify the keys made it to where they were // supposed to and that nothing happened to // make them appear as dotted/split key names. @@ -110,11 +109,11 @@ var _ = Describe("Bottlerocket", func() { It("sets it on the userdata", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) settings, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(settings.Has("settings.host-containers.example.enabled")).To(BeTrue()) }) }) @@ -127,11 +126,11 @@ var _ = Describe("Bottlerocket", func() { It("enables admin container on the userdata", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) settings, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(settings.Has("settings.host-containers.admin.enabled")).To(BeTrue()) val, ok := settings.Get("settings.host-containers.admin.enabled").(bool) Expect(ok).To(BeTrue()) @@ -145,11 +144,11 @@ var _ = Describe("Bottlerocket", func() { providedSettings["host-containers"].(map[string]interface{})["admin"] = map[string]string{"enabled": "user-val"} bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) settings, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) // Check that the value specified in config is // set, not the higher level toggle. Expect(settings.Has("settings.host-containers.admin.enabled")).To(BeTrue()) @@ -176,11 +175,11 @@ var _ = Describe("Bottlerocket", func() { It("adds the labels to the userdata", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) tree, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(tree.HasPath(append(labelsPath, "foo"))).To(BeTrue()) Expect(tree.GetPath(append(labelsPath, "foo"))).To(Equal("bar")) @@ -201,11 +200,11 @@ var _ = Describe("Bottlerocket", func() { It("adds the taints to the userdata", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) tree, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(tree.HasPath(append(taintsPath, "foo"))).To(BeTrue()) Expect(tree.GetPath(append(taintsPath, "foo"))).To(Equal("bar:NoExecute")) @@ -218,11 +217,11 @@ var _ = Describe("Bottlerocket", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) tree, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(tree.HasPath(clusterDNSIPPath)).To(BeTrue()) Expect(tree.GetPath(clusterDNSIPPath)).To(Equal(ng.ClusterDNS)) @@ -235,11 +234,11 @@ var _ = Describe("Bottlerocket", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) tree, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(tree.HasPath(maxPodsPath)).To(BeTrue()) Expect(tree.GetPath(maxPodsPath)).To(Equal(int64(ng.MaxPodsPerNode))) @@ -248,11 +247,11 @@ var _ = Describe("Bottlerocket", func() { It("does not add MaxPodsPerNode when not set", func() { bootstrapper := newBootstrapper(clusterConfig, ng) userdata, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) - Expect(userdata).ToNot(Equal("")) + Expect(err).NotTo(HaveOccurred()) + Expect(userdata).NotTo(Equal("")) tree, parseErr := userdataTOML(userdata) - Expect(parseErr).ToNot(HaveOccurred()) + Expect(parseErr).NotTo(HaveOccurred()) Expect(tree.HasPath(maxPodsPath)).To(BeFalse()) }) diff --git a/pkg/nodebootstrap/cluster_dns_test.go b/pkg/nodebootstrap/cluster_dns_test.go index b77133bbbd..c017bef9df 100644 --- a/pkg/nodebootstrap/cluster_dns_test.go +++ b/pkg/nodebootstrap/cluster_dns_test.go @@ -21,7 +21,7 @@ var _ = DescribeTable("Cluster DNS", func(c clusterDNSEntry) { Expect(err).To(MatchError(ContainSubstring(c.expectedErr))) return } - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(clusterDNS).To(Equal(c.expectedClusterDNS)) }, diff --git a/pkg/nodebootstrap/legacy/al2.go b/pkg/nodebootstrap/legacy/al2.go index 00dd292a48..48aca9ff98 100644 --- a/pkg/nodebootstrap/legacy/al2.go +++ b/pkg/nodebootstrap/legacy/al2.go @@ -7,9 +7,16 @@ import ( "github.com/pkg/errors" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/cloudconfig" + "github.com/weaveworks/eksctl/pkg/nodebootstrap/assets" "github.com/weaveworks/eksctl/pkg/utils/kubeconfig" + + //For go:embed + _ "embed" ) +//go:embed scripts/bootstrap.legacy.al2.sh +var bootstrapLegacyAl2Sh string + type AL2Bootstrapper struct { clusterSpec *api.ClusterConfig ng *api.NodeGroup @@ -30,7 +37,7 @@ func (b AL2Bootstrapper) UserData() (string, error) { return "", err } - var scripts []string + var scripts []script for _, command := range b.ng.PreBootstrapCommands { config.AddShellCommand(command) @@ -40,9 +47,9 @@ func (b AL2Bootstrapper) UserData() (string, error) { config.AddShellCommand(*b.ng.OverrideBootstrapCommand) } else { if api.IsEnabled(b.ng.EFAEnabled) { - scripts = append(scripts, "efa.al2.sh") + scripts = append(scripts, script{name: "efa.al2.sh", contents: assets.EfaAl2Sh}) } - scripts = append(scripts, "bootstrap.legacy.al2.sh") + scripts = append(scripts, script{name: "bootstrap.legacy.al2.sh", contents: bootstrapLegacyAl2Sh}) } if err = addFilesAndScripts(config, files, scripts); err != nil { @@ -74,9 +81,9 @@ func makeAmazonLinux2Config(spec *api.ClusterConfig, ng *api.NodeGroup) ([]confi } files := []configFile{{ - dir: kubeletDropInUnitDir, - name: "10-eksctl.al2.conf", - isAsset: true, + dir: kubeletDropInUnitDir, + name: "10-eksctl.al2.conf", + contents: assets.EksctlAl2Conf, }, { dir: configDir, name: "metadata.env", diff --git a/pkg/nodebootstrap/legacy/maxpods_generate.go b/pkg/nodebootstrap/legacy/maxpods_generate.go index c49491cf8f..16a549a86f 100644 --- a/pkg/nodebootstrap/legacy/maxpods_generate.go +++ b/pkg/nodebootstrap/legacy/maxpods_generate.go @@ -1,16 +1,15 @@ +//go:build ignore //+build ignore package main import ( "fmt" - "io/ioutil" "log" + "net/http" "strconv" "strings" - "net/http" - . "github.com/dave/jennifer/jen" ) @@ -30,7 +29,7 @@ func generateMap() map[string]int { log.Fatal(err.Error()) } defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err.Error()) } diff --git a/pkg/nodebootstrap/legacy/reserved_generate.go b/pkg/nodebootstrap/legacy/reserved_generate.go index 22bf488d38..5316204670 100644 --- a/pkg/nodebootstrap/legacy/reserved_generate.go +++ b/pkg/nodebootstrap/legacy/reserved_generate.go @@ -1,3 +1,4 @@ +//go:build ignore //+build ignore // Fetches AWS instance type data such as memory, cpus, and diff --git a/pkg/nodebootstrap/bindata/assets/bootstrap.legacy.al2.sh b/pkg/nodebootstrap/legacy/scripts/bootstrap.legacy.al2.sh similarity index 100% rename from pkg/nodebootstrap/bindata/assets/bootstrap.legacy.al2.sh rename to pkg/nodebootstrap/legacy/scripts/bootstrap.legacy.al2.sh diff --git a/pkg/nodebootstrap/bindata/assets/bootstrap.legacy.ubuntu.sh b/pkg/nodebootstrap/legacy/scripts/bootstrap.legacy.ubuntu.sh similarity index 100% rename from pkg/nodebootstrap/bindata/assets/bootstrap.legacy.ubuntu.sh rename to pkg/nodebootstrap/legacy/scripts/bootstrap.legacy.ubuntu.sh diff --git a/pkg/nodebootstrap/legacy/ubuntu.go b/pkg/nodebootstrap/legacy/ubuntu.go index c2a3da0223..8eef15d043 100644 --- a/pkg/nodebootstrap/legacy/ubuntu.go +++ b/pkg/nodebootstrap/legacy/ubuntu.go @@ -9,8 +9,14 @@ import ( api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/cloudconfig" "github.com/weaveworks/eksctl/pkg/utils/kubeconfig" + + // Import go:embed + _ "embed" ) +//go:embed scripts/bootstrap.legacy.ubuntu.sh +var bootstrapLegacyUbuntuShBytes []byte + const ubuntu2004ResolveConfPath = "/run/systemd/resolve/resolv.conf" type UbuntuBootstrapper struct { @@ -33,7 +39,7 @@ func (b UbuntuBootstrapper) UserData() (string, error) { return "", err } - scripts := []string{} + var scripts []script for _, command := range b.ng.PreBootstrapCommands { config.AddShellCommand(command) @@ -42,7 +48,7 @@ func (b UbuntuBootstrapper) UserData() (string, error) { if b.ng.OverrideBootstrapCommand != nil { config.AddShellCommand(*b.ng.OverrideBootstrapCommand) } else { - scripts = append(scripts, "bootstrap.legacy.ubuntu.sh") + scripts = append(scripts, script{name: "bootstrap.legacy.ubuntu.sh", contents: string(bootstrapLegacyUbuntuShBytes)}) } if err = addFilesAndScripts(config, files, scripts); err != nil { diff --git a/pkg/nodebootstrap/legacy/userdata.go b/pkg/nodebootstrap/legacy/userdata.go index 96a8807e75..f77979f20b 100644 --- a/pkg/nodebootstrap/legacy/userdata.go +++ b/pkg/nodebootstrap/legacy/userdata.go @@ -2,7 +2,6 @@ package legacy import ( "fmt" - "path/filepath" "strings" "github.com/pkg/errors" @@ -14,12 +13,11 @@ import ( api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/cloudconfig" - "github.com/weaveworks/eksctl/pkg/nodebootstrap/bindata" + "github.com/weaveworks/eksctl/pkg/nodebootstrap/assets" "github.com/weaveworks/eksctl/pkg/utils/kubeconfig" ) const ( - dataDir = "bindata/assets" configDir = "/etc/eksctl/" kubeletDropInUnitDir = "/etc/systemd/system/kubelet.service.d/" ) @@ -28,42 +26,27 @@ type configFile struct { dir string name string contents string - isAsset bool } -func getAsset(name string) (string, error) { - data, err := bindata.Asset(filepath.Join(dataDir, name)) - if err != nil { - return "", errors.Wrapf(err, "decoding embedded file %q", name) - } - return string(data), nil +type script struct { + name string + contents string } -func addFilesAndScripts(config *cloudconfig.CloudConfig, files []configFile, scripts []string) error { +func addFilesAndScripts(config *cloudconfig.CloudConfig, files []configFile, scripts []script) error { for _, file := range files { f := cloudconfig.File{ - Path: file.dir + file.name, + Path: file.dir + file.name, + Content: file.contents, } - if file.isAsset { - data, err := getAsset(file.name) - if err != nil { - return err - } - f.Content = data - } else { - f.Content = file.contents - } + f.Content = file.contents config.AddFile(f) } - for _, scriptName := range scripts { - data, err := getAsset(scriptName) - if err != nil { - return err - } - config.RunScript(scriptName, data) + for _, s := range scripts { + config.RunScript(s.name, s.contents) } return nil } @@ -90,11 +73,7 @@ func getKubeReserved(info InstanceTypeInfo) api.InlineDocument { } func makeKubeletConfigYAML(spec *api.ClusterConfig, ng *api.NodeGroup) ([]byte, error) { - data, err := bindata.Asset(filepath.Join(dataDir, "kubelet.yaml")) - if err != nil { - return nil, err - } - + data := []byte(assets.KubeletYaml) // use a map here, as using struct will require us to add defaulting etc, // and we only need to add a few top-level fields obj := api.InlineDocument{} @@ -145,7 +124,7 @@ func makeKubeletConfigYAML(spec *api.ClusterConfig, ng *api.NodeGroup) ([]byte, } } - data, err = yaml.Marshal(obj) + data, err := yaml.Marshal(obj) if err != nil { return nil, err } diff --git a/pkg/nodebootstrap/legacy/userdata_test.go b/pkg/nodebootstrap/legacy/userdata_test.go index 350b028ecf..16379d36cc 100644 --- a/pkg/nodebootstrap/legacy/userdata_test.go +++ b/pkg/nodebootstrap/legacy/userdata_test.go @@ -21,7 +21,7 @@ var _ = Describe("User data", func() { parts := strings.Split(line, " ") Expect(parts[0]).To(MatchRegexp(`[a-zA-Z][a-zA-Z0-9]*\.[a-zA-Z0-9]+`)) _, err := strconv.Atoi(parts[1]) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) } }) }) @@ -40,33 +40,33 @@ var _ = Describe("User data", func() { It("the kubelet is serialized with the correct format", func() { data, err := makeKubeletConfigYAML(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubelet := &kubeletapi.KubeletConfiguration{} errUnmarshal := yaml.UnmarshalStrict(data, kubelet) - Expect(errUnmarshal).ToNot(HaveOccurred()) + Expect(errUnmarshal).NotTo(HaveOccurred()) }) It("does not contain default kube reservations for unknown instances", func() { ng.InstanceType = "dne.small" data, err := makeKubeletConfigYAML(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubelet := kubeletapi.KubeletConfiguration{} err = yaml.UnmarshalStrict(data, &kubelet) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(kubelet.KubeReserved).To(BeNil()) }) It("contains default kube reservations", func() { ng.InstanceType = "i3.metal" data, err := makeKubeletConfigYAML(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubelet := kubeletapi.KubeletConfiguration{} err = yaml.UnmarshalStrict(data, &kubelet) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(kubelet.KubeReserved).To(Equal(map[string]string{ "ephemeral-storage": "1Gi", "cpu": "250m", @@ -85,11 +85,11 @@ var _ = Describe("User data", func() { Expect(instanceTypeExists(ng.InstancesDistribution.InstanceTypes[1])).To(Equal(true)) Expect(instanceTypeExists(ng.InstancesDistribution.InstanceTypes[2])).To(Equal(true)) data, err := makeKubeletConfigYAML(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubelet := kubeletapi.KubeletConfiguration{} err = yaml.UnmarshalStrict(data, &kubelet) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(kubelet.KubeReserved).To(Equal(map[string]string{ "ephemeral-storage": "1Gi", "cpu": "80m", @@ -108,11 +108,11 @@ var _ = Describe("User data", func() { Expect(instanceTypeExists(ng.InstancesDistribution.InstanceTypes[1])).To(Equal(false)) Expect(instanceTypeExists(ng.InstancesDistribution.InstanceTypes[2])).To(Equal(false)) data, err := makeKubeletConfigYAML(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubelet := kubeletapi.KubeletConfiguration{} err = yaml.UnmarshalStrict(data, &kubelet) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(kubelet.KubeReserved).To(Equal(map[string]string{ "ephemeral-storage": "1Gi", "cpu": "80m", @@ -133,14 +133,14 @@ var _ = Describe("User data", func() { }, } data, err := makeKubeletConfigYAML(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubelet := &kubeletapi.KubeletConfiguration{} errUnmarshal := yaml.UnmarshalStrict(data, kubelet) - Expect(errUnmarshal).ToNot(HaveOccurred()) + Expect(errUnmarshal).NotTo(HaveOccurred()) - Expect(kubelet.KubeReserved).ToNot(BeNil()) + Expect(kubelet.KubeReserved).NotTo(BeNil()) Expect(kubelet.KubeReserved["cpu"]).To(Equal("300m")) Expect(kubelet.KubeReserved["memory"]).To(Equal("300Mi")) Expect(kubelet.KubeReserved["ephemeral-storage"]).To(Equal("1Gi")) @@ -171,14 +171,14 @@ var _ = Describe("User data", func() { Expect(instanceTypeExists(ng.InstancesDistribution.InstanceTypes[1])).To(Equal(true)) Expect(instanceTypeExists(ng.InstancesDistribution.InstanceTypes[2])).To(Equal(true)) data, err := makeKubeletConfigYAML(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) kubelet := &kubeletapi.KubeletConfiguration{} errUnmarshal := yaml.UnmarshalStrict(data, kubelet) - Expect(errUnmarshal).ToNot(HaveOccurred()) + Expect(errUnmarshal).NotTo(HaveOccurred()) - Expect(kubelet.KubeReserved).ToNot(BeNil()) + Expect(kubelet.KubeReserved).NotTo(BeNil()) Expect(kubelet.KubeReserved["cpu"]).To(Equal("300m")) Expect(kubelet.KubeReserved["memory"]).To(Equal("300Mi")) Expect(kubelet.KubeReserved["ephemeral-storage"]).To(Equal("1Gi")) diff --git a/pkg/nodebootstrap/managed_al2.go b/pkg/nodebootstrap/managed_al2.go index 0876f32969..92437add7f 100644 --- a/pkg/nodebootstrap/managed_al2.go +++ b/pkg/nodebootstrap/managed_al2.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/nodebootstrap/assets" ) // ManagedAL2 is a bootstrapper for managed Amazon Linux 2 nodegroups @@ -52,11 +53,7 @@ func (m *ManagedAL2) UserData() (string, error) { } if api.IsEnabled(ng.EFAEnabled) { - data, err := getAsset("efa.managed.boothook") - if err != nil { - return "", err - } - cloudboot = append(cloudboot, data) + cloudboot = append(cloudboot, assets.EfaManagedBoothook) } if len(scripts) == 0 && len(cloudboot) == 0 { diff --git a/pkg/nodebootstrap/managed_al2_test.go b/pkg/nodebootstrap/managed_al2_test.go index 2f1819c9e7..d4f8b55490 100644 --- a/pkg/nodebootstrap/managed_al2_test.go +++ b/pkg/nodebootstrap/managed_al2_test.go @@ -24,9 +24,9 @@ var _ = DescribeTable("Managed AL2", func(e managedEntry) { bootstrapper.UserDataMimeBoundary = "//" userData, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) decoded, err := base64.StdEncoding.DecodeString(userData) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) actual := strings.ReplaceAll(string(decoded), "\r\n", "\n") Expect(actual).To(Equal(e.expectedUserData)) }, diff --git a/pkg/nodebootstrap/managed_bottlerocket.go b/pkg/nodebootstrap/managed_bottlerocket.go new file mode 100644 index 0000000000..ddac0c69c2 --- /dev/null +++ b/pkg/nodebootstrap/managed_bottlerocket.go @@ -0,0 +1,93 @@ +package nodebootstrap + +import ( + "encoding/base64" + + toml "github.com/pelletier/go-toml" + "github.com/pkg/errors" + + api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" +) + +type ManagedBottlerocket struct { + clusterConfig *api.ClusterConfig + ng *api.ManagedNodeGroup +} + +// NewManagedBottlerocketBootstrapper returns a new bootstrapper for managed Bottlerocket. +func NewManagedBottlerocketBootstrapper(clusterConfig *api.ClusterConfig, ng *api.ManagedNodeGroup) *ManagedBottlerocket { + return &ManagedBottlerocket{ + clusterConfig: clusterConfig, + ng: ng, + } +} + +// UserData generates TOML userdata for bootstrapping a Bottlerocket node. +func (b *ManagedBottlerocket) UserData() (string, error) { + if err := b.setDerivedSettings(); err != nil { + return "", err + } + + settings, err := toml.TreeFromMap(map[string]interface{}{ + "settings": *b.ng.Bottlerocket.Settings, + }) + if err != nil { + return "", errors.Wrap(err, "error loading user-provided Bottlerocket settings") + } + + // Check and protect all input key names against TOML's dotted key semantics. + ProtectTOMLKeys([]string{"settings"}, settings) + + if enableAdminContainer := b.ng.Bottlerocket.EnableAdminContainer; enableAdminContainer != nil { + const adminContainerEnabledKey = "settings.host-containers.admin.enabled" + if settings.Has(adminContainerEnabledKey) { + return "", errors.Errorf("cannot set both bottlerocket.enableAdminContainer and %s", adminContainerEnabledKey) + } + settings.Set(adminContainerEnabledKey, *enableAdminContainer) + } + + userData := settings.String() + if userData == "" { + return "", errors.New("generated unexpected empty TOML user-data from input") + } + + return base64.StdEncoding.EncodeToString([]byte(userData)), nil +} + +// setDerivedSettings configures settings that are derived from top-level nodegroup config +// as opposed to settings configured in `bottlerocket.settings`. +func (b *ManagedBottlerocket) setDerivedSettings() error { + kubernetesSettings, err := extractKubernetesSettings(b.ng) + if err != nil { + return err + } + if err := validateBottlerocketSettings(kubernetesSettings); err != nil { + return err + } + + if b.ng.MaxPodsPerNode != 0 { + kubernetesSettings["max-pods"] = b.ng.MaxPodsPerNode + } + + return nil +} + +// validateBottlerocketSettings validates the supplied Kubernetes settings to ensure fields related to bootstrapping +// and fields available on the ManagedNodeGroup object are not set by the user. +func validateBottlerocketSettings(kubernetesSettings map[string]interface{}) error { + clusterBootstrapKeys := []string{"cluster-certificate", "api-server", "cluster-name", "cluster-dns-ip"} + for _, k := range clusterBootstrapKeys { + if _, ok := kubernetesSettings[k]; ok { + return errors.Errorf("cannot set settings.kubernetes.%s; EKS automatically injects cluster bootstrapping fields into user-data", k) + } + } + + apiFields := []string{"node-labels", "node-taints"} + for _, k := range apiFields { + if _, ok := kubernetesSettings[k]; ok { + return errors.Errorf("cannot set settings.kubernetes.%s; labels and taints should be set on the managedNodeGroup object", k) + } + } + + return nil +} diff --git a/pkg/nodebootstrap/managed_bottlerocket_test.go b/pkg/nodebootstrap/managed_bottlerocket_test.go new file mode 100644 index 0000000000..b529e964a9 --- /dev/null +++ b/pkg/nodebootstrap/managed_bottlerocket_test.go @@ -0,0 +1,214 @@ +package nodebootstrap_test + +import ( + "encoding/base64" + + . "github.com/onsi/ginkgo/extensions/table" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/nodebootstrap" +) + +var _ = Describe("Managed Bottlerocket", func() { + + type bottlerocketEntry struct { + setFields func(group *api.ManagedNodeGroup) + + expectedErr string + expectedUserData string + } + + DescribeTable("User data", func(e bottlerocketEntry) { + clusterConfig := api.NewClusterConfig() + clusterConfig.Metadata.Name = "managed-bottlerocket" + clusterConfig.Status = &api.ClusterStatus{ + Endpoint: "bottlerocket.cluster.com", + CertificateAuthorityData: []byte("CertificateAuthorityData"), + } + + ng := api.NewManagedNodeGroup() + ng.AMIFamily = api.NodeImageFamilyBottlerocket + api.SetManagedNodeGroupDefaults(ng, clusterConfig.Metadata) + if e.setFields != nil { + e.setFields(ng) + } + + bootstrapper := nodebootstrap.NewManagedBootstrapper(clusterConfig, ng) + userData, err := bootstrapper.UserData() + if e.expectedErr != "" { + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError(ContainSubstring(e.expectedErr))) + return + } + + Expect(err).NotTo(HaveOccurred()) + actual, err := base64.StdEncoding.DecodeString(userData) + Expect(err).NotTo(HaveOccurred()) + Expect(string(actual)).To(Equal(e.expectedUserData)) + }, + Entry("no settings", bottlerocketEntry{ + expectedUserData: ` +[settings] + + [settings.kubernetes] +`, + }), + Entry("maxPods set", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.MaxPodsPerNode = 44 + }, + expectedUserData: ` +[settings] + + [settings.kubernetes] + max-pods = 44 +`, + }), + + Entry("enableAdminContainer set", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Bottlerocket.EnableAdminContainer = api.Enabled() + }, + expectedUserData: ` +[settings] + + [settings.host-containers] + + [settings.host-containers.admin] + enabled = true + + [settings.kubernetes] +`, + }), + + Entry("host containers enabled", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Bottlerocket.Settings = &api.InlineDocument{ + "host-containers": api.InlineDocument{ + "example": map[string]bool{ + "enabled": true, + }, + }, + } + }, + expectedUserData: ` +[settings] + + [settings.host-containers] + + [settings.host-containers.example] + enabled = true + + [settings.kubernetes] +`, + }), + + Entry("retain user-specified admin container setting", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Bottlerocket.Settings = &api.InlineDocument{ + "host-containers": map[string]interface{}{ + "admin": map[string]interface{}{ + "enabled": true, + }, + }, + } + }, + expectedUserData: ` +[settings] + + [settings.host-containers] + + [settings.host-containers.admin] + enabled = true + + [settings.kubernetes] +`, + }), + + Entry("labels and taints set", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Labels = map[string]string{ + "key": "value", + } + ng.Taints = []api.NodeGroupTaint{ + { + Key: "foo", + Value: "bar", + Effect: "NoExecute", + }, + } + }, + + expectedUserData: ` +[settings] + + [settings.kubernetes] +`, + }), + + Entry("preserve dotted keys", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Bottlerocket.Settings = &api.InlineDocument{ + "a.b.c": "value", + } + }, + + expectedUserData: ` +[settings] + "a.b.c" = "value" + + [settings.kubernetes] +`, + }), + + Entry("cluster bootstrap settings set", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Bottlerocket.Settings = &api.InlineDocument{ + "kubernetes": map[string]interface{}{ + "cluster-certificate": "test", + "api-server": "https://test.com", + "cluster-name": "test", + "cluster-dns-ip": "192.2.0.53", + }, + } + }, + + expectedErr: "EKS automatically injects cluster bootstrapping fields into user-data", + }), + + Entry("labels and taints in Bottlerocket settings", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Bottlerocket.Settings = &api.InlineDocument{ + "kubernetes": map[string]interface{}{ + "node-labels": map[string]string{ + "key": "value", + }, + "node-taints": map[string]string{ + "foo": "bar:NoExecute", + }, + }, + } + }, + + expectedErr: "cannot set settings.kubernetes.node-labels; labels and taints should be set on the managedNodeGroup object", + }), + + Entry("conflicting settings", bottlerocketEntry{ + setFields: func(ng *api.ManagedNodeGroup) { + ng.Bottlerocket.EnableAdminContainer = api.Enabled() + ng.Bottlerocket.Settings = &api.InlineDocument{ + "host-containers": map[string]interface{}{ + "admin": map[string]interface{}{ + "enabled": false, + }, + }, + } + }, + + expectedErr: "cannot set both bottlerocket.enableAdminContainer and settings.host-containers.admin.enabled", + }), + ) +}) diff --git a/pkg/nodebootstrap/nodebootstrap_suite_test.go b/pkg/nodebootstrap/nodebootstrap_suite_test.go index 7fb3dc8d17..399e32b5de 100644 --- a/pkg/nodebootstrap/nodebootstrap_suite_test.go +++ b/pkg/nodebootstrap/nodebootstrap_suite_test.go @@ -24,6 +24,6 @@ func decode(userData string) *cloudconfig.CloudConfig { func newBootstrapper(clusterConfig *api.ClusterConfig, ng *api.NodeGroup) nodebootstrap.Bootstrapper { bootstrapper, err := nodebootstrap.NewBootstrapper(clusterConfig, ng) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) return bootstrapper } diff --git a/pkg/nodebootstrap/ubuntu.go b/pkg/nodebootstrap/ubuntu.go index f8523e7e10..a84ce95e92 100644 --- a/pkg/nodebootstrap/ubuntu.go +++ b/pkg/nodebootstrap/ubuntu.go @@ -4,6 +4,7 @@ import ( "github.com/kris-nova/logger" "github.com/pkg/errors" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" + "github.com/weaveworks/eksctl/pkg/nodebootstrap/assets" ) const ( @@ -23,7 +24,7 @@ func NewUbuntuBootstrapper(clusterConfig *api.ClusterConfig, np api.NodePool) *U } func (b *Ubuntu) UserData() (string, error) { - body, err := linuxConfig(b.clusterConfig, ubuntuBootScript, b.np) + body, err := linuxConfig(b.clusterConfig, ubuntuBootScript, assets.BootstrapUbuntuSh, b.np) if err != nil { return "", errors.Wrap(err, "encoding user data") } diff --git a/pkg/nodebootstrap/userdata.go b/pkg/nodebootstrap/userdata.go index 007a60755e..0df5bdf36f 100644 --- a/pkg/nodebootstrap/userdata.go +++ b/pkg/nodebootstrap/userdata.go @@ -5,27 +5,23 @@ import ( "encoding/json" "fmt" "net" - "path/filepath" "strconv" "strings" "github.com/kris-nova/logger" "github.com/pkg/errors" + "github.com/weaveworks/eksctl/pkg/nodebootstrap/assets" "github.com/weaveworks/eksctl/pkg/nodebootstrap/utils" kubeletapi "k8s.io/kubelet/config/v1beta1" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/cloudconfig" - "github.com/weaveworks/eksctl/pkg/nodebootstrap/bindata" "github.com/weaveworks/eksctl/pkg/nodebootstrap/legacy" ) -//go:generate ${GOBIN}/go-bindata -pkg bindata -prefix assets -nometadata -o bindata/assets.go bindata/assets - const ( - dataDir = "bindata/assets" configDir = "/etc/eksctl/" envFile = "kubelet.env" extraKubeConfFile = "kubelet-extra.json" @@ -81,7 +77,7 @@ func NewManagedBootstrapper(clusterConfig *api.ClusterConfig, ng *api.ManagedNod case api.NodeImageFamilyAmazonLinux2: return NewManagedAL2Bootstrapper(ng) case api.NodeImageFamilyBottlerocket: - return NewBottlerocketBootstrapper(clusterConfig, ng) + return NewManagedBottlerocketBootstrapper(clusterConfig, ng) case api.NodeImageFamilyUbuntu1804, api.NodeImageFamilyUbuntu2004: return NewUbuntuBootstrapper(clusterConfig, ng) } @@ -104,7 +100,7 @@ func GetClusterDNS(clusterConfig *api.ClusterConfig) (string, error) { return ip.String(), nil } -func linuxConfig(clusterConfig *api.ClusterConfig, bootScript string, np api.NodePool, scripts ...string) (string, error) { +func linuxConfig(clusterConfig *api.ClusterConfig, bootScriptName, bootScriptContent string, np api.NodePool, scripts ...script) (string, error) { config := cloudconfig.New() ng := np.BaseNodeGroup() @@ -114,13 +110,13 @@ func linuxConfig(clusterConfig *api.ClusterConfig, bootScript string, np api.Nod var files []cloudconfig.File if len(scripts) == 0 { - scripts = []string{} + scripts = []script{} } if ng.OverrideBootstrapCommand != nil { config.AddShellCommand(*ng.OverrideBootstrapCommand) } else { - scripts = append(scripts, commonLinuxBootScript, bootScript) + scripts = append(scripts, script{name: commonLinuxBootScript, contents: assets.BootstrapHelperSh}, script{name: bootScriptName, contents: bootScriptContent}) var kubeletExtraConf *api.InlineDocument if unmanaged, ok := np.(*api.NodeGroup); ok { kubeletExtraConf = unmanaged.KubeletExtraConfig @@ -207,27 +203,19 @@ func formatLabels(labels map[string]string) string { return makeKeyValues(labels, ",") } -func addFilesAndScripts(config *cloudconfig.CloudConfig, files []cloudconfig.File, scripts []string) error { +type script struct { + name string + contents string +} + +func addFilesAndScripts(config *cloudconfig.CloudConfig, files []cloudconfig.File, scripts []script) error { for _, file := range files { config.AddFile(file) } - for _, scriptName := range scripts { - data, err := getAsset(scriptName) - if err != nil { - return err - } - config.RunScript(scriptName, data) + for _, s := range scripts { + config.RunScript(s.name, s.contents) } return nil } - -func getAsset(name string) (string, error) { - data, err := bindata.Asset(filepath.Join(dataDir, name)) - if err != nil { - return "", errors.Wrapf(err, "decoding embedded file %q", name) - } - - return string(data), nil -} diff --git a/pkg/nodebootstrap/windows_test.go b/pkg/nodebootstrap/windows_test.go index d744da601b..9c688484a5 100644 --- a/pkg/nodebootstrap/windows_test.go +++ b/pkg/nodebootstrap/windows_test.go @@ -37,7 +37,7 @@ var _ = Describe("Windows", func() { bootstrapper := nodebootstrap.NewWindowsBootstrapper(clusterConfig, ng) userData, err := bootstrapper.UserData() - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(decodeData(userData)).To(Equal(strings.TrimSpace(e.expectedUserData))) }, @@ -138,10 +138,10 @@ start /wait msiexec.exe /qb /i "amazon-cloudwatch-agent.msi" func decodeData(userdata string) string { decodedBytes, err := base64.StdEncoding.DecodeString(userdata) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) decodedString := string(decodedBytes) - Expect(decodedString).ToNot(Equal("")) + Expect(decodedString).NotTo(Equal("")) return decodedString } diff --git a/pkg/printers/json_test.go b/pkg/printers/json_test.go index 23b49fca95..2f56afa9c0 100644 --- a/pkg/printers/json_test.go +++ b/pkg/printers/json_test.go @@ -3,7 +3,7 @@ package printers_test import ( "bufio" "bytes" - "io/ioutil" + "os" "time" . "github.com/weaveworks/eksctl/pkg/printers" @@ -69,7 +69,7 @@ var _ = Describe("JSON Printer", func() { }) It("the output should equal the golden file jsontest_single.golden", func() { - g, err := ioutil.ReadFile("testdata/jsontest_single.golden") + g, err := os.ReadFile("testdata/jsontest_single.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } @@ -126,7 +126,7 @@ var _ = Describe("JSON Printer", func() { }) It("the output should equal the golden file jsontest_2clusters.golden", func() { - g, err := ioutil.ReadFile("testdata/jsontest_2clusters.golden") + g, err := os.ReadFile("testdata/jsontest_2clusters.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } diff --git a/pkg/printers/table_test.go b/pkg/printers/table_test.go index 5dd9afed22..0309516936 100644 --- a/pkg/printers/table_test.go +++ b/pkg/printers/table_test.go @@ -3,7 +3,7 @@ package printers_test import ( "bufio" "bytes" - "io/ioutil" + "os" "time" . "github.com/weaveworks/eksctl/pkg/printers" @@ -97,7 +97,7 @@ var _ = Describe("Table Printer", func() { }) It("the output should equal the golden file tabletest_emptyslicegolden", func() { - g, err := ioutil.ReadFile("testdata/tabletest_emptyslice.golden") + g, err := os.ReadFile("testdata/tabletest_emptyslice.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } @@ -142,7 +142,7 @@ var _ = Describe("Table Printer", func() { }) It("the output should equal the golden file tabletest_single.golden", func() { - g, err := ioutil.ReadFile("testdata/tabletest_single.golden") + g, err := os.ReadFile("testdata/tabletest_single.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } @@ -199,7 +199,7 @@ var _ = Describe("Table Printer", func() { }) It("the output should equal the golden file tabletest_2clusters.golden", func() { - g, err := ioutil.ReadFile("testdata/tabletest_2clusters.golden") + g, err := os.ReadFile("testdata/tabletest_2clusters.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } diff --git a/pkg/printers/yaml_test.go b/pkg/printers/yaml_test.go index 9e7bd3cca6..82290b33ef 100644 --- a/pkg/printers/yaml_test.go +++ b/pkg/printers/yaml_test.go @@ -1,12 +1,9 @@ package printers_test import ( - - //"reflect" - //"fmt" "bufio" "bytes" - "io/ioutil" + "os" "time" . "github.com/weaveworks/eksctl/pkg/printers" @@ -72,7 +69,7 @@ var _ = Describe("YAML Printer", func() { }) It("the output should equal the golden file yamltest_single.golden", func() { - g, err := ioutil.ReadFile("testdata/yamltest_single.golden") + g, err := os.ReadFile("testdata/yamltest_single.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } @@ -129,7 +126,7 @@ var _ = Describe("YAML Printer", func() { }) It("the output should equal the golden file yamltest_2clusters.golden", func() { - g, err := ioutil.ReadFile("testdata/yamltest_2clusters.golden") + g, err := os.ReadFile("testdata/yamltest_2clusters.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } diff --git a/pkg/ssh/client/ssh.go b/pkg/ssh/client/ssh.go index 79444c0ba2..b079f5d8a1 100644 --- a/pkg/ssh/client/ssh.go +++ b/pkg/ssh/client/ssh.go @@ -2,7 +2,7 @@ package client import ( "fmt" - "io/ioutil" + "os" "strings" "github.com/aws/aws-sdk-go/aws/awserr" @@ -172,7 +172,7 @@ func findKeyInEc2(name string, ec2API ec2iface.EC2API) (*ec2.KeyPairInfo, error) } func readFileContents(filePath string) ([]byte, error) { - fileContents, err := ioutil.ReadFile(filePath) + fileContents, err := os.ReadFile(filePath) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("reading SSH public key file %q", filePath)) } diff --git a/pkg/ssh/client/ssh_test.go b/pkg/ssh/client/ssh_test.go index bc78a8fdc2..ff2520c683 100644 --- a/pkg/ssh/client/ssh_test.go +++ b/pkg/ssh/client/ssh_test.go @@ -34,7 +34,7 @@ var _ = Describe("ssh public key", func() { keyName, err := LoadKeyFromFile("assets/id_rsa_tests1.pub", clusterName, ngName, mockEC2) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(keyName).To(Equal("eksctl-sshtestcluster-nodegroup-ng1-f5:d9:01:88:1e:fb:40:fb:e1:ca:69:fe:2e:31:03:6c")) mockEC2.AssertCalled(GinkgoT(), "ImportKeyPair", @@ -50,7 +50,7 @@ var _ = Describe("ssh public key", func() { keyName, err := LoadKeyFromFile("assets/id_rsa_tests1.pub", clusterName, ngName, mockEC2) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(keyName).To(Equal("eksctl-sshtestcluster-nodegroup-ng1-f5:d9:01:88:1e:fb:40:fb:e1:ca:69:fe:2e:31:03:6c")) mockEC2.AssertNotCalled(GinkgoT(), "ImportKeyPair", mock.Anything) }) @@ -80,7 +80,7 @@ var _ = Describe("ssh public key", func() { keyName, err := LoadKeyByContent(&key, clusterName, ngName, mockEC2) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(keyName).To(Equal("eksctl-sshtestcluster-nodegroup-ng1-f5:d9:01:88:1e:fb:40:fb:e1:ca:69:fe:2e:31:03:6c")) mockEC2.AssertCalled(GinkgoT(), "ImportKeyPair", @@ -96,7 +96,7 @@ var _ = Describe("ssh public key", func() { keyName, err := LoadKeyByContent(&key, clusterName, ngName, mockEC2) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(keyName).To(Equal("eksctl-sshtestcluster-nodegroup-ng1-f5:d9:01:88:1e:fb:40:fb:e1:ca:69:fe:2e:31:03:6c")) mockEC2.AssertNotCalled(GinkgoT(), "ImportKeyPair", mock.Anything) }) @@ -150,7 +150,7 @@ var _ = Describe("ssh public key", func() { err := CheckKeyExistsInEC2(keyName, mockEC2) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) }) It("should fail when key does not exist", func() { diff --git a/pkg/testutils/client.go b/pkg/testutils/client.go index 88589fe465..753fadade5 100644 --- a/pkg/testutils/client.go +++ b/pkg/testutils/client.go @@ -3,8 +3,9 @@ package testutils import ( "bytes" "fmt" - "io/ioutil" + "io" "net/http" + "os" . "github.com/onsi/gomega" @@ -27,11 +28,11 @@ func LoadSamples(manifest string) []runtime.Object { samples []runtime.Object ) - samplesData, err := ioutil.ReadFile(manifest) - Expect(err).ToNot(HaveOccurred()) + samplesData, err := os.ReadFile(manifest) + Expect(err).NotTo(HaveOccurred()) samplesList, err := kubernetes.NewList(samplesData) - Expect(err).ToNot(HaveOccurred()) - Expect(samplesList).ToNot(BeNil()) + Expect(err).NotTo(HaveOccurred()) + Expect(samplesList).NotTo(BeNil()) for _, item := range samplesList.Items { kind := item.Object.GetObjectKind().GroupVersionKind().Kind @@ -207,7 +208,7 @@ func NewFakeRawResource(item runtime.Object, missing, unionised bool, ct *Collec collection: ct, } - emptyBody := ioutil.NopCloser(bytes.NewReader([]byte{})) + emptyBody := io.NopCloser(bytes.NewReader([]byte{})) notFound := http.Response{StatusCode: http.StatusNotFound, Body: emptyBody} conflict := http.Response{StatusCode: http.StatusConflict, Body: emptyBody} @@ -218,7 +219,7 @@ func NewFakeRawResource(item runtime.Object, missing, unionised bool, ct *Collec asResult := func(req *http.Request) (*http.Response, error) { data, err := runtime.Encode(unstructured.UnstructuredJSONScheme, item) Expect(err).To(Not(HaveOccurred())) - res := &http.Response{StatusCode: http.StatusOK, Body: ioutil.NopCloser(bytes.NewReader(data))} + res := &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewReader(data))} return res, nil } diff --git a/pkg/testutils/mockprovider/mock_provider.go b/pkg/testutils/mockprovider/mock_provider.go index 47f606f62c..09bdd9f8b7 100644 --- a/pkg/testutils/mockprovider/mock_provider.go +++ b/pkg/testutils/mockprovider/mock_provider.go @@ -8,6 +8,7 @@ import ( "github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface" "github.com/aws/aws-sdk-go/service/cloudformation/cloudformationiface" "github.com/aws/aws-sdk-go/service/cloudtrail/cloudtrailiface" + "github.com/aws/aws-sdk-go/service/cloudwatchlogs/cloudwatchlogsiface" "github.com/aws/aws-sdk-go/service/ec2/ec2iface" "github.com/aws/aws-sdk-go/service/eks/eksiface" "github.com/aws/aws-sdk-go/service/elb/elbiface" @@ -62,6 +63,7 @@ type MockProvider struct { ssm *mocks.SSMAPI iam *mocks.IAMAPI cloudtrail *mocks.CloudTrailAPI + cloudwatchlogs *mocks.CloudWatchLogsAPI configProvider *mocks.ConfigProvider } @@ -80,6 +82,7 @@ func NewMockProvider() *MockProvider { ssm: &mocks.SSMAPI{}, iam: &mocks.IAMAPI{}, cloudtrail: &mocks.CloudTrailAPI{}, + cloudwatchlogs: &mocks.CloudWatchLogsAPI{}, configProvider: &mocks.ConfigProvider{}, } } @@ -150,6 +153,14 @@ func (m MockProvider) MockCloudTrail() *mocks.CloudTrailAPI { return m.CloudTrail().(*mocks.CloudTrailAPI) } +// CloudWatchLogs returns a representation of the CloudWatchLogs API +func (m MockProvider) CloudWatchLogs() cloudwatchlogsiface.CloudWatchLogsAPI { return m.cloudwatchlogs } + +// MockCloudWatchLogs returns a mocked CloudWatchLogs API +func (m MockProvider) MockCloudWatchLogs() *mocks.CloudWatchLogsAPI { + return m.CloudWatchLogs().(*mocks.CloudWatchLogsAPI) +} + // Profile returns current profile setting func (m MockProvider) Profile() string { return ProviderConfig.Profile } diff --git a/pkg/testutils/testutils.go b/pkg/testutils/testutils.go deleted file mode 100644 index e313025db4..0000000000 --- a/pkg/testutils/testutils.go +++ /dev/null @@ -1,17 +0,0 @@ -package testutils - -import ( - "bytes" - "encoding/json" - "io" - - . "github.com/onsi/gomega" - - "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" -) - -func ClusterConfigReader(clusterConfig *v1alpha5.ClusterConfig) io.Reader { - data, err := json.Marshal(clusterConfig) - Expect(err).ToNot(HaveOccurred()) - return bytes.NewReader(data) -} diff --git a/pkg/utils/dir/dir_test.go b/pkg/utils/dir/dir_test.go index ee8f5d532c..eee3efeb15 100644 --- a/pkg/utils/dir/dir_test.go +++ b/pkg/utils/dir/dir_test.go @@ -1,7 +1,6 @@ package dir_test import ( - "io/ioutil" "os" "path/filepath" "testing" @@ -18,7 +17,7 @@ func TestUtilsDir(t *testing.T) { var _ = Describe("dir.IsEmpty", func() { It("should return true when passed an empty directory", func() { - d, err := ioutil.TempDir("", "test_dir_isempty") + d, err := os.MkdirTemp("", "test_dir_isempty") Expect(err).NotTo(HaveOccurred()) defer os.RemoveAll(d) // clean up. @@ -28,7 +27,7 @@ var _ = Describe("dir.IsEmpty", func() { }) It("should return false when passed a directory containing another directory", func() { - d, err := ioutil.TempDir("", "test_dir_isempty") + d, err := os.MkdirTemp("", "test_dir_isempty") Expect(err).NotTo(HaveOccurred()) defer os.RemoveAll(d) // clean up. err = os.Mkdir(filepath.Join(d, "subdir"), 0755) @@ -40,7 +39,7 @@ var _ = Describe("dir.IsEmpty", func() { }) It("should return false when passed a directory containing a file", func() { - d, err := ioutil.TempDir("", "test_dir_isempty") + d, err := os.MkdirTemp("", "test_dir_isempty") Expect(err).NotTo(HaveOccurred()) defer os.RemoveAll(d) // clean up. f, err := os.OpenFile(filepath.Join(d, "file.tmp"), os.O_CREATE, 0755) diff --git a/pkg/utils/instance/instance.go b/pkg/utils/instance/instance.go new file mode 100644 index 0000000000..98e554b1ef --- /dev/null +++ b/pkg/utils/instance/instance.go @@ -0,0 +1,32 @@ +package instance + +import ( + "strings" +) + +// IsARMInstanceType returns true if the instance type is ARM architecture +func IsARMInstanceType(instanceType string) bool { + return strings.HasPrefix(instanceType, "a1") || + strings.HasPrefix(instanceType, "t4g") || + strings.HasPrefix(instanceType, "m6g") || + strings.HasPrefix(instanceType, "m6gd") || + strings.HasPrefix(instanceType, "c6g") || + strings.HasPrefix(instanceType, "c6gd") || + strings.HasPrefix(instanceType, "r6g") || + strings.HasPrefix(instanceType, "r6gd") +} + +// IsGPUInstanceType returns true if the instance type is GPU optimised +func IsGPUInstanceType(instanceType string) bool { + return strings.HasPrefix(instanceType, "p2") || + strings.HasPrefix(instanceType, "p3") || + strings.HasPrefix(instanceType, "p4") || + strings.HasPrefix(instanceType, "g3") || + strings.HasPrefix(instanceType, "g4") || + strings.HasPrefix(instanceType, "inf1") +} + +// IsInferentiaInstanceType returns true if the instance type requires AWS Neuron +func IsInferentiaInstanceType(instanceType string) bool { + return strings.HasPrefix(instanceType, "inf1") +} diff --git a/pkg/utils/kubeconfig/kubeconfig.go b/pkg/utils/kubeconfig/kubeconfig.go index 739a216257..66468324f9 100644 --- a/pkg/utils/kubeconfig/kubeconfig.go +++ b/pkg/utils/kubeconfig/kubeconfig.go @@ -3,12 +3,11 @@ package kubeconfig import ( "fmt" "os" + "os/exec" "path" "path/filepath" "strings" - "os/exec" - "github.com/gofrs/flock" "github.com/kris-nova/logger" "github.com/pkg/errors" diff --git a/pkg/utils/kubeconfig/kubeconfig_test.go b/pkg/utils/kubeconfig/kubeconfig_test.go index ddcb9a0f54..f84ddd8557 100644 --- a/pkg/utils/kubeconfig/kubeconfig_test.go +++ b/pkg/utils/kubeconfig/kubeconfig_test.go @@ -1,7 +1,6 @@ package kubeconfig_test import ( - "io/ioutil" "os" "path" "sync" @@ -32,7 +31,7 @@ var _ = Describe("Kubeconfig", func() { var exampleSSHKeyPath = "~/.ssh/id_rsa.pub" BeforeEach(func() { - configFile, _ = ioutil.TempFile("", "") + configFile, _ = os.CreateTemp("", "") }) AfterEach(func() { @@ -40,12 +39,12 @@ var _ = Describe("Kubeconfig", func() { }) var writeConfig = func(filename string) error { - minikubeSample, err := ioutil.ReadFile("testdata/minikube_sample.golden") + minikubeSample, err := os.ReadFile("testdata/minikube_sample.golden") if err != nil { GinkgoT().Fatalf("failed reading .golden: %s", err) } - return ioutil.WriteFile(filename, minikubeSample, os.FileMode(0755)) + return os.WriteFile(filename, minikubeSample, os.FileMode(0755)) } It("creating new Kubeconfig", func() { @@ -72,10 +71,10 @@ var _ = Describe("Kubeconfig", func() { }) It("creating new Kubeconfig in non-existent directory", func() { - tempDir, _ := ioutil.TempDir("", "") + tempDir, _ := os.MkdirTemp("", "") filename, err := kubeconfig.Write(path.Join(tempDir, "nonexistentdir", "kubeconfig"), testConfig, false) Expect(err).To(BeNil()) - Expect(filename).ToNot(BeEmpty()) + Expect(filename).NotTo(BeEmpty()) }) It("sets new Kubeconfig context", func() { @@ -229,23 +228,23 @@ var _ = Describe("Kubeconfig", func() { var err error - if emptyClusterAsBytes, err = ioutil.ReadFile("testdata/empty_cluster.golden"); err != nil { + if emptyClusterAsBytes, err = os.ReadFile("testdata/empty_cluster.golden"); err != nil { GinkgoT().Fatalf("failed reading .golden: %v", err) } - if oneClusterAsBytes, err = ioutil.ReadFile("testdata/one_cluster.golden"); err != nil { + if oneClusterAsBytes, err = os.ReadFile("testdata/one_cluster.golden"); err != nil { GinkgoT().Fatalf("failed reading .golden: %v", err) } - if twoClustersAsBytes, err = ioutil.ReadFile("testdata/two_clusters.golden"); err != nil { + if twoClustersAsBytes, err = os.ReadFile("testdata/two_clusters.golden"); err != nil { GinkgoT().Fatalf("failed reading .golden: %v", err) } - if oneClusterWithoutContextAsBytes, err = ioutil.ReadFile("testdata/one_cluster_without_context.golden"); err != nil { + if oneClusterWithoutContextAsBytes, err = os.ReadFile("testdata/one_cluster_without_context.golden"); err != nil { GinkgoT().Fatalf("failed reading .golden: %v", err) } - if oneClusterWithStaleContextAsBytes, err = ioutil.ReadFile("testdata/one_cluster_with_stale_context.golden"); err != nil { + if oneClusterWithStaleContextAsBytes, err = os.ReadFile("testdata/one_cluster_with_stale_context.golden"); err != nil { GinkgoT().Fatalf("failed reading .golden: %v", err) } @@ -264,7 +263,7 @@ var _ = Describe("Kubeconfig", func() { existingClusterConfig := GetClusterConfig("cluster-one") kubeconfig.MaybeDeleteConfig(existingClusterConfig.Metadata) - configFileAsBytes, err := ioutil.ReadFile(configFile.Name()) + configFileAsBytes, err := os.ReadFile(configFile.Name()) Expect(err).To(BeNil()) Expect(configFileAsBytes).To(MatchYAML(emptyClusterAsBytes), "Failed to delete cluster from config") }) @@ -273,7 +272,7 @@ var _ = Describe("Kubeconfig", func() { existingClusterConfig := GetClusterConfig("cluster-one") kubeconfig.MaybeDeleteConfig(existingClusterConfig.Metadata) - configFileAsBytes, err := ioutil.ReadFile(configFile.Name()) + configFileAsBytes, err := os.ReadFile(configFile.Name()) Expect(err).To(BeNil()) Expect(configFileAsBytes).To(MatchYAML(oneClusterWithoutContextAsBytes), "Failed to delete cluster from config") }) @@ -285,7 +284,7 @@ var _ = Describe("Kubeconfig", func() { existingClusterConfig := GetClusterConfig("cluster-one") kubeconfig.MaybeDeleteConfig(existingClusterConfig.Metadata) - configFileAsBytes, err := ioutil.ReadFile(configFile.Name()) + configFileAsBytes, err := os.ReadFile(configFile.Name()) Expect(err).To(BeNil()) Expect(configFileAsBytes).To(MatchYAML(oneClusterWithoutContextAsBytes), "Updated config") @@ -295,7 +294,7 @@ var _ = Describe("Kubeconfig", func() { existingClusterConfig := GetClusterConfig("cluster-two") kubeconfig.MaybeDeleteConfig(existingClusterConfig.Metadata) - configFileAsBytes, err := ioutil.ReadFile(configFile.Name()) + configFileAsBytes, err := os.ReadFile(configFile.Name()) Expect(err).To(BeNil()) Expect(configFileAsBytes).To(MatchYAML(oneClusterAsBytes), "Failed to delete cluster from config") }) @@ -304,7 +303,7 @@ var _ = Describe("Kubeconfig", func() { nonExistentClusterConfig := GetClusterConfig("not-a-cluster") kubeconfig.MaybeDeleteConfig(nonExistentClusterConfig.Metadata) - configFileAsBytes, err := ioutil.ReadFile(configFile.Name()) + configFileAsBytes, err := os.ReadFile(configFile.Name()) Expect(err).To(BeNil()) Expect(configFileAsBytes).To(MatchYAML(twoClustersAsBytes), "Should not change") }) @@ -318,7 +317,7 @@ var _ = Describe("Kubeconfig", func() { ChangeKubeconfig() var err error - tmp, err := ioutil.TempFile("", "") + tmp, err := os.CreateTemp("", "") Expect(err).To(BeNil()) { diff --git a/pkg/utils/tasks/tasks.go b/pkg/utils/tasks/tasks.go index c60c294257..f625cdc74e 100644 --- a/pkg/utils/tasks/tasks.go +++ b/pkg/utils/tasks/tasks.go @@ -62,38 +62,73 @@ func (t *TaskTree) Len() int { return len(t.Tasks) } -// Describe the set +// Describe collects all tasks which have been added to the task tree. +// This is a lazy tree which does not track its nodes in any form. This function +// is recursively called from the rest of the task Describes and eventually +// returns a collection of all the tasks' `Info` value. func (t *TaskTree) Describe() string { - descriptions := []string{} - for _, task := range t.Tasks { - descriptions = append(descriptions, task.Describe()) + if t.Len() == 0 { + return "no tasks" } - mode := "sequential" - if t.Parallel { - mode = "parallel" + var descriptions []string + for _, task := range t.Tasks { + descriptions = append(descriptions, strings.TrimSuffix(task.Describe(), "\n")) } - count := len(descriptions) - var msg string noun := "task" if t.IsSubTask { noun = "sub-task" } - switch count { - case 0: - msg = "no tasks" - case 1: - msg = fmt.Sprintf("1 %s: { %s }", noun, descriptions[0]) + if len(descriptions) == 1 { + msg := fmt.Sprintf("1 %s: { %s }", noun, descriptions[0]) if t.IsSubTask { - msg = descriptions[0] // simple description for single sub-task + msg = descriptions[0] + } + return msg + } + count := len(descriptions) + mode := "sequential" + if t.Parallel { + mode = "parallel" + } + noun += "s" + head := fmt.Sprintf("\n%d %s %s: { ", count, mode, noun) + var tail string + if t.IsSubTask { + // Only add a linebreak at the end if we have multiple subtasks as well. Otherwise, leave it + // as single line. + head = fmt.Sprintf("\n%s%d %s %s: { ", strings.Repeat(" ", 4), count, mode, noun) + tail = "\n" + for _, d := range descriptions { + // all tasks are sub-tasks if they are inside a task. + // which means we don't have to care about sequential tasks. + if strings.Contains(d, "sub-task") { + // trim the previous leading tail new line... + d = strings.TrimPrefix(d, "\n") + split := strings.Split(d, "\n") + // indent all lines of the subtask one deepness more + var result []string + for _, s := range split { + result = append(result, strings.Repeat(" ", 4)+s) + } + // join it back up with line breaks + d = strings.Join(result, "\n") + } else { + d = strings.Repeat(" ", 8) + d + } + tail += fmt.Sprintf("%s,\n", d) } - default: - noun += "s" - msg = fmt.Sprintf("%d %s %s: { %s }", count, mode, noun, strings.Join(descriptions, ", ")) + // closing the final bracket + tail += fmt.Sprintf("%s}", strings.Repeat(" ", 4)) + } else { + // if it isn't a subtask, we just add the descriptions as is joined by new line. + // this results in line like `1 task: { t1.1 }` which are more readable this way. + tail = fmt.Sprintf("%s \n}", strings.Join(descriptions, ", ")) } + msg := head + tail if t.PlanMode { - return "(plan) " + msg + msg = "(plan) " + msg } - return msg + return msg + "\n" } // Do will run through the set in the background, it may return an error immediately, diff --git a/pkg/utils/tasks/tasks_test.go b/pkg/utils/tasks/tasks_test.go index cf6aed2dcc..8946e9a533 100644 --- a/pkg/utils/tasks/tasks_test.go +++ b/pkg/utils/tasks/tasks_test.go @@ -21,9 +21,15 @@ var _ = Describe("TaskTree", func() { tasks.IsSubTask = true tasks.PlanMode = true tasks.Append(&TaskTree{Parallel: false, IsSubTask: true}) - Expect(tasks.Describe()).To(Equal("(plan) 2 sequential sub-tasks: { no tasks, no tasks }")) + fmt.Println(tasks.Describe()) + expected := []byte(`(plan) + 2 sequential sub-tasks: { + no tasks, + no tasks, + } +`) + Expect([]byte(tasks.Describe())).To(Equal(expected)) } - { tasks := &TaskTree{Parallel: false} subTask1 := &TaskTree{Parallel: false, IsSubTask: true} @@ -48,7 +54,17 @@ var _ = Describe("TaskTree", func() { tasks.Append(subTask2) subTask1.Append(subTask3) - Expect(tasks.Describe()).To(Equal("2 sequential tasks: { 2 sequential sub-tasks: { t1.1, 2 parallel sub-tasks: { t3.1, t3.2 } }, t2.1 }")) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { + 2 sequential sub-tasks: { + t1.1, + 2 parallel sub-tasks: { + t3.1, + t3.2, + }, + }, t2.1 +} +`)) } }) @@ -130,7 +146,17 @@ var _ = Describe("TaskTree", func() { }) subTask1.Append(subTask3) - Expect(tasks.Describe()).To(Equal("2 sequential tasks: { 2 sequential sub-tasks: { t1.1, 2 parallel sub-tasks: { t3.1, t3.2 } }, t2.1 }")) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { + 2 sequential sub-tasks: { + t1.1, + 2 parallel sub-tasks: { + t3.1, + t3.2, + }, + }, t2.1 +} +`)) status.startTime = time.Now() errs := tasks.DoAllSync() @@ -240,7 +266,17 @@ var _ = Describe("TaskTree", func() { }) subTask1.Append(subTask3) - Expect(tasks.Describe()).To(Equal("2 sequential tasks: { 2 sequential sub-tasks: { t1.1, 2 parallel sub-tasks: { t3.1, t3.2 } }, t2.1 }")) + Expect(tasks.Describe()).To(Equal(` +2 sequential tasks: { + 2 sequential sub-tasks: { + t1.1, + 2 parallel sub-tasks: { + t3.1, + t3.2, + }, + }, t2.1 +} +`)) status.startTime = time.Now() errs := tasks.DoAllSync() diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index bfe395d887..a97045b656 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -9,33 +9,6 @@ import ( "github.com/pkg/errors" ) -// IsARMInstanceType returns true if the instance type is ARM architecture -func IsARMInstanceType(instanceType string) bool { - return strings.HasPrefix(instanceType, "a1") || - strings.HasPrefix(instanceType, "t4g") || - strings.HasPrefix(instanceType, "m6g") || - strings.HasPrefix(instanceType, "m6gd") || - strings.HasPrefix(instanceType, "c6g") || - strings.HasPrefix(instanceType, "c6gd") || - strings.HasPrefix(instanceType, "r6g") || - strings.HasPrefix(instanceType, "r6gd") -} - -// IsGPUInstanceType returns true if the instance type is GPU optimised -func IsGPUInstanceType(instanceType string) bool { - return strings.HasPrefix(instanceType, "p2") || - strings.HasPrefix(instanceType, "p3") || - strings.HasPrefix(instanceType, "p4") || - strings.HasPrefix(instanceType, "g3") || - strings.HasPrefix(instanceType, "g4") || - strings.HasPrefix(instanceType, "inf1") -} - -// IsInferentiaInstanceType returns true if the instance type requires AWS Neuron -func IsInferentiaInstanceType(instanceType string) bool { - return strings.HasPrefix(instanceType, "inf1") -} - var matchFirstCap = regexp.MustCompile("([0-9]+|[A-Z])") // ToKebabCase turns a CamelCase string into a kebab-case string diff --git a/pkg/version/release.go b/pkg/version/release.go index a4dbc7dc20..afdba68c74 100644 --- a/pkg/version/release.go +++ b/pkg/version/release.go @@ -3,7 +3,7 @@ package version // This file was generated by release_generate.go; DO NOT EDIT. // Version is the version number in semver format X.Y.Z -var Version = "0.70.0" +var Version = "0.74.0" // PreReleaseID can be empty for releases, "rc.X" for release candidates and "dev" for snapshots var PreReleaseID = "dev" diff --git a/pkg/vpc/vpc_test.go b/pkg/vpc/vpc_test.go index dd7253e099..b10010ac6e 100644 --- a/pkg/vpc/vpc_test.go +++ b/pkg/vpc/vpc_test.go @@ -709,7 +709,7 @@ var _ = Describe("VPC", func() { if e.error != nil { Expect(err).To(MatchError(e.error.Error())) } else { - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(*e.cfg.VPC.Subnets).To(Equal(e.expected)) } }, @@ -923,7 +923,7 @@ var _ = Describe("VPC", func() { DescribeTable("select subnets", func(e selectSubnetsCase) { ids, err := SelectNodeGroupSubnets(e.nodegroupAZs, e.nodegroupSubnets, e.subnets, nil, "") - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ids).To(ConsistOf(e.expectIDs)) }, Entry("one subnet", selectSubnetsCase{ @@ -999,7 +999,7 @@ var _ = Describe("VPC", func() { }, }, nil) ids, err := SelectNodeGroupSubnets([]string{az}, []string{subnetID}, api.AZSubnetMappingFromMap(azMap), mockEC2, vpcID) - Expect(err).ToNot(HaveOccurred()) + Expect(err).NotTo(HaveOccurred()) Expect(ids).To(ConsistOf("id-1", "id-2", subnetID)) }) }) diff --git a/tools.go b/tools.go index b67d1d5df6..cecb7fea8c 100644 --- a/tools.go +++ b/tools.go @@ -1,4 +1,4 @@ -// +build tools +//go:build tools package eksctl @@ -9,7 +9,6 @@ import ( _ "github.com/github-release/github-release" _ "github.com/golangci/golangci-lint/cmd/golangci-lint" _ "github.com/goreleaser/goreleaser" - _ "github.com/kevinburke/go-bindata/go-bindata" _ "github.com/maxbrunsfeld/counterfeiter/v6" _ "github.com/vektra/mockery/cmd/mockery" _ "golang.org/x/tools/cmd/stringer" diff --git a/userdocs/requirements.txt b/userdocs/requirements.txt index f965b22972..88c403fcee 100644 --- a/userdocs/requirements.txt +++ b/userdocs/requirements.txt @@ -1,4 +1,4 @@ -mkdocs == 1.1 +mkdocs == 1.2.3 mkdocs-material == 5.3.3 mkdocs-redirects pymdown-extensions == 7.1 diff --git a/userdocs/src/introduction.md b/userdocs/src/introduction.md index bcbffb674e..f26e71f80f 100644 --- a/userdocs/src/introduction.md +++ b/userdocs/src/introduction.md @@ -23,7 +23,7 @@ eksctl create cluster --name=cluster-1 --nodes=4 ``` -EKS supports versions `1.16`, `1.17`, `1.18`, `1.19`, `1.20` (default) and `1.21`. +EKS supports versions `1.16`, `1.17`, `1.18`, `1.19`, `1.20` and `1.21` (default). With `eksctl` you can deploy any of the supported versions by passing `--version`. ``` diff --git a/userdocs/src/usage/custom-ami-support.md b/userdocs/src/usage/custom-ami-support.md index 6a47b27ffa..da5b3f449c 100644 --- a/userdocs/src/usage/custom-ami-support.md +++ b/userdocs/src/usage/custom-ami-support.md @@ -68,6 +68,7 @@ The `--node-ami-family` can take following keywords: | WindowsServer2019FullContainer | Indicates that the EKS AMI image based on Windows Server 2019 Full Container should be used. | | WindowsServer2019CoreContainer | Indicates that the EKS AMI image based on Windows Server 2019 Core Container should be used. | | WindowsServer2004CoreContainer | Indicates that the EKS AMI image based on Windows Server 2004 Core Container should be used. | +| WindowsServer20H2CoreContainer | Indicates that the EKS AMI image based on Windows Server 20H2 Core Container should be used. | CLI flag example: ```sh diff --git a/userdocs/src/usage/iam-identity-mappings.md b/userdocs/src/usage/iam-identity-mappings.md index a35a8c1dc9..dc950d74aa 100644 --- a/userdocs/src/usage/iam-identity-mappings.md +++ b/userdocs/src/usage/iam-identity-mappings.md @@ -21,12 +21,24 @@ Create an identity mapping: eksctl create iamidentitymapping --cluster my-cluster-1 --arn arn:aws:iam::123456:role/testing --group system:masters --username admin ``` -Delete a mapping: +Delete an identity mapping: ```bash eksctl delete iamidentitymapping --cluster my-cluster-1 --arn arn:aws:iam::123456:role/testing ``` !!!note - Above command deletes a single mapping FIFO unless `--all` is given in which case it removes all matching. Will warn if - more mappings matching this role are found. +Above command deletes a single mapping FIFO unless `--all` is given in which case it removes all matching. Will warn if +more mappings matching this role are found. + +Create an account mapping: + +```bash + eksctl create iamidentitymapping --cluster my-cluster-1 --account user-account +``` + +Delete an account mapping: + +```bash + eksctl delete iamidentitymapping --cluster my-cluster-1 --account user-account +``` diff --git a/userdocs/src/usage/windows-worker-nodes.md b/userdocs/src/usage/windows-worker-nodes.md index 96bd63ba20..e9c28aeee0 100644 --- a/userdocs/src/usage/windows-worker-nodes.md +++ b/userdocs/src/usage/windows-worker-nodes.md @@ -64,7 +64,9 @@ To ensure workloads are scheduled on the right OS, they must have a `nodeSelecto nodeSelector: kubernetes.io/os: windows kubernetes.io/arch: amd64 +``` +```yaml # Targeting Linux nodeSelector: kubernetes.io/os: linux