From 803a7489af47f2339cd02c2fd577c54cb108d1a5 Mon Sep 17 00:00:00 2001 From: Claudia Beresford Date: Mon, 1 Nov 2021 10:51:30 +0000 Subject: [PATCH 1/5] Add e2e Dockerfile --- Makefile | 7 ++++++ hack/scripts/bootstrap.sh | 47 ++++++++++++++++++++++++++++++++++++++ hack/scripts/devpool.sh | 37 ++++++++++++++++++------------ test/docker/Dockerfile.e2e | 12 ++++++++++ test/docker/entrypoint.sh | 42 ++++++++++++++++++++++++++++++++++ 5 files changed, 130 insertions(+), 15 deletions(-) create mode 100755 hack/scripts/bootstrap.sh create mode 100644 test/docker/Dockerfile.e2e create mode 100755 test/docker/entrypoint.sh diff --git a/Makefile b/Makefile index cd148c9c..18798a46 100644 --- a/Makefile +++ b/Makefile @@ -105,6 +105,13 @@ test-e2e: ## Run e2e tests compile-e2e: # Test e2e compilation go test -c -o /dev/null -tags=e2e ./test/e2e +##@ Docker + +.PHONY: docker-build +docker-build: ## Build the e2e docker image + docker build -t fl-e2e:latest -f test/docker/Dockerfile.e2e . + + ##@ Tools binaries $(GOLANGCI_LINT): $(TOOLS_DIR)/go.mod # Get and build golangci-lint diff --git a/hack/scripts/bootstrap.sh b/hack/scripts/bootstrap.sh new file mode 100755 index 00000000..07527e7a --- /dev/null +++ b/hack/scripts/bootstrap.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +if [[ $(id -u) != 0 ]]; then + echo "Run this script as root..." >&2 + exit 1 +fi + +GO_VERSION="1.17.2" +INSTALL_ROOT="/usr/local" + +# install packages +apt update +apt install -y \ + jq \ + wget \ + unzip \ + curl \ + tmux \ + gcc \ + vim \ + iproute2 \ + bc \ + dmsetup \ + make \ + iproute2 \ + git + +# install go +export PATH="$PATH:$INSTALL_ROOT/go/bin" +curl -sL "https://golang.org/dl/go$GO_VERSION.linux-amd64.tar.gz" | tar xz -C "$INSTALL_ROOT" && \ + go version + +# install firecracker +wget -O /tmp/firecracker_macvtap.zip https://github.com/weaveworks/flintlock/files/7278467/firecracker_macvtap.zip && \ + unzip -o /tmp/firecracker_macvtap.zip -d "$INSTALL_ROOT/bin" && \ + firecracker --version + +# install and setup containerd +curl -sL https://api.github.com/repos/containerd/containerd/releases/latest 2>/dev/null | \ + jq -r '.assets[] | select(.browser_download_url | test("containerd-\\d.\\d.\\d-linux-amd64.tar.gz$")) | .browser_download_url' | \ + xargs curl -sL | tar xz -C "$INSTALL_ROOT" && containerd --version && ctr --version + +# install grpcurl +go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest && \ + grpcurl --version diff --git a/hack/scripts/devpool.sh b/hack/scripts/devpool.sh index dfbf26b9..4706432e 100755 --- a/hack/scripts/devpool.sh +++ b/hack/scripts/devpool.sh @@ -10,34 +10,41 @@ fi # That's where our stuff will live. CROOT=/var/lib/containerd-dev # This is the name of the thinpool. -POOL=dev-thinpool - -mkdir -p "${CROOT}/snapshotter/devmapper" - +POOL="${1:-dev-thinpool}" +# This is the tag which will be appended to the loop device volumes +VOL_TAG="" +if [[ -n "$2" ]]; then + VOL_TAG="-$2" +fi +# These are some useful vars for useful things DIR="${CROOT}/snapshotter/devmapper" +META="${CROOT}/snapshotter/devmapper/metadata$VOL_TAG" +DATA="${CROOT}/snapshotter/devmapper/data$VOL_TAG" + +mkdir -p "${DIR}" # Create "data" file/volume if it's not there and set it's size to 100G. -if [[ ! -f "${DIR}/data" ]]; then -touch "${DIR}/data" -truncate -s 100G "${DIR}/data" +if [[ ! -f "${DATA}" ]]; then +touch "${DATA}" +truncate -s 100G "${DATA}" fi # Create "metadata" file/volume if it's not there and set it's size to 2G. -if [[ ! -f "${DIR}/metadata" ]]; then -touch "${DIR}/metadata" -truncate -s 10G "${DIR}/metadata" +if [[ ! -f "${META}" ]]; then +touch "${META}" +truncate -s 10G "${META}" fi # Find/associate a loop device with our data volume. -DATADEV="$(sudo losetup --output NAME --noheadings --associated ${DIR}/data)" +DATADEV="$(losetup --output NAME --noheadings --associated ${DATA})" if [[ -z "${DATADEV}" ]]; then - DATADEV="$(sudo losetup --find --show ${DIR}/data)" + DATADEV="$(losetup --find --show ${DATA})" fi # Find/associate a loop device with our metadata volume. -METADEV="$(sudo losetup --output NAME --noheadings --associated ${DIR}/metadata)" +METADEV="$(losetup --output NAME --noheadings --associated ${META})" if [[ -z "${METADEV}" ]]; then - METADEV="$(sudo losetup --find --show ${DIR}/metadata)" + METADEV="$(losetup --find --show ${META})" fi # Magic calculations, for more information go and read @@ -57,7 +64,7 @@ echo "${THINP_TABLE}" # If thinpool does not exist yet, create one. if ! $(dmsetup reload "${POOL}" --table "${THINP_TABLE}"); then - sudo dmsetup create "${POOL}" --table "${THINP_TABLE}" + dmsetup create "${POOL}" --table "${THINP_TABLE}" fi cat << EOF diff --git a/test/docker/Dockerfile.e2e b/test/docker/Dockerfile.e2e new file mode 100644 index 00000000..dd7a185c --- /dev/null +++ b/test/docker/Dockerfile.e2e @@ -0,0 +1,12 @@ +FROM ubuntu + +ENV PATH="$PATH:/usr/local/go/bin:/root/go/bin" + +COPY hack/scripts/bootstrap.sh /tmp/bootstrap.sh +RUN chmod +x /tmp/bootstrap.sh +RUN /tmp/bootstrap.sh + +COPY hack/scripts/devpool.sh /tmp/devpool.sh +RUN chmod +x /tmp/devpool.sh +COPY test/docker/entrypoint.sh /entrypoint +ENTRYPOINT ["/entrypoint"] diff --git a/test/docker/entrypoint.sh b/test/docker/entrypoint.sh new file mode 100755 index 00000000..0c0ceda7 --- /dev/null +++ b/test/docker/entrypoint.sh @@ -0,0 +1,42 @@ +#!/bin/bash -ex + +THINPOOL="dev-thinpool-e2e" +LOOP_TAG="e2e" +CTRD_ROOT="/var/lib/containerd-dev" +CTRD_STATE="/run/containerd-dev" +CTRD_CFG="/etc/containerd" +DM_ROOT="$CTRD_ROOT/snapshotter/devmapper" + +cleanup() { + dmsetup ls | awk -v pool="$THINPOOL" '$0 ~ pool {print $1}' | xargs -I {} dmsetup remove {} --force + losetup | awk -v loop="$LOOP_TAG" '$0 ~ loop {print $1}' | xargs losetup -d +} + +trap 'true' SIGINT SIGTERM + +/tmp/devpool.sh "$THINPOOL" "$LOOP_TAG" + +mkdir -p "$DM_ROOT" "$CTRD_STATE" "$CTRD_CFG" +cat > "$CTRD_CFG/config-dev.toml" < Date: Fri, 29 Oct 2021 15:28:22 +0100 Subject: [PATCH 2/5] Initial e2e CRUD tests --- Makefile | 33 ++++-- go.mod | 54 ++------- go.sum | 128 +-------------------- test/e2e/e2e_test.go | 233 ++++++++++++++++++++++++--------------- test/e2e/utils/runner.go | 126 +++++++++++++++++++++ 5 files changed, 306 insertions(+), 268 deletions(-) create mode 100644 test/e2e/utils/runner.go diff --git a/Makefile b/Makefile index 18798a46..b64fc189 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,9 @@ PROTO_GEN_GRPC_GW := $(TOOLS_BIN_DIR)/protoc-gen-grpc-gateway PROTO_GEN_GRPC_OAPI := $(TOOLS_BIN_DIR)/protoc-gen-openapiv2 WIRE := $(TOOLS_BIN_DIR)/wire +# Useful things +test_image = weaveworks/flintlock-e2e + .DEFAULT_GOAL := help ##@ Build @@ -58,11 +61,10 @@ build-release: $(BIN_DIR) ## Build the release binaries CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o $(BIN_DIR)/flintlockd_amd64 -ldflags "-X $(VERSION_PKG).Version=$(VERSION) -X $(VERSION_PKG).BuildDate=$(BUILD_DATE) -X $(VERSION_PKG).CommitHash=$(GIT_COMMIT)" ./cmd/flintlockd CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o $(BIN_DIR)/flintlockd_arm64 -ldflags "-X $(VERSION_PKG).Version=$(VERSION) -X $(VERSION_PKG).BuildDate=$(BUILD_DATE) -X $(VERSION_PKG).CommitHash=$(GIT_COMMIT)" ./cmd/flintlockd - ##@ Generate .PHONY: generate -generate: $(BUF) $(MOCKGEN) ## Generate code +generate: $(BUF) $(MOCKGEN) generate: ## Generate code $(MAKE) generate-go $(MAKE) generate-proto @@ -98,19 +100,34 @@ test-with-cov: ## Run unit tests with coverage go test -v -race -timeout 2m -p 1 -covermode=atomic -coverprofile=coverage.txt ./... .PHONY: test-e2e -test-e2e: ## Run e2e tests - go test -timeout 30m -p 1 -v -tags=e2e ./test/e2e/... +test-e2e: compile-e2e ## Run e2e tests locally in a container + docker run --rm -it \ + --privileged \ + --volume /dev:/dev \ + --volume /run/udev/control:/run/udev/control \ + --volume $(REPO_ROOT):/src/flintlock \ + --ipc=host \ + --workdir=/src/flintlock \ + $(test_image):latest \ + "go test -timeout 30m -p 1 -v -tags=e2e ./test/e2e/..." + +.PHONY: test-e2e-metal +test-e2e-metal: ## Run e2e tests in Equinix + echo "coming soon to some hardware near you" .PHONY: compile-e2e -compile-e2e: # Test e2e compilation +compile-e2e: ## Test e2e compilation go test -c -o /dev/null -tags=e2e ./test/e2e ##@ Docker .PHONY: docker-build docker-build: ## Build the e2e docker image - docker build -t fl-e2e:latest -f test/docker/Dockerfile.e2e . + docker build -t $(test_image):latest -f test/docker/Dockerfile.e2e . +.PHONY: docker-push +docker-push: docker-build ## Push the e2e docker image to weaveworks/fl-e2e + docker push $(test_image):latest ##@ Tools binaries @@ -144,7 +161,6 @@ ifeq ($(OS), darwin) BUF_TARGET := buf-Darwin-x86_64.tar.gz endif - BUF_SHARE := $(TOOLS_SHARE_DIR)/buf.tar.gz $(BUF_SHARE): $(TOOLS_SHARE_DIR) curl -sL -o $(BUF_SHARE) "https://github.com/bufbuild/buf/releases/download/$(BUF_VERSION)/$(BUF_TARGET)" @@ -154,9 +170,10 @@ $(BUF): $(TOOLS_BIN_DIR) $(BUF_SHARE) cp $(TOOLS_SHARE_DIR)/buf/bin/* $(TOOLS_BIN_DIR) rm -rf $(TOOLS_SHARE_DIR)/buf +##@ Utility .PHONY: help -help: ## Display this help. Thanks to https://suva.sh/posts/well-documented-makefiles/ +help: ## Display this help. Thanks to https://www.thapaliya.com/en/writings/well-documented-makefiles/ ifeq ($(OS),Windows_NT) @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \n"} /^[a-zA-Z_-]+:.*?##/ { printf " %-40s %s\n", $$1, $$2 } /^##@/ { printf "\n%s\n", substr($$0, 5) } ' $(MAKEFILE_LIST) else diff --git a/go.mod b/go.mod index 551728c2..e96148c0 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.17 replace github.com/weaveworks/flintlock/api => ./api require ( + github.com/Microsoft/go-winio v0.5.0 // indirect // github.com/weaveworks/flintlock/api TO_ADD github.com/containerd/containerd v1.5.7 github.com/containerd/typeurl v1.0.2 @@ -13,11 +14,13 @@ require ( github.com/go-playground/validator/v10 v10.9.0 github.com/golang/mock v1.6.0 github.com/google/go-cmp v0.5.6 + github.com/google/uuid v1.3.0 // indirect github.com/google/wire v0.5.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 - github.com/gruntwork-io/terratest v0.38.2 + github.com/klauspost/compress v1.13.0 // indirect github.com/oklog/ulid v1.3.1 + github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.16.0 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.0.1 @@ -30,24 +33,19 @@ require ( github.com/stretchr/testify v1.7.0 github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 github.com/weaveworks/flintlock/api v0.0.0-00010101000000-000000000000 + golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect google.golang.org/grpc v1.41.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b ) require ( - cloud.google.com/go v0.93.3 // indirect - github.com/Microsoft/go-winio v0.5.0 // indirect github.com/Microsoft/hcsshim v0.8.21 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/agext/levenshtein v1.2.3 // indirect - github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect - github.com/aws/aws-sdk-go v1.40.56 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.2.0 // indirect - github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/containerd/cgroups v1.0.1 // indirect github.com/containerd/continuity v0.1.0 // indirect @@ -55,13 +53,9 @@ require ( github.com/containerd/ttrpc v1.0.2 // indirect github.com/containernetworking/cni v0.8.1 // indirect github.com/containernetworking/plugins v0.9.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect - github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0 // indirect - github.com/go-logr/logr v0.2.0 // indirect github.com/go-openapi/analysis v0.19.10 // indirect github.com/go-openapi/errors v0.19.7 // indirect github.com/go-openapi/jsonpointer v0.19.3 // indirect @@ -73,7 +67,6 @@ require ( github.com/go-openapi/validate v0.19.11 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-sql-driver/mysql v1.4.1 // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/gofrs/uuid v3.3.0+incompatible // indirect github.com/gogo/googleapis v1.4.0 // indirect @@ -81,72 +74,39 @@ require ( github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.3 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/gnostic v0.4.1 // indirect - github.com/gruntwork-io/go-commons v0.8.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-multierror v1.1.0 // indirect - github.com/hashicorp/go-version v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/hcl/v2 v2.9.1 // indirect - github.com/hashicorp/terraform-json v0.12.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/json-iterator/go v1.1.11 // indirect - github.com/klauspost/compress v1.13.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/magiconair/properties v1.8.5 // indirect github.com/mailru/easyjson v0.7.1 // indirect - github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.4.2 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/sys/mountinfo v0.4.1 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/nxadm/tail v1.4.8 // indirect github.com/opencontainers/runc v1.0.2 // indirect github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect github.com/opencontainers/selinux v1.8.2 // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/pquerna/otp v1.2.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.26.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect - github.com/tmccombs/hcl2json v0.3.3 // indirect - github.com/urfave/cli v1.22.2 // indirect github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae // indirect - github.com/zclconf/go-cty v1.8.1 // indirect go.mongodb.org/mongo-driver v1.3.4 // indirect go.opencensus.io v0.23.0 // indirect golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect - golang.org/x/net v0.0.0-20210614182718-04defd469f4e // 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-20210823070655-63515b42dcdf // indirect - golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect golang.org/x/text v0.3.6 // indirect - golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect - google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20211021150943-2b146023228c // indirect - gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.63.2 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/api v0.20.6 // indirect - k8s.io/apimachinery v0.20.6 // indirect - k8s.io/client-go v0.20.6 // indirect - k8s.io/klog/v2 v2.4.0 // indirect - k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.0.3 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/go.sum b/go.sum index 2c1602f4..cf18ac46 100644 --- a/go.sum +++ b/go.sum @@ -23,7 +23,6 @@ cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAV 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.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3 h1:wPBktZFzYBcCZVARvwVKqH1uEj+aLXofJEtrb4oOsio= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= 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= @@ -46,26 +45,16 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v50.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= 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 v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= 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.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/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -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/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -98,9 +87,6 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt 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/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= -github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -110,11 +96,6 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= -github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0= -github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= -github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= -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= @@ -125,10 +106,7 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.40.56 h1:FM2yjR0UUYFzDTMx+mH9Vyw1k1EUUxsAFzk+BjkzANA= -github.com/aws/aws-sdk-go v1.40.56/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= 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= @@ -142,8 +120,6 @@ github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqO github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= -github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -204,7 +180,6 @@ github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7 h1:rQyoYtj4KddB3bxG6SAqd4+08gePNyJjRqvOIfV3rkM= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -237,7 +212,6 @@ github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJ github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.7.0/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= @@ -281,7 +255,6 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV 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/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -297,16 +270,10 @@ github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8l 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/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/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 v20.10.7+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-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -316,15 +283,10 @@ github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD 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-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s= -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/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1 h1:yY9rWGoXv1U5pl4gxqlULARMQD7x0QG85lqEXTWysik= -github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -353,9 +315,6 @@ github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2H github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0 h1:skJKxRtNmevLqnayafdLe2AsenqRupVmzZSqrvb5caU= -github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -367,7 +326,6 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 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= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 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= @@ -444,14 +402,9 @@ github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/j github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A= github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= 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-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -512,7 +465,6 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 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.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -549,9 +501,7 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-containerregistry v0.6.0/go.mod h1:euCCtNbZ6tKqi1E72vwDj2xZcN5ttKpZLfa/wSo5iLw= 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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -584,12 +534,10 @@ github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= 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/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -604,10 +552,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 h1:rgxjzoDmDXw5q8HONgyHhBas4to0/XWRo/gPpJhsUNQ= github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0/go.mod h1:qrJPVzv9YlhsrxJc3P/Q85nr0w1lIRikTl4JlhdDH5w= -github.com/gruntwork-io/go-commons v0.8.0 h1:k/yypwrPqSeYHevLlEDmvmgQzcyTwrlZGRaxEM6G0ro= -github.com/gruntwork-io/go-commons v0.8.0/go.mod h1:gtp0yTtIBExIZp7vyIV9I0XQkVwiQZze678hvDXof78= -github.com/gruntwork-io/terratest v0.38.2 h1:XgDGMxX+dE8Aw96wI8QH6oIzveej01Yk4bTjt6dtzIU= -github.com/gruntwork-io/terratest v0.38.2/go.mod h1:XzW8PL9pAGbLyiBdQ5OiAeWSNpZ/9ycItjYstSS2PV8= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -629,15 +573,11 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX 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-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= -github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl/v2 v2.9.1 h1:eOy4gREY0/ZQHNItlfuEZqtcQbXIxzojlP301hDpnac= -github.com/hashicorp/hcl/v2 v2.9.1/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/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= @@ -645,8 +585,6 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/terraform-json v0.12.0 h1:8czPgEEWWPROStjkWPUnTQDXmpmZPlkQAwYYLETaTvw= -github.com/hashicorp/terraform-json v0.12.0/go.mod h1:pmbq9o4EuL43db5+0ogX10Yofv1nozM+wskr/bGFJpI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -654,26 +592,18 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= 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.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -689,7 +619,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.0 h1:2T7tUoQrQT+fQWdaY5rjWztFGAFwbGD04iPJg90ZiOs= github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -707,9 +636,6 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -736,27 +662,18 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 h1:ofNAzWCcyTALn2Zv40+8XitdzCgXY6e9qvXwN9W0YXg= -github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -766,7 +683,6 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= github.com/mitchellh/mapstructure v1.4.2/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.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= @@ -775,13 +691,10 @@ github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= 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= @@ -803,8 +716,9 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -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/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -841,7 +755,6 @@ github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqi github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2 h1:c4ca10UMgRcvZ6h0K4HtS15UaVSBEaE+iln2LVpAuGc= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/oracle/oci-go-sdk v7.1.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -863,8 +776,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= -github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= 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.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -902,7 +813,6 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 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.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -910,14 +820,11 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -957,7 +864,6 @@ github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/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= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -988,13 +894,10 @@ github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmccombs/hcl2json v0.3.3 h1:+DLNYqpWE0CsOQiEZu+OZm5ZBImake3wtITYxQ8uLFQ= -github.com/tmccombs/hcl2json v0.3.3/go.mod h1:Y2chtz2x9bAeRTvSibVRVgbLJhLJXKlUeIvjeVdnm4w= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= 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 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= @@ -1005,9 +908,6 @@ github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmF github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/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/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= @@ -1025,12 +925,6 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 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.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= -github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty v1.8.1 h1:SI0LqNeNxAgv2WWqWJMlG2/Ad/6aYJ7IVYYMigmfkuI= -github.com/zclconf/go-cty v1.8.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -1067,7 +961,6 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/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-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1081,7 +974,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh 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= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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= @@ -1121,7 +1013,6 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/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= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1176,7 +1067,6 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1194,7 +1084,6 @@ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ 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= @@ -1225,7 +1114,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1309,7 +1197,6 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1324,7 +1211,6 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb 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-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1360,7 +1246,6 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/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-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= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1435,7 +1320,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1555,7 +1439,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -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.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c= @@ -1596,18 +1479,15 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6 h1:bgdZrW++LqgrLikWYNruIKAtltXbSCX2l5mJu11hrVE= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6 h1:R5p3SlhaABYShQSO6LpPsYHjV05Q+79eBUR0Ut/f4tk= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6 h1:nJZOfolnsVtDtbGJNCxzOtKUAu7zvXjB8+pMo9UNxZo= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= @@ -1618,11 +1498,9 @@ k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -1630,8 +1508,6 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3 h1:4oyYo8NREp49LBBhKxEqCulFjg26rawYKrnCmg+Sr6c= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= 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= diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index dca8ebf4..737f4846 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -4,106 +4,165 @@ package e2e_test import ( + "context" "fmt" - "io/ioutil" + "log" "os" - "path/filepath" + "strconv" + "syscall" "testing" - "time" . "github.com/onsi/gomega" - - "github.com/gruntwork-io/terratest/modules/environment" - "github.com/gruntwork-io/terratest/modules/retry" - "github.com/gruntwork-io/terratest/modules/ssh" - "github.com/gruntwork-io/terratest/modules/terraform" - test_structure "github.com/gruntwork-io/terratest/modules/test-structure" + "github.com/weaveworks/flintlock/api/services/microvm/v1alpha1" + "github.com/weaveworks/flintlock/api/types" + "github.com/weaveworks/flintlock/core/models" + ctr "github.com/weaveworks/flintlock/infrastructure/containerd" + "github.com/weaveworks/flintlock/test/e2e/utils" ) -func TestBasicScenario(t *testing.T) { +func TestE2E(t *testing.T) { RegisterTestingT(t) - terraDir := "./infra" - - defer test_structure.RunTestStage(t, "teardown", func() { - terraformOptions := test_structure.LoadTerraformOptions(t, terraDir) - terraform.Destroy(t, terraformOptions) - test_structure.CleanupTestDataFolder(t, terraDir) - }) - - test_structure.RunTestStage(t, "setup", func() { - terraformOptions := configureTerraformOptionsAndSave(t, terraDir) - - // This will run `terraform init` and `terraform apply` and fail the test if there are any errors - terraform.InitAndApply(t, terraformOptions) - }) - - test_structure.RunTestStage(t, "validate", func() { - terraformOptions := test_structure.LoadTerraformOptions(t, terraDir) - keyPair := test_structure.LoadSshKeyPair(t, terraDir) - - testSSHToHost(t, terraformOptions, keyPair) - }) -} - -func testSSHToHost(t *testing.T, terraformOptions *terraform.Options, keyPair *ssh.KeyPair) { - publicIPAddress := terraform.Output(t, terraformOptions, "public_ip") - Expect(publicIPAddress).NotTo(BeEmpty()) - - publicHost := ssh.Host{ - Hostname: publicIPAddress, - SshKeyPair: keyPair, - SshUserName: "root", + var ( + mvmID = "mvm0" + mvmNS = "ns0" + fcPath = "/var/lib/flintlock/vm/%s/%s" + ) + + // TODO rename + r := utils.Runner{} + defer func() { + log.Println("TEST STEP: cleaning up running processes") + r.Teardown() + }() + log.Println("TEST STEP: performing setup, starting flintlockd server") + flintlockClient := r.Setup() + + log.Println("TEST STEP: creating MicroVM") + createReq := v1alpha1.CreateMicroVMRequest{ + Microvm: defaultTestMicroVM(mvmID, mvmNS), } - - maxRetries := 30 - timeBetweenRetries := 5 * time.Second - description := fmt.Sprintf("SSH to host %s", publicIPAddress) - command := "cat /tmp/metadata" - - retry.DoWithRetry(t, description, maxRetries, timeBetweenRetries, func() (string, error) { - actualText, err := ssh.CheckSshCommandE(t, publicHost, command) - if err != nil { - return "", err - } - - Expect(actualText).ToNot(BeEmpty()) - return "", nil + created, err := flintlockClient.CreateMicroVM(context.Background(), &createReq) + Expect(err).NotTo(HaveOccurred()) + Expect(created.Microvm.Id).To(Equal(mvmID)) + + // So all of this is a placeholder, just to verify that we are creating _something_. + // Once Get has been implemented, all/most of this can be replaced with 'Eventually' calls + // to check that the state of the mVM is running (which presumably will be somewhere + // in our recorded instance state returned by that call). + log.Println("TEST STEP: getting (and verifying) existing MicroVM") + repo, err := ctr.NewMicroVMRepo(&ctr.Config{ + SocketPath: utils.ContainerdSocket, + Namespace: "flintlock", }) + Expect(err).NotTo(HaveOccurred()) + + var fcPid int + Eventually(func(g Gomega) error { + // verify that the socket exists + g.Expect(fmt.Sprintf(fcPath, mvmNS, mvmID) + "/firecracker.sock").To(BeAnExistingFile()) + + // verify that firecracker has started and that a pid has been saved + contents, err := os.ReadFile(fmt.Sprintf(fcPath, mvmNS, mvmID) + "/firecracker.pid") + g.Expect(err).NotTo(HaveOccurred()) + str := string(contents) + g.Expect(str).ToNot(BeEmpty()) + + // verify that there is actually a running process + // the main check here is actually in delete to ensure we have killed the process + fcPid, err = strconv.Atoi(str) + g.Expect(err).NotTo(HaveOccurred()) + p, err := os.FindProcess(fcPid) + g.Expect(err).NotTo(HaveOccurred()) + Expect(p.Signal(syscall.SIGCONT)).To(Succeed()) + + // check state according to containerd + // I would have liked to call the socket to verify the state of the instance from itself, but + // unfortunately when I try to do that here it casues both things writing to that socket + // to fail with "broken pipe". + // I want to ensure the mVM is _actually_ running before we call delete because + // otherwise if the delete call runs too early (before Save) then it is lost + // as we don't have requeueing done yet. + // So it was either this or a Sleep :D + model, err := repo.Get(context.Background(), mvmID, mvmNS) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(string(model.Status.State)).To(Equal(models.CreatedState)) + return nil + }, "120s").Should(Succeed()) + + log.Println("TEST STEP: deleting existing MicroVM") + deleteReq := v1alpha1.DeleteMicroVMRequest{ + Id: mvmID, + Namespace: mvmNS, + } + _, err = flintlockClient.DeleteMicroVM(context.Background(), &deleteReq) + Expect(err).NotTo(HaveOccurred()) + + Eventually(func(g Gomega) error { + // verify that the vm state dir has been removed + g.Expect(fmt.Sprintf(fcPath, mvmNS, mvmID)).ToNot(BeAnExistingFile()) + + // verify that the firecracker process is no longer running + p, err := os.FindProcess(fcPid) + g.Expect(err).ToNot(HaveOccurred()) + g.Expect(p.Signal(syscall.SIGCONT)).ToNot(Succeed()) + + // verify that the lease has been removed from containerd content store + _, err = repo.Get(context.Background(), mvmID, mvmNS) + g.Expect(err).To(MatchError(fmt.Sprintf("microvm spec %s/%s not found", mvmNS, mvmID))) + return nil + }, "120s").Should(Succeed()) } -func configureTerraformOptionsAndSave(t *testing.T, dir string) *terraform.Options { - // NOTE: ioutil has been used in places to write the file so that the contents aren't output to the logs - // Generate and save the options the kaypair - keyPair := ssh.GenerateRSAKeyPair(t, 4096) - test_structure.SaveSshKeyPair(t, dir, keyPair) - publicKeyPath := test_structure.FormatTestDataPath(dir, "id_rsa.pub") - ioutil.WriteFile(publicKeyPath, []byte(keyPair.PublicKey), os.ModePerm) - privateKeyPath := test_structure.FormatTestDataPath(dir, "id_rsa") - ioutil.WriteFile(privateKeyPath, []byte(keyPair.PrivateKey), os.ModePerm) - - // Save the API key - apiToken := environment.GetFirstNonEmptyEnvVarOrFatal(t, []string{"METAL_AUTH_TOKEN"}) - apiTokenPath := test_structure.FormatTestDataPath(dir, "api_token") - ioutil.WriteFile(apiTokenPath, []byte(apiToken), os.ModePerm) - - // Get absolute paths - apiTokenPathAbs, _ := filepath.Abs(apiTokenPath) - privateKeyPathAbs, _ := filepath.Abs(privateKeyPath) - publicKeyPathAbs, _ := filepath.Abs(publicKeyPath) - - // Create and save the options - terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{ - TerraformDir: dir, - Vars: map[string]interface{}{ - "ssh_user": "root", - "auth_token_path": apiTokenPathAbs, - "public_key_path": publicKeyPathAbs, - "private_key_path": privateKeyPathAbs, +func defaultTestMicroVM(name, namespace string) *types.MicroVMSpec { + var ( + kernelImage = "docker.io/richardcase/ubuntu-bionic-kernel:0.0.11" + cloudImage = "docker.io/richardcase/ubuntu-bionic-test:cloudimage_v0.0.1" + ) + + return &types.MicroVMSpec{ + Id: name, + Namespace: namespace, + Vcpu: 2, + MemoryInMb: 2048, + Kernel: &types.Kernel{ + Image: kernelImage, + Cmdline: "console=ttyS0 reboot=k panic=1 pci=off i8042.noaux i8042.nomux i8042.nopnp i8042.dumbkbd ds=nocloud-net;s=http://169.254.169.254/latest/", + Filename: pointyString("vmlinux"), + AddNetworkConfig: true, }, - NoColor: true, - }) - test_structure.SaveTerraformOptions(t, dir, terraformOptions) + Initrd: &types.Initrd{ + Image: kernelImage, + Filename: pointyString("initrd-generic"), + }, + Volumes: []*types.Volume{{ + Id: "root", + IsRoot: false, + IsReadOnly: true, + MountPoint: "/", + Source: &types.VolumeSource{ + ContainerSource: pointyString(cloudImage), + }}, + }, + Interfaces: []*types.NetworkInterface{{ + GuestDeviceName: "eth0", + Type: 1, + AllowMetadataReq: true, + GuestMac: pointyString("AA:FF:00:00:00:01"), + Address: pointyString("169.254.0.1/16"), + }, + { + GuestDeviceName: "eth1", + Type: 0, + AllowMetadataReq: false, + }}, + Metadata: map[string]string{ + "meta-data": "aW5zdGFuY2VfaWQ6IG5zMS9tdm0wCmxvY2FsX2hvc3RuYW1lOiBtdm0wCnBsYXRmb3JtOiBsaXF1aWRfbWV0YWwK", + "user-data": "I2Nsb3VkLWNvbmZpZwpob3N0bmFtZTogbXZtMApmcWRuOiBtdm0wLmZydWl0Y2FzZQp1c2VyczoKICAgIC0gbmFtZTogcm9vdAogICAgICBzc2hfYXV0aG9yaXplZF9rZXlzOgogICAgICAgIC0gfAogICAgICAgICAgc3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUdzbStWSSsyVk5WWFBDRmVmbFhrQTVKY21zMzByajFGUFFjcFNTdDFrdVYgcmljaGFyZEB3ZWF2ZS53b3JrcwpkaXNhYmxlX3Jvb3Q6IGZhbHNlCnBhY2thZ2VfdXBkYXRlOiBmYWxzZQpmaW5hbF9tZXNzYWdlOiBUaGUgcmVpZ25pdGVkIGJvb3RlZCBzeXN0ZW0gaXMgZ29vZCB0byBnbyBhZnRlciAkVVBUSU1FIHNlY29uZHMKcnVuY21kOgogICAgLSBkaGNsaWVudCAtcgogICAgLSBkaGNsaWVudAo=", + }, + } +} - return terraformOptions +func pointyString(v string) *string { + return &v } diff --git a/test/e2e/utils/runner.go b/test/e2e/utils/runner.go new file mode 100644 index 00000000..3af1dc6b --- /dev/null +++ b/test/e2e/utils/runner.go @@ -0,0 +1,126 @@ +//go:build e2e +// +build e2e + +package utils + +import ( + "bufio" + "errors" + "os/exec" + "strings" + + gk "github.com/onsi/ginkgo" + gm "github.com/onsi/gomega" + "github.com/onsi/gomega/gexec" + "github.com/weaveworks/flintlock/api/services/microvm/v1alpha1" + "google.golang.org/grpc" +) + +const ( + containerdBin = "containerd" + flintlockCmdDir = "github.com/weaveworks/flintlock/cmd/flintlockd" + ContainerdSocket = "/run/containerd-dev/containerd.sock" + containerdCfg = "/etc/containerd/config-dev.toml" + grpcDialTarget = "127.0.0.1:9090" +) + +// Runner is a very poorly named thing and honestly idk what to call it. +// What it does is compile flintlockd and start containerd and flintlockd. +// So 'TestSetterUpper' did not sound as slick, but that is what it is. +// I am happy for literally any suggestions. +type Runner struct { + flintlockdBin string + containerdSession *gexec.Session + flintlockdSession *gexec.Session + flintlockdConn *grpc.ClientConn +} + +// Setup is a helper for the e2e tests which: +// - compiles flintlockd +// - starts containerd +// - starts flintlockd +// - opens a connection to the grpc server +// - returns a new MicroVMClient which can then be used in testing +// All opened connections and started processes are saved for later shutdown. +// Teardown should be called before Setup in a defer. +func (r *Runner) Setup() v1alpha1.MicroVMClient { + r.buildFLBinary() + r.startContainerd() + r.startFlintlockd() + r.dialGRPCServer() + + return v1alpha1.NewMicroVMClient(r.flintlockdConn) +} + +// Teardown will gracefully close and kill all connections and processes which were +// opened as part of Setup. +// It should be called before Setup as part of a defer: +// +// r := utils.Runner{} +// defer r.Teardown() +// r.Setup() +// . +func (r *Runner) Teardown() { + if r.flintlockdConn != nil { + r.flintlockdConn.Close() + } + + if r.flintlockdSession != nil { + r.flintlockdSession.Terminate().Wait() + } + + if r.containerdSession != nil { + r.containerdSession.Terminate().Wait() + } + + gexec.CleanupBuildArtifacts() +} + +func (r *Runner) buildFLBinary() { + flBin, err := gexec.Build(flintlockCmdDir) + gm.Expect(err).NotTo(gm.HaveOccurred()) + r.flintlockdBin = flBin +} + +func (r *Runner) startContainerd() { + ctrdCmd := exec.Command(containerdBin, "--config", containerdCfg) + ctrdSess, err := gexec.Start(ctrdCmd, gk.GinkgoWriter, gk.GinkgoWriter) + gm.Expect(err).NotTo(gm.HaveOccurred()) + r.containerdSession = ctrdSess +} + +func (r *Runner) startFlintlockd() { + parentIface, err := getParentInterface() + gm.Expect(err).NotTo(gm.HaveOccurred()) + flCmd := exec.Command(r.flintlockdBin, "run", "--containerd-socket", ContainerdSocket, "--parent-iface", parentIface) //nolint:gosec + flSess, err := gexec.Start(flCmd, gk.GinkgoWriter, gk.GinkgoWriter) + gm.Expect(err).NotTo(gm.HaveOccurred()) + r.flintlockdSession = flSess +} + +func (r *Runner) dialGRPCServer() { + conn, err := grpc.Dial(grpcDialTarget, grpc.WithInsecure(), grpc.WithBlock()) + gm.Expect(err).NotTo(gm.HaveOccurred()) + r.flintlockdConn = conn +} + +func getParentInterface() (string, error) { + // If there is a go package which lets me do this without shelling out lmk. + // I could not find one after a quick search. + cmd := exec.Command("ip", "route", "show") + output, err := cmd.Output() + if err != nil { + return "", err + } + scanner := bufio.NewScanner(strings.NewReader(string(output))) + for scanner.Scan() { + line := scanner.Text() + if strings.Contains(line, "default") { + parts := strings.Split(line, " ") + + return parts[4], nil + } + } + + return "", errors.New("parent interface not found") //nolint:goerr113 +} From 450de9b65bca264dbb997529d6200c439db4dfb7 Mon Sep 17 00:00:00 2001 From: Claudia Beresford Date: Fri, 29 Oct 2021 15:36:00 +0100 Subject: [PATCH 3/5] Remove terraform stuff from e2e tests --- .github/workflows/nightly_e2e.yml | 8 +-- test/e2e/infra/.gitignore | 7 --- test/e2e/infra/files/get-meta.sh | 3 -- test/e2e/infra/main.tf | 89 ------------------------------- test/e2e/infra/metal.py | 0 test/e2e/infra/output.tf | 19 ------- 6 files changed, 4 insertions(+), 122 deletions(-) delete mode 100644 test/e2e/infra/.gitignore delete mode 100644 test/e2e/infra/files/get-meta.sh delete mode 100644 test/e2e/infra/main.tf create mode 100644 test/e2e/infra/metal.py delete mode 100644 test/e2e/infra/output.tf diff --git a/.github/workflows/nightly_e2e.yml b/.github/workflows/nightly_e2e.yml index 919bbf8d..3c90aad2 100644 --- a/.github/workflows/nightly_e2e.yml +++ b/.github/workflows/nightly_e2e.yml @@ -1,6 +1,7 @@ name: nightly_e2e on: + workflow_dispatch: {} schedule: - cron: 0 0 * * * @@ -13,10 +14,9 @@ jobs: - uses: actions/setup-go@v2 with: go-version: '^1.17.2' - - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: 1.0.9 - terraform_wrapper: false + # TODO + # have a custom action for the setup so that we can get outputs for the cleanup projects + # rather than hardcoding - name: Run tests run: make test-e2e env: diff --git a/test/e2e/infra/.gitignore b/test/e2e/infra/.gitignore deleted file mode 100644 index 0230a634..00000000 --- a/test/e2e/infra/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.terraform.lock.hcl -terraform.tfstate.d/ -terraform.tfstate -terraform.tfstate.backup -.terraform/ -.ssh/ -.test-data/ \ No newline at end of file diff --git a/test/e2e/infra/files/get-meta.sh b/test/e2e/infra/files/get-meta.sh deleted file mode 100644 index 100bcaac..00000000 --- a/test/e2e/infra/files/get-meta.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -wget -q -O- https://metadata.platformequinix.com/metadata \ No newline at end of file diff --git a/test/e2e/infra/main.tf b/test/e2e/infra/main.tf deleted file mode 100644 index 04541dfd..00000000 --- a/test/e2e/infra/main.tf +++ /dev/null @@ -1,89 +0,0 @@ -terraform { - required_providers { - metal = { - source = "equinix/metal" - # version = "1.0.0" - } - } -} - -variable "auth_token_path" { - description = "The path to the file containing the auth token" - type = string -} - -variable "ssh_port" { - description = "The port the EC2 Instance should listen on for SSH requests." - type = number - default = 22 -} - -variable "ssh_user" { - description = "SSH user name to use for remote exec connections," - type = string - default = "root" -} - -variable "public_key_path" { - description = "the path to the public key to use for SSH" - type = string -} - -variable "private_key_path" { - description = "the path to the private key to use for SSH" - type = string -} - -provider "metal" { - auth_token = file(var.auth_token_path) -} - -resource "metal_project" "quicksilver_e2e" { - name = "quicksilver_e2e_1" -} - -resource "metal_project_ssh_key" "test" { - name = "e2e" - public_key = file(var.public_key_path) - project_id = metal_project.quicksilver_e2e.id -} - -resource "metal_device" "web1" { - hostname = "web1" - plan = "c1.small.x86" - facilities = ["ewr1"] - operating_system = "ubuntu_16_04" - billing_cycle = "hourly" - project_id = metal_project.quicksilver_e2e.id -} - -resource "null_resource" "example_provisioner" { - triggers = { - "public_ip" = "metal_device.web1.network.0.address" - } - - connection { - type = "ssh" - host = metal_device.web1.network.0.address - user = var.ssh_user - port = var.ssh_port - private_key = file(var.private_key_path) - } - - provisioner "file" { - source = "files/get-meta.sh" - destination = "/tmp/get-meta.sh" - } - - provisioner "remote-exec" { - inline = [ - "chmod +x /tmp/get-meta.sh", - "/tmp/get-meta.sh > /tmp/metadata", - ] - } - - # provisioner "local-exec" { - # # copy the metadata file back to CWD, which will be tested - # command = "scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${var.ssh_user}@${metal_device.web1.network.0}:/tmp/metadata metadata" - # } -} diff --git a/test/e2e/infra/metal.py b/test/e2e/infra/metal.py new file mode 100644 index 00000000..e69de29b diff --git a/test/e2e/infra/output.tf b/test/e2e/infra/output.tf deleted file mode 100644 index 0abf78fc..00000000 --- a/test/e2e/infra/output.tf +++ /dev/null @@ -1,19 +0,0 @@ -output "public_ip" { - value = "${metal_device.web1.network.0.address}" -} - -output "static_terraform_output" { - description = < Date: Mon, 1 Nov 2021 11:07:55 +0000 Subject: [PATCH 4/5] Add Get and List to e2es --- test/e2e/e2e_test.go | 175 +++++++++++++++++++++++++-------------- test/e2e/utils/runner.go | 4 +- 2 files changed, 116 insertions(+), 63 deletions(-) diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 737f4846..0f66b0ee 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -15,8 +15,6 @@ import ( . "github.com/onsi/gomega" "github.com/weaveworks/flintlock/api/services/microvm/v1alpha1" "github.com/weaveworks/flintlock/api/types" - "github.com/weaveworks/flintlock/core/models" - ctr "github.com/weaveworks/flintlock/infrastructure/containerd" "github.com/weaveworks/flintlock/test/e2e/utils" ) @@ -24,12 +22,15 @@ func TestE2E(t *testing.T) { RegisterTestingT(t) var ( - mvmID = "mvm0" - mvmNS = "ns0" - fcPath = "/var/lib/flintlock/vm/%s/%s" + mvmID = "mvm0" + secondMvmID = "mvm1" + mvmNS = "ns0" + fcPath = "/var/lib/flintlock/vm/%s/%s" + + mvmPid1 int + mvmPid2 int ) - // TODO rename r := utils.Runner{} defer func() { log.Println("TEST STEP: cleaning up running processes") @@ -39,81 +40,133 @@ func TestE2E(t *testing.T) { flintlockClient := r.Setup() log.Println("TEST STEP: creating MicroVM") - createReq := v1alpha1.CreateMicroVMRequest{ - Microvm: defaultTestMicroVM(mvmID, mvmNS), - } - created, err := flintlockClient.CreateMicroVM(context.Background(), &createReq) - Expect(err).NotTo(HaveOccurred()) + created := createMVM(flintlockClient, mvmID, mvmNS) Expect(created.Microvm.Id).To(Equal(mvmID)) - // So all of this is a placeholder, just to verify that we are creating _something_. - // Once Get has been implemented, all/most of this can be replaced with 'Eventually' calls - // to check that the state of the mVM is running (which presumably will be somewhere - // in our recorded instance state returned by that call). log.Println("TEST STEP: getting (and verifying) existing MicroVM") - repo, err := ctr.NewMicroVMRepo(&ctr.Config{ - SocketPath: utils.ContainerdSocket, - Namespace: "flintlock", - }) - Expect(err).NotTo(HaveOccurred()) - - var fcPid int Eventually(func(g Gomega) error { // verify that the socket exists g.Expect(fmt.Sprintf(fcPath, mvmNS, mvmID) + "/firecracker.sock").To(BeAnExistingFile()) // verify that firecracker has started and that a pid has been saved - contents, err := os.ReadFile(fmt.Sprintf(fcPath, mvmNS, mvmID) + "/firecracker.pid") - g.Expect(err).NotTo(HaveOccurred()) - str := string(contents) - g.Expect(str).ToNot(BeEmpty()) - - // verify that there is actually a running process - // the main check here is actually in delete to ensure we have killed the process - fcPid, err = strconv.Atoi(str) - g.Expect(err).NotTo(HaveOccurred()) - p, err := os.FindProcess(fcPid) - g.Expect(err).NotTo(HaveOccurred()) - Expect(p.Signal(syscall.SIGCONT)).To(Succeed()) - - // check state according to containerd - // I would have liked to call the socket to verify the state of the instance from itself, but - // unfortunately when I try to do that here it casues both things writing to that socket - // to fail with "broken pipe". - // I want to ensure the mVM is _actually_ running before we call delete because - // otherwise if the delete call runs too early (before Save) then it is lost - // as we don't have requeueing done yet. - // So it was either this or a Sleep :D - model, err := repo.Get(context.Background(), mvmID, mvmNS) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(string(model.Status.State)).To(Equal(models.CreatedState)) + // and that there is actually a running process + mvmPid1 = readPID(fmt.Sprintf(fcPath, mvmNS, mvmID)) + g.Expect(pidRunning(mvmPid1)).To(BeTrue()) + + // get the mVM and check the status + res := getMVM(flintlockClient, mvmID, mvmNS) + g.Expect(res.Microvm.Spec.Id).To(Equal(mvmID)) + g.Expect(res.Microvm.Status.State).To(Equal(types.MicroVMStatus_CREATED)) return nil }, "120s").Should(Succeed()) - log.Println("TEST STEP: deleting existing MicroVM") - deleteReq := v1alpha1.DeleteMicroVMRequest{ - Id: mvmID, - Namespace: mvmNS, - } - _, err = flintlockClient.DeleteMicroVM(context.Background(), &deleteReq) - Expect(err).NotTo(HaveOccurred()) + log.Println("TEST STEP: creating a second MicroVM") + created = createMVM(flintlockClient, secondMvmID, mvmNS) + Expect(created.Microvm.Id).To(Equal(secondMvmID)) + + log.Println("TEST STEP: listing all MicroVMs") + Eventually(func(g Gomega) error { + // verify that the new socket exists + g.Expect(fmt.Sprintf(fcPath, mvmNS, secondMvmID) + "/firecracker.sock").To(BeAnExistingFile()) + + // verify that firecracker has started and that a pid has been saved + // and that there is actually a running process for the new mVM + mvmPid2 = readPID(fmt.Sprintf(fcPath, mvmNS, secondMvmID)) + g.Expect(pidRunning(mvmPid2)).To(BeTrue()) + + // get both the mVMs and check the statuses + res := listMVMs(flintlockClient, mvmNS) + g.Expect(res.Microvm).To(HaveLen(2)) + g.Expect(res.Microvm[0].Spec.Id).To(Equal(mvmID)) + g.Expect(res.Microvm[0].Status.State).To(Equal(types.MicroVMStatus_CREATED)) + g.Expect(res.Microvm[1].Spec.Id).To(Equal(secondMvmID)) + g.Expect(res.Microvm[1].Status.State).To(Equal(types.MicroVMStatus_CREATED)) + return nil + }, "120s").Should(Succeed()) + + log.Println("TEST STEP: deleting existing MicroVMs") + Expect(deleteMVM(flintlockClient, mvmID, mvmNS)).To(Succeed()) + Expect(deleteMVM(flintlockClient, secondMvmID, mvmNS)).To(Succeed()) Eventually(func(g Gomega) error { - // verify that the vm state dir has been removed + // verify that the vm state dirs have been removed g.Expect(fmt.Sprintf(fcPath, mvmNS, mvmID)).ToNot(BeAnExistingFile()) + g.Expect(fmt.Sprintf(fcPath, mvmNS, secondMvmID)).ToNot(BeAnExistingFile()) - // verify that the firecracker process is no longer running - p, err := os.FindProcess(fcPid) - g.Expect(err).ToNot(HaveOccurred()) - g.Expect(p.Signal(syscall.SIGCONT)).ToNot(Succeed()) + // verify that the firecracker processes are no longer running + g.Expect(pidRunning(mvmPid1)).To(BeFalse()) + g.Expect(pidRunning(mvmPid2)).To(BeFalse()) - // verify that the lease has been removed from containerd content store - _, err = repo.Get(context.Background(), mvmID, mvmNS) - g.Expect(err).To(MatchError(fmt.Sprintf("microvm spec %s/%s not found", mvmNS, mvmID))) + // verify that the mVMs are no longer with us + res := listMVMs(flintlockClient, mvmNS) + g.Expect(res.Microvm).To(HaveLen(0)) return nil }, "120s").Should(Succeed()) } +func createMVM(client v1alpha1.MicroVMClient, name, ns string) *v1alpha1.CreateMicroVMResponse { + createReq := v1alpha1.CreateMicroVMRequest{ + Microvm: defaultTestMicroVM(name, ns), + } + created, err := client.CreateMicroVM(context.Background(), &createReq) + Expect(err).NotTo(HaveOccurred()) + + return created +} + +func deleteMVM(client v1alpha1.MicroVMClient, name, ns string) error { + deleteReq := v1alpha1.DeleteMicroVMRequest{ + Id: name, + Namespace: ns, + } + _, err := client.DeleteMicroVM(context.Background(), &deleteReq) + + return err +} + +func getMVM(client v1alpha1.MicroVMClient, name, ns string) *v1alpha1.GetMicroVMResponse { + getReq := v1alpha1.GetMicroVMRequest{ + Id: name, + Namespace: ns, + } + res, err := client.GetMicroVM(context.Background(), &getReq) + Expect(err).NotTo(HaveOccurred()) + + return res +} + +func listMVMs(client v1alpha1.MicroVMClient, ns string) *v1alpha1.ListMicroVMsResponse { + listReq := v1alpha1.ListMicroVMsRequest{ + Namespace: ns, + } + resp, err := client.ListMicroVMs(context.Background(), &listReq) + Expect(err).NotTo(HaveOccurred()) + + return resp +} + +func readPID(path string) int { + contents, err := os.ReadFile(path + "/firecracker.pid") + Expect(err).NotTo(HaveOccurred()) + str := string(contents) + Expect(str).ToNot(BeEmpty()) + + pid, err := strconv.Atoi(str) + Expect(err).NotTo(HaveOccurred()) + + return pid +} + +func pidRunning(pid int) bool { + p, err := os.FindProcess(pid) + Expect(err).NotTo(HaveOccurred()) + if err := p.Signal(syscall.SIGCONT); err != nil { + return false + } + + return true +} + func defaultTestMicroVM(name, namespace string) *types.MicroVMSpec { var ( kernelImage = "docker.io/richardcase/ubuntu-bionic-kernel:0.0.11" diff --git a/test/e2e/utils/runner.go b/test/e2e/utils/runner.go index 3af1dc6b..0d2008dd 100644 --- a/test/e2e/utils/runner.go +++ b/test/e2e/utils/runner.go @@ -19,7 +19,7 @@ import ( const ( containerdBin = "containerd" flintlockCmdDir = "github.com/weaveworks/flintlock/cmd/flintlockd" - ContainerdSocket = "/run/containerd-dev/containerd.sock" + containerdSocket = "/run/containerd-dev/containerd.sock" containerdCfg = "/etc/containerd/config-dev.toml" grpcDialTarget = "127.0.0.1:9090" ) @@ -92,7 +92,7 @@ func (r *Runner) startContainerd() { func (r *Runner) startFlintlockd() { parentIface, err := getParentInterface() gm.Expect(err).NotTo(gm.HaveOccurred()) - flCmd := exec.Command(r.flintlockdBin, "run", "--containerd-socket", ContainerdSocket, "--parent-iface", parentIface) //nolint:gosec + flCmd := exec.Command(r.flintlockdBin, "run", "--containerd-socket", containerdSocket, "--parent-iface", parentIface) //nolint:gosec flSess, err := gexec.Start(flCmd, gk.GinkgoWriter, gk.GinkgoWriter) gm.Expect(err).NotTo(gm.HaveOccurred()) r.flintlockdSession = flSess From 0ca4d6180ac64c12042738d38844082cdfbbd8b7 Mon Sep 17 00:00:00 2001 From: Claudia Beresford Date: Mon, 1 Nov 2021 14:36:12 +0000 Subject: [PATCH 5/5] Move test helper funcs into separate pkg --- test/e2e/e2e_test.go | 151 ++++------------------------------------ test/e2e/utils/utils.go | 136 ++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 136 deletions(-) create mode 100644 test/e2e/utils/utils.go diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 0f66b0ee..8a29085e 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -4,18 +4,13 @@ package e2e_test import ( - "context" "fmt" "log" - "os" - "strconv" - "syscall" "testing" . "github.com/onsi/gomega" - "github.com/weaveworks/flintlock/api/services/microvm/v1alpha1" "github.com/weaveworks/flintlock/api/types" - "github.com/weaveworks/flintlock/test/e2e/utils" + u "github.com/weaveworks/flintlock/test/e2e/utils" ) func TestE2E(t *testing.T) { @@ -31,7 +26,7 @@ func TestE2E(t *testing.T) { mvmPid2 int ) - r := utils.Runner{} + r := u.Runner{} defer func() { log.Println("TEST STEP: cleaning up running processes") r.Teardown() @@ -40,7 +35,7 @@ func TestE2E(t *testing.T) { flintlockClient := r.Setup() log.Println("TEST STEP: creating MicroVM") - created := createMVM(flintlockClient, mvmID, mvmNS) + created := u.CreateMVM(flintlockClient, mvmID, mvmNS) Expect(created.Microvm.Id).To(Equal(mvmID)) log.Println("TEST STEP: getting (and verifying) existing MicroVM") @@ -50,18 +45,18 @@ func TestE2E(t *testing.T) { // verify that firecracker has started and that a pid has been saved // and that there is actually a running process - mvmPid1 = readPID(fmt.Sprintf(fcPath, mvmNS, mvmID)) - g.Expect(pidRunning(mvmPid1)).To(BeTrue()) + mvmPid1 = u.ReadPID(fmt.Sprintf(fcPath, mvmNS, mvmID)) + g.Expect(u.PidRunning(mvmPid1)).To(BeTrue()) // get the mVM and check the status - res := getMVM(flintlockClient, mvmID, mvmNS) + res := u.GetMVM(flintlockClient, mvmID, mvmNS) g.Expect(res.Microvm.Spec.Id).To(Equal(mvmID)) g.Expect(res.Microvm.Status.State).To(Equal(types.MicroVMStatus_CREATED)) return nil }, "120s").Should(Succeed()) log.Println("TEST STEP: creating a second MicroVM") - created = createMVM(flintlockClient, secondMvmID, mvmNS) + created = u.CreateMVM(flintlockClient, secondMvmID, mvmNS) Expect(created.Microvm.Id).To(Equal(secondMvmID)) log.Println("TEST STEP: listing all MicroVMs") @@ -71,11 +66,11 @@ func TestE2E(t *testing.T) { // verify that firecracker has started and that a pid has been saved // and that there is actually a running process for the new mVM - mvmPid2 = readPID(fmt.Sprintf(fcPath, mvmNS, secondMvmID)) - g.Expect(pidRunning(mvmPid2)).To(BeTrue()) + mvmPid2 = u.ReadPID(fmt.Sprintf(fcPath, mvmNS, secondMvmID)) + g.Expect(u.PidRunning(mvmPid2)).To(BeTrue()) // get both the mVMs and check the statuses - res := listMVMs(flintlockClient, mvmNS) + res := u.ListMVMs(flintlockClient, mvmNS) g.Expect(res.Microvm).To(HaveLen(2)) g.Expect(res.Microvm[0].Spec.Id).To(Equal(mvmID)) g.Expect(res.Microvm[0].Status.State).To(Equal(types.MicroVMStatus_CREATED)) @@ -85,8 +80,8 @@ func TestE2E(t *testing.T) { }, "120s").Should(Succeed()) log.Println("TEST STEP: deleting existing MicroVMs") - Expect(deleteMVM(flintlockClient, mvmID, mvmNS)).To(Succeed()) - Expect(deleteMVM(flintlockClient, secondMvmID, mvmNS)).To(Succeed()) + Expect(u.DeleteMVM(flintlockClient, mvmID, mvmNS)).To(Succeed()) + Expect(u.DeleteMVM(flintlockClient, secondMvmID, mvmNS)).To(Succeed()) Eventually(func(g Gomega) error { // verify that the vm state dirs have been removed @@ -94,128 +89,12 @@ func TestE2E(t *testing.T) { g.Expect(fmt.Sprintf(fcPath, mvmNS, secondMvmID)).ToNot(BeAnExistingFile()) // verify that the firecracker processes are no longer running - g.Expect(pidRunning(mvmPid1)).To(BeFalse()) - g.Expect(pidRunning(mvmPid2)).To(BeFalse()) + g.Expect(u.PidRunning(mvmPid1)).To(BeFalse()) + g.Expect(u.PidRunning(mvmPid2)).To(BeFalse()) // verify that the mVMs are no longer with us - res := listMVMs(flintlockClient, mvmNS) + res := u.ListMVMs(flintlockClient, mvmNS) g.Expect(res.Microvm).To(HaveLen(0)) return nil }, "120s").Should(Succeed()) } - -func createMVM(client v1alpha1.MicroVMClient, name, ns string) *v1alpha1.CreateMicroVMResponse { - createReq := v1alpha1.CreateMicroVMRequest{ - Microvm: defaultTestMicroVM(name, ns), - } - created, err := client.CreateMicroVM(context.Background(), &createReq) - Expect(err).NotTo(HaveOccurred()) - - return created -} - -func deleteMVM(client v1alpha1.MicroVMClient, name, ns string) error { - deleteReq := v1alpha1.DeleteMicroVMRequest{ - Id: name, - Namespace: ns, - } - _, err := client.DeleteMicroVM(context.Background(), &deleteReq) - - return err -} - -func getMVM(client v1alpha1.MicroVMClient, name, ns string) *v1alpha1.GetMicroVMResponse { - getReq := v1alpha1.GetMicroVMRequest{ - Id: name, - Namespace: ns, - } - res, err := client.GetMicroVM(context.Background(), &getReq) - Expect(err).NotTo(HaveOccurred()) - - return res -} - -func listMVMs(client v1alpha1.MicroVMClient, ns string) *v1alpha1.ListMicroVMsResponse { - listReq := v1alpha1.ListMicroVMsRequest{ - Namespace: ns, - } - resp, err := client.ListMicroVMs(context.Background(), &listReq) - Expect(err).NotTo(HaveOccurred()) - - return resp -} - -func readPID(path string) int { - contents, err := os.ReadFile(path + "/firecracker.pid") - Expect(err).NotTo(HaveOccurred()) - str := string(contents) - Expect(str).ToNot(BeEmpty()) - - pid, err := strconv.Atoi(str) - Expect(err).NotTo(HaveOccurred()) - - return pid -} - -func pidRunning(pid int) bool { - p, err := os.FindProcess(pid) - Expect(err).NotTo(HaveOccurred()) - if err := p.Signal(syscall.SIGCONT); err != nil { - return false - } - - return true -} - -func defaultTestMicroVM(name, namespace string) *types.MicroVMSpec { - var ( - kernelImage = "docker.io/richardcase/ubuntu-bionic-kernel:0.0.11" - cloudImage = "docker.io/richardcase/ubuntu-bionic-test:cloudimage_v0.0.1" - ) - - return &types.MicroVMSpec{ - Id: name, - Namespace: namespace, - Vcpu: 2, - MemoryInMb: 2048, - Kernel: &types.Kernel{ - Image: kernelImage, - Cmdline: "console=ttyS0 reboot=k panic=1 pci=off i8042.noaux i8042.nomux i8042.nopnp i8042.dumbkbd ds=nocloud-net;s=http://169.254.169.254/latest/", - Filename: pointyString("vmlinux"), - AddNetworkConfig: true, - }, - Initrd: &types.Initrd{ - Image: kernelImage, - Filename: pointyString("initrd-generic"), - }, - Volumes: []*types.Volume{{ - Id: "root", - IsRoot: false, - IsReadOnly: true, - MountPoint: "/", - Source: &types.VolumeSource{ - ContainerSource: pointyString(cloudImage), - }}, - }, - Interfaces: []*types.NetworkInterface{{ - GuestDeviceName: "eth0", - Type: 1, - AllowMetadataReq: true, - GuestMac: pointyString("AA:FF:00:00:00:01"), - Address: pointyString("169.254.0.1/16"), - }, - { - GuestDeviceName: "eth1", - Type: 0, - AllowMetadataReq: false, - }}, - Metadata: map[string]string{ - "meta-data": "aW5zdGFuY2VfaWQ6IG5zMS9tdm0wCmxvY2FsX2hvc3RuYW1lOiBtdm0wCnBsYXRmb3JtOiBsaXF1aWRfbWV0YWwK", - "user-data": "I2Nsb3VkLWNvbmZpZwpob3N0bmFtZTogbXZtMApmcWRuOiBtdm0wLmZydWl0Y2FzZQp1c2VyczoKICAgIC0gbmFtZTogcm9vdAogICAgICBzc2hfYXV0aG9yaXplZF9rZXlzOgogICAgICAgIC0gfAogICAgICAgICAgc3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUdzbStWSSsyVk5WWFBDRmVmbFhrQTVKY21zMzByajFGUFFjcFNTdDFrdVYgcmljaGFyZEB3ZWF2ZS53b3JrcwpkaXNhYmxlX3Jvb3Q6IGZhbHNlCnBhY2thZ2VfdXBkYXRlOiBmYWxzZQpmaW5hbF9tZXNzYWdlOiBUaGUgcmVpZ25pdGVkIGJvb3RlZCBzeXN0ZW0gaXMgZ29vZCB0byBnbyBhZnRlciAkVVBUSU1FIHNlY29uZHMKcnVuY21kOgogICAgLSBkaGNsaWVudCAtcgogICAgLSBkaGNsaWVudAo=", - }, - } -} - -func pointyString(v string) *string { - return &v -} diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go new file mode 100644 index 00000000..c5029145 --- /dev/null +++ b/test/e2e/utils/utils.go @@ -0,0 +1,136 @@ +//go:build e2e +// +build e2e + +package utils + +import ( + "context" + "os" + "strconv" + "syscall" + + g "github.com/onsi/gomega" + + "github.com/weaveworks/flintlock/api/services/microvm/v1alpha1" + "github.com/weaveworks/flintlock/api/types" +) + +func CreateMVM(client v1alpha1.MicroVMClient, name, ns string) *v1alpha1.CreateMicroVMResponse { + createReq := v1alpha1.CreateMicroVMRequest{ + Microvm: defaultTestMicroVM(name, ns), + } + created, err := client.CreateMicroVM(context.Background(), &createReq) + g.Expect(err).NotTo(g.HaveOccurred()) + + return created +} + +func DeleteMVM(client v1alpha1.MicroVMClient, name, ns string) error { + deleteReq := v1alpha1.DeleteMicroVMRequest{ + Id: name, + Namespace: ns, + } + _, err := client.DeleteMicroVM(context.Background(), &deleteReq) + + return err +} + +func GetMVM(client v1alpha1.MicroVMClient, name, ns string) *v1alpha1.GetMicroVMResponse { + getReq := v1alpha1.GetMicroVMRequest{ + Id: name, + Namespace: ns, + } + res, err := client.GetMicroVM(context.Background(), &getReq) + g.Expect(err).NotTo(g.HaveOccurred()) + + return res +} + +func ListMVMs(client v1alpha1.MicroVMClient, ns string) *v1alpha1.ListMicroVMsResponse { + listReq := v1alpha1.ListMicroVMsRequest{ + Namespace: ns, + } + resp, err := client.ListMicroVMs(context.Background(), &listReq) + g.Expect(err).NotTo(g.HaveOccurred()) + + return resp +} + +func ReadPID(path string) int { + contents, err := os.ReadFile(path + "/firecracker.pid") + g.Expect(err).NotTo(g.HaveOccurred()) + str := string(contents) + g.Expect(str).ToNot(g.BeEmpty()) + + pid, err := strconv.Atoi(str) + g.Expect(err).NotTo(g.HaveOccurred()) + + return pid +} + +func PidRunning(pid int) bool { + p, err := os.FindProcess(pid) + g.Expect(err).NotTo(g.HaveOccurred()) + if err := p.Signal(syscall.SIGCONT); err != nil { + return false + } + + return true +} + +func defaultTestMicroVM(name, namespace string) *types.MicroVMSpec { + var ( + kernelImage = "docker.io/richardcase/ubuntu-bionic-kernel:0.0.11" + cloudImage = "docker.io/richardcase/ubuntu-bionic-test:cloudimage_v0.0.1" + ) + + return &types.MicroVMSpec{ + Id: name, + Namespace: namespace, + Vcpu: 2, //nolint: gomnd + MemoryInMb: 2048, //nolint: gomnd + Kernel: &types.Kernel{ + Image: kernelImage, + Cmdline: "console=ttyS0 reboot=k panic=1 pci=off i8042.noaux i8042.nomux i8042.nopnp i8042.dumbkbd ds=nocloud-net;s=http://169.254.169.254/latest/", + Filename: pointyString("vmlinux"), + AddNetworkConfig: true, + }, + Initrd: &types.Initrd{ + Image: kernelImage, + Filename: pointyString("initrd-generic"), + }, + Volumes: []*types.Volume{ + { + Id: "root", + IsRoot: false, + IsReadOnly: true, + MountPoint: "/", + Source: &types.VolumeSource{ + ContainerSource: pointyString(cloudImage), + }, + }, + }, + Interfaces: []*types.NetworkInterface{ + { + GuestDeviceName: "eth0", + Type: 1, + AllowMetadataReq: true, + GuestMac: pointyString("AA:FF:00:00:00:01"), + Address: pointyString("169.254.0.1/16"), + }, + { + GuestDeviceName: "eth1", + Type: 0, + AllowMetadataReq: false, + }, + }, + Metadata: map[string]string{ + "meta-data": "aW5zdGFuY2VfaWQ6IG5zMS9tdm0wCmxvY2FsX2hvc3RuYW1lOiBtdm0wCnBsYXRmb3JtOiBsaXF1aWRfbWV0YWwK", + "user-data": "I2Nsb3VkLWNvbmZpZwpob3N0bmFtZTogbXZtMApmcWRuOiBtdm0wLmZydWl0Y2FzZQp1c2VyczoKICAgIC0gbmFtZTogcm9vdAogICAgICBzc2hfYXV0aG9yaXplZF9rZXlzOgogICAgICAgIC0gfAogICAgICAgICAgc3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUdzbStWSSsyVk5WWFBDRmVmbFhrQTVKY21zMzByajFGUFFjcFNTdDFrdVYgcmljaGFyZEB3ZWF2ZS53b3JrcwpkaXNhYmxlX3Jvb3Q6IGZhbHNlCnBhY2thZ2VfdXBkYXRlOiBmYWxzZQpmaW5hbF9tZXNzYWdlOiBUaGUgcmVpZ25pdGVkIGJvb3RlZCBzeXN0ZW0gaXMgZ29vZCB0byBnbyBhZnRlciAkVVBUSU1FIHNlY29uZHMKcnVuY21kOgogICAgLSBkaGNsaWVudCAtcgogICAgLSBkaGNsaWVudAo=", + }, + } +} + +func pointyString(v string) *string { + return &v +}