From 43e664d283b1b934eef8acf43f578000c3307cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=A5=96=E5=BB=BA?= Date: Mon, 6 May 2024 10:30:39 +0800 Subject: [PATCH] bump k8s to v1.27.13 (#3966) Signed-off-by: zhangzujian --- Makefile | 7 +- cmd/daemon/cniserver.go | 2 +- cmd/ovn_ic_controller/ovn_ic_controller.go | 2 +- cmd/speaker/speaker.go | 2 +- cmd/webhook/server.go | 9 +- dist/images/Dockerfile.base | 6 +- go.mod | 210 ++---- go.sum | 459 +++---------- test/e2e/cyclonus.yaml | 24 - test/e2e/framework/daemonset.go | 47 -- test/e2e/framework/docker/container.go | 87 --- test/e2e/framework/docker/exec.go | 71 -- test/e2e/framework/docker/network.go | 141 ---- test/e2e/framework/event.go | 55 -- test/e2e/framework/expect.go | 177 ----- test/e2e/framework/framework.go | 151 ----- test/e2e/framework/image.go | 7 - test/e2e/framework/iproute/iproute.go | 166 ----- test/e2e/framework/kind/kind.go | 176 ----- test/e2e/framework/kube-ovn.go | 23 - test/e2e/framework/kubectl.go | 18 - test/e2e/framework/log.go | 101 --- test/e2e/framework/pod.go | 79 --- test/e2e/framework/provider-network.go | 226 ------- test/e2e/framework/service.go | 131 ---- test/e2e/framework/subnet.go | 258 -------- test/e2e/framework/util.go | 137 ---- test/e2e/framework/vlan.go | 88 --- test/e2e/framework/wait.go | 99 --- test/e2e/k8s-network/e2e_test.go | 36 - test/e2e/kube-ovn/e2e_test.go | 41 -- test/e2e/kube-ovn/ipam/ipam.go | 330 ---------- test/e2e/kube-ovn/kubectl-ko/kubectl-ko.go | 151 ----- test/e2e/kube-ovn/node/node.go | 46 -- test/e2e/kube-ovn/qos/qos.go | 185 ------ test/e2e/kube-ovn/subnet/subnet.go | 525 --------------- test/e2e/kube-ovn/underlay/underlay.go | 729 --------------------- test/e2e/lb-svc/e2e_test.go | 226 ------- test/e2e/ovn-ic/e2e_test.go | 343 ---------- 39 files changed, 166 insertions(+), 5405 deletions(-) delete mode 100644 test/e2e/cyclonus.yaml delete mode 100644 test/e2e/framework/daemonset.go delete mode 100644 test/e2e/framework/docker/container.go delete mode 100644 test/e2e/framework/docker/exec.go delete mode 100644 test/e2e/framework/docker/network.go delete mode 100644 test/e2e/framework/event.go delete mode 100644 test/e2e/framework/expect.go delete mode 100644 test/e2e/framework/framework.go delete mode 100644 test/e2e/framework/image.go delete mode 100644 test/e2e/framework/iproute/iproute.go delete mode 100644 test/e2e/framework/kind/kind.go delete mode 100644 test/e2e/framework/kube-ovn.go delete mode 100644 test/e2e/framework/kubectl.go delete mode 100644 test/e2e/framework/log.go delete mode 100644 test/e2e/framework/pod.go delete mode 100644 test/e2e/framework/provider-network.go delete mode 100644 test/e2e/framework/service.go delete mode 100644 test/e2e/framework/subnet.go delete mode 100644 test/e2e/framework/util.go delete mode 100644 test/e2e/framework/vlan.go delete mode 100644 test/e2e/framework/wait.go delete mode 100644 test/e2e/k8s-network/e2e_test.go delete mode 100644 test/e2e/kube-ovn/e2e_test.go delete mode 100644 test/e2e/kube-ovn/ipam/ipam.go delete mode 100644 test/e2e/kube-ovn/kubectl-ko/kubectl-ko.go delete mode 100644 test/e2e/kube-ovn/node/node.go delete mode 100644 test/e2e/kube-ovn/qos/qos.go delete mode 100644 test/e2e/kube-ovn/subnet/subnet.go delete mode 100644 test/e2e/kube-ovn/underlay/underlay.go delete mode 100644 test/e2e/lb-svc/e2e_test.go delete mode 100644 test/e2e/ovn-ic/e2e_test.go diff --git a/Makefile b/Makefile index f20484945e4..f68b5335200 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,5 @@ SHELL = /bin/bash -include Makefile.e2e - REGISTRY = kubeovn DEV_TAG = dev RELEASE_TAG = $(shell cat VERSION) @@ -584,6 +582,11 @@ ipam-bench: go test -timeout 30m -bench='^BenchmarkIPAM' -benchtime=10000x test/unittest/ipam_bench/ipam_test.go -args -logtostderr=false go test -timeout 90m -bench='^BenchmarkParallelIPAM' -benchtime=10x test/unittest/ipam_bench/ipam_test.go -args -logtostderr=false +.PHONY: kubectl-ko-log +kubectl-ko-log: + kubectl ko log all + tar -zcvf kubectl-ko-log.tar.gz kubectl-ko-log/ + .PHONY: clean clean: $(RM) dist/images/kube-ovn dist/images/kube-ovn-cmd diff --git a/cmd/daemon/cniserver.go b/cmd/daemon/cniserver.go index 1fc2cef9d01..c33b9e92cbd 100644 --- a/cmd/daemon/cniserver.go +++ b/cmd/daemon/cniserver.go @@ -59,7 +59,7 @@ func CmdMain() { util.LogFatalAndExit(err, "failed to initialize node gateway") } - stopCh := signals.SetupSignalHandler() + stopCh := signals.SetupSignalHandler().Done() podInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions(config.KubeClient, 0, kubeinformers.WithTweakListOptions(func(listOption *v1.ListOptions) { listOption.FieldSelector = fmt.Sprintf("spec.nodeName=%s", config.NodeName) diff --git a/cmd/ovn_ic_controller/ovn_ic_controller.go b/cmd/ovn_ic_controller/ovn_ic_controller.go index a3dcfa419d5..570637898bd 100644 --- a/cmd/ovn_ic_controller/ovn_ic_controller.go +++ b/cmd/ovn_ic_controller/ovn_ic_controller.go @@ -18,7 +18,7 @@ func CmdMain() { util.LogFatalAndExit(err, "failed to parse config") } - stopCh := signals.SetupSignalHandler() + stopCh := signals.SetupSignalHandler().Done() ctl := ovn_ic_controller.NewController(config) ctl.Run(stopCh) } diff --git a/cmd/speaker/speaker.go b/cmd/speaker/speaker.go index 5114c32864b..8372e36eefe 100644 --- a/cmd/speaker/speaker.go +++ b/cmd/speaker/speaker.go @@ -23,7 +23,7 @@ func CmdMain() { util.LogFatalAndExit(err, "failed to parse config") } - stopCh := signals.SetupSignalHandler() + stopCh := signals.SetupSignalHandler().Done() ctl := speaker.NewController(config) go func() { diff --git a/cmd/webhook/server.go b/cmd/webhook/server.go index 36a126cf52c..4d558e2aaae 100644 --- a/cmd/webhook/server.go +++ b/cmd/webhook/server.go @@ -39,10 +39,9 @@ func init() { } func main() { - var port int klog.Infof(versions.String()) - port = *pflag.Int("port", 8443, "The port webhook listen on.") + port := pflag.Int("port", 8443, "The port webhook listen on.") klogFlags := flag.NewFlagSet("klog", flag.ExitOnError) klog.InitFlags(klogFlags) @@ -66,10 +65,10 @@ func main() { ctrl.SetLogger(klogr.New()) // Create a webhook server. - hookServer := &ctrlwebhook.Server{ - Port: port, + hookServer := ctrlwebhook.NewServer(ctrlwebhook.Options{ + Port: *port, CertDir: hookServerCertDir, - } + }) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme, diff --git a/dist/images/Dockerfile.base b/dist/images/Dockerfile.base index baa2836bde2..d3b74ec0022 100644 --- a/dist/images/Dockerfile.base +++ b/dist/images/Dockerfile.base @@ -82,7 +82,7 @@ FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt update && apt upgrade -y && apt install ca-certificates python3 hostname libunwind8 netbase \ - ethtool iproute2 ncat libunbound-dev procps libatomic1 kmod iptables \ + ethtool iproute2 ncat libunbound8 procps libatomic1 kmod iptables \ tcpdump ipset curl uuid-runtime openssl inetutils-ping iputils-tracepath arping ndisc6 \ logrotate dnsutils net-tools strongswan strongswan-pki libcharon-extra-plugins \ libcharon-extauth-plugins libstrongswan-extra-plugins libstrongswan-standard-plugins -y --no-install-recommends && \ @@ -95,10 +95,10 @@ RUN mkdir -p /var/run/openvswitch && \ mkdir -p /opt/cni/bin ARG ARCH -ENV CNI_VERSION=v1.3.0 +ENV CNI_VERSION=v1.4.1 RUN curl -sSf -L --retry 5 https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz | tar -xz -C . ./loopback ./portmap ./macvlan -ENV KUBE_VERSION="v1.28.8" +ENV KUBE_VERSION="v1.28.9" RUN curl -L https://dl.k8s.io/${KUBE_VERSION}/kubernetes-client-linux-${ARCH}.tar.gz | tar -xz -C . && cp ./kubernetes/client/bin/kubectl /usr/bin/kubectl \ && chmod +x /usr/bin/kubectl && rm -rf ./kubernetes diff --git a/go.mod b/go.mod index fe071b14795..36124efc770 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 github.com/containernetworking/cni v1.1.2 github.com/containernetworking/plugins v1.3.0 - github.com/docker/docker v24.0.7+incompatible github.com/emicklei/go-restful/v3 v3.11.0 github.com/evanphx/json-patch/v5 v5.7.0 github.com/greenpau/ovsdb v1.0.3 @@ -23,8 +22,8 @@ require ( github.com/moby/sys/mountinfo v0.7.1 github.com/neverlee/keymutex v0.0.0-20171121013845-f593aa834bf9 github.com/oilbeater/go-ping v0.0.0-20200413021620-332b7197c5b5 - github.com/onsi/ginkgo/v2 v2.9.2 - github.com/onsi/gomega v1.27.6 + github.com/onsi/ginkgo/v2 v2.9.5 + github.com/onsi/gomega v1.27.7 github.com/osrg/gobgp/v3 v3.20.0 github.com/ovn-org/libovsdb v0.0.0-20221101143603-8f21d188c3a5 github.com/parnurzeal/gorequest v0.2.16 @@ -34,73 +33,40 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 github.com/vishvananda/netlink v1.2.1-beta.2 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa - golang.org/x/mod v0.14.0 - golang.org/x/sys v0.14.0 - golang.org/x/time v0.4.0 + golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f + golang.org/x/mod v0.17.0 + golang.org/x/sys v0.19.0 + golang.org/x/time v0.5.0 google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.33.0 gopkg.in/k8snetworkplumbingwg/multus-cni.v3 v3.9.2 - k8s.io/api v0.26.15 - k8s.io/apimachinery v0.26.15 + k8s.io/api v0.27.13 + k8s.io/apimachinery v0.27.13 k8s.io/client-go v12.0.0+incompatible k8s.io/klog/v2 v2.100.1 - k8s.io/kubernetes v1.26.15 - k8s.io/pod-security-admission v0.26.15 - k8s.io/sample-controller v0.26.15 - k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 - kubevirt.io/client-go v0.58.0 - sigs.k8s.io/controller-runtime v0.14.1 + k8s.io/kubernetes v1.27.13 + k8s.io/sample-controller v0.27.13 + k8s.io/utils v0.0.0-20240423183400-0849a56e8f22 + kubevirt.io/client-go v0.58.1 + sigs.k8s.io/controller-runtime v0.15.1 ) require ( - cloud.google.com/go/compute v1.23.2 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go v55.0.0+incompatible // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.27 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/mocks v0.4.2 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b // indirect - github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab // indirect - github.com/NYTimes/gziphandler v1.1.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect - github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e // indirect - github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/cenk/hub v1.0.1 // indirect github.com/cenkalti/hub v1.0.1 // indirect github.com/cenkalti/rpc2 v0.0.0-20210604223624-c1acbc6ec984 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/checkpoint-restore/go-criu/v5 v5.3.0 // indirect - github.com/cilium/ebpf v0.9.1 // indirect - github.com/container-storage-interface/spec v1.7.0 // indirect github.com/containerd/cgroups v1.1.0 // indirect - github.com/containerd/console v1.0.3 // indirect github.com/containerd/containerd v1.6.23 // indirect - github.com/containerd/ttrpc v1.1.2 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/coreos/prometheus-operator v0.38.0 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.5.0 // indirect github.com/eapache/channels v1.1.0 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027 // indirect - github.com/euank/go-kmsg-parser v2.0.0+incompatible // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-ini/ini v1.42.0 // indirect github.com/go-kit/kit v0.12.0 // indirect @@ -108,69 +74,43 @@ require ( github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.2.0 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cadvisor v0.46.1 // indirect - github.com/google/cel-go v0.12.7 // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.4 // indirect github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect github.com/hashicorp/go-version v1.2.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/josharian/native v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/juju/errors v1.0.0 // indirect github.com/k-sone/critbitgo v1.4.0 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/karrick/godirwalk v1.17.0 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 // indirect - github.com/libopenstorage/openstorage v1.0.0 // indirect - github.com/lithammer/dedent v1.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 // indirect github.com/mdlayher/packet v1.1.1 // indirect github.com/mdlayher/socket v0.4.0 // indirect - github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989 // indirect - github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/moby/ipvs v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb // indirect - github.com/mrunalp/fileutils v0.5.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect - github.com/opencontainers/runc v1.1.6 // indirect - github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect - github.com/opencontainers/selinux v1.11.0 // indirect github.com/openshift/api v0.0.0-20221103085154-ea838af1820e // indirect github.com/openshift/client-go v3.9.0+incompatible // indirect github.com/openshift/custom-resource-status v1.1.2 // indirect @@ -185,79 +125,35 @@ require ( github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.1 // indirect - github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021 // indirect - github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 // indirect github.com/smartystreets/assertions v1.1.0 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.16.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect github.com/vishvananda/netns v0.0.4 // indirect - github.com/vmware/govmomi v0.30.6 // indirect - go.etcd.io/etcd/api/v3 v3.5.9 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect - go.etcd.io/etcd/client/v3 v3.5.9 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful v0.46.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0 // indirect - go.opentelemetry.io/otel v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect - go.opentelemetry.io/otel/metric v1.20.0 // indirect - go.opentelemetry.io/otel/sdk v1.20.0 // indirect - go.opentelemetry.io/otel/trace v1.20.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/term v0.14.0 // indirect + go.uber.org/goleak v1.3.0 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/oauth2 v0.19.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/term v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.15.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.128.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + golang.org/x/tools v0.20.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect - gopkg.in/gcfg.v1 v1.2.3 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.26.15 // indirect - k8s.io/apiserver v0.26.15 // indirect - k8s.io/cloud-provider v0.26.15 // indirect - k8s.io/cluster-bootstrap v0.26.15 // indirect - k8s.io/component-base v0.26.15 // indirect - k8s.io/component-helpers v0.26.15 // indirect - k8s.io/cri-api v0.26.15 // indirect - k8s.io/csi-translation-lib v0.26.15 // indirect - k8s.io/dynamic-resource-allocation v0.0.0 // indirect - k8s.io/kms v0.26.15 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kube-proxy v0.26.15 // indirect - k8s.io/kube-scheduler v0.0.0 // indirect - k8s.io/kubectl v0.0.0 // indirect - k8s.io/kubelet v0.26.15 // indirect - k8s.io/legacy-cloud-providers v0.0.0 // indirect - k8s.io/mount-utils v0.0.0 // indirect - kubevirt.io/api v0.58.0 // indirect + k8s.io/apiextensions-apiserver v0.27.13 // indirect + k8s.io/component-base v0.27.13 // indirect + k8s.io/kube-openapi v0.0.0-20230515203736-54b630e78af5 // indirect + kubevirt.io/api v0.58.1 // indirect kubevirt.io/containerized-data-importer-api v1.55.2 // indirect kubevirt.io/controller-lifecycle-operator-sdk/api v0.2.4 // indirect moul.io/http2curl v1.0.0 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.37 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect @@ -272,31 +168,31 @@ replace ( github.com/ovn-org/libovsdb => github.com/kubeovn/libovsdb v0.0.0-20221208095821-f8830e1998e8 github.com/vishvananda/netlink => github.com/kubeovn/netlink v0.0.0-20230322092337-960188369daf gopkg.in/k8snetworkplumbingwg/multus-cni.v3 => github.com/k8snetworkplumbingwg/multus-cni v0.0.0-20220818150730-3d9cec4ec9d5 - k8s.io/api => k8s.io/api v0.26.15 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.26.15 - k8s.io/apimachinery => k8s.io/apimachinery v0.26.15 - k8s.io/apiserver => k8s.io/apiserver v0.26.15 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.26.15 - k8s.io/client-go => k8s.io/client-go v0.26.15 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.26.15 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.26.15 - k8s.io/code-generator => k8s.io/code-generator v0.26.15 - k8s.io/component-base => k8s.io/component-base v0.26.15 - k8s.io/component-helpers => k8s.io/component-helpers v0.26.15 - k8s.io/controller-manager => k8s.io/controller-manager v0.26.15 - k8s.io/cri-api => k8s.io/cri-api v0.26.15 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.26.15 - k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.26.15 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.26.15 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.26.15 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.26.15 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.26.15 - k8s.io/kubectl => k8s.io/kubectl v0.26.15 - k8s.io/kubelet => k8s.io/kubelet v0.26.15 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.26.15 - k8s.io/metrics => k8s.io/metrics v0.26.15 - k8s.io/mount-utils => k8s.io/mount-utils v0.26.15 - k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.26.15 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.26.15 - kubevirt.io/client-go => github.com/kubeovn/kubevirt-client-go v0.0.0-20221209084839-9c2ed1f0604d + k8s.io/api => k8s.io/api v0.27.13 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.27.13 + k8s.io/apimachinery => k8s.io/apimachinery v0.27.13 + k8s.io/apiserver => k8s.io/apiserver v0.27.13 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.27.13 + k8s.io/client-go => k8s.io/client-go v0.27.13 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.27.13 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.27.13 + k8s.io/code-generator => k8s.io/code-generator v0.27.13 + k8s.io/component-base => k8s.io/component-base v0.27.13 + k8s.io/component-helpers => k8s.io/component-helpers v0.27.13 + k8s.io/controller-manager => k8s.io/controller-manager v0.27.13 + k8s.io/cri-api => k8s.io/cri-api v0.27.13 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.27.13 + k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.27.13 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.27.13 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.27.13 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.27.13 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.27.13 + k8s.io/kubectl => k8s.io/kubectl v0.27.13 + k8s.io/kubelet => k8s.io/kubelet v0.27.13 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.27.13 + k8s.io/metrics => k8s.io/metrics v0.27.13 + k8s.io/mount-utils => k8s.io/mount-utils v0.27.13 + k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.27.13 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.27.13 + kubevirt.io/client-go => github.com/kubeovn/kubevirt-client-go v0.0.0-20230517062539-8dd832f39ec5 ) diff --git a/go.sum b/go.sum index 4e9b8ce3acd..df68da17a4b 100644 --- a/go.sum +++ b/go.sum @@ -173,12 +173,9 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63 cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= -cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= @@ -606,63 +603,34 @@ github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiU github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v36.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v55.0.0+incompatible h1:L4/vUGbg1Xkw5L20LZD+hJI5I+ibWSytqQ68lTCfLwY= -github.com/Azure/azure-sdk-for-go v55.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v11.2.8+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3-0.20191028180845-3492b2aff503/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= -github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/autorest/to v0.3.1-0.20191028180845-3492b2aff503/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503 h1:RBrGlrkPWapMcLp1M6ywCqyYKOAT5ERI6lYFvGKOThE= github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b h1:Heo1J/ttaQFgGJSVnCZquy3e5eH5j1nqxBuomztB3P0= -github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b/go.mod h1:FNj4KYEAAHfYu68kRYolGoxkaJn+6mdEsaM12VTwuI0= -github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab h1:UKkYhof1njT1/xq4SEg5z+VpTgjmNeHwPGRQl7takDI= -github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/Mellanox/sriovnet v1.1.0 h1:j3KnktNJMHWPTqWXlf27OzQG0ahRO+88NauMjlazyko= github.com/Mellanox/sriovnet v1.1.0/go.mod h1:P2Epf+52ZaPknkR60EUOvLABXZh3FBymcHPsUfikRVE= -github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= @@ -687,13 +655,11 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= 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= @@ -703,14 +669,9 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= -github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= -github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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= @@ -720,9 +681,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bhendo/go-powershell v0.0.0-20190719160123-219e7fb4e41e h1:KCjb01YiNoRaJ5c+SbnPLWjVzU9vqRYHg3e5JcN50nM= github.com/bhendo/go-powershell v0.0.0-20190719160123-219e7fb4e41e/go.mod h1:f7vw6ObmmNcyFQLhZX9eUGBJGpnwTJFDvVjqZxIxHWY= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -754,15 +713,9 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= -github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= -github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -778,7 +731,6 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 h1:ox2F0PSMlrAAiAdknSRMDrAr8mfxPCfSZolH+/qQnyQ= github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08/go.mod h1:pCxVEbcm3AMg7ejXyorUXi6HQCzOIBf7zEDVPtw0/U4= @@ -786,19 +738,10 @@ github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/container-storage-interface/spec v1.7.0 h1:gW8eyFQUZWWrMWa8p1seJ28gwDoN5CVJ4uAbQ+Hdycw= -github.com/container-storage-interface/spec v1.7.0/go.mod h1:JYuzLqr9VVNoDJl44xp/8fmCOvWPDKzuGTwCoklhuqk= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.6.23 h1:KYJd6UJhKHzwMhiD70iTtSmU+k4565ac22GOTI3AuTA= github.com/containerd/containerd v1.6.23/go.mod h1:UrQOiyzrLi3n4aezYJbQH6Il+YzTvnHFbEuO3yfDrM4= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/ttrpc v1.1.2 h1:4jH6OQDQqjfVD2b5TJS5TxmGuLGmp5WW7KtW2TWOP7c= -github.com/containerd/ttrpc v1.1.2/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= github.com/containernetworking/plugins v1.3.0 h1:QVNXMT6XloyMUoO2wUOqWTC1hWFV62Q6mVDp5H1HnjM= @@ -809,24 +752,19 @@ github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/prometheus-operator v0.38.0 h1:gF2xYIfO09XLFdyEecND46uihQ2KTaDwTozRZpXLtN4= github.com/coreos/prometheus-operator v0.38.0/go.mod h1:xZC7/TgeC0/mBaJk+1H9dbHaiEvLYHgX6Mi1h40UPh8= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -836,20 +774,9 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.18+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/channels v1.1.0 h1:F1taHcn7/F0i8DYqKXJnyhJcVpp2kgFcNePxXtnyu4k= github.com/eapache/channels v1.1.0/go.mod h1:jMm2qB5Ubtg9zLd+inMZd2/NUvXgzmWXsDaLyQIGfH0= @@ -862,7 +789,6 @@ github.com/elastic/go-sysinfo v1.0.1/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyz github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027 h1:1L0aalTpPz7YlMxETKpmQoWMBkeiuorElZIXoNmgiPE= github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= @@ -887,33 +813,22 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY= -github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc= github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= -github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/set v0.2.1 h1:nn2CaJyknWE/6txyUDGwysr3G5QC6xWB/PtVjPBbeaA= github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -926,7 +841,6 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME 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-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= @@ -961,8 +875,8 @@ github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= 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= github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -978,8 +892,9 @@ github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwds github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= @@ -987,8 +902,8 @@ github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -1003,7 +918,6 @@ github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsd github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= @@ -1015,7 +929,6 @@ github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= @@ -1030,12 +943,8 @@ github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -1043,9 +952,7 @@ github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -1096,11 +1003,7 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cadvisor v0.46.1 h1:zCOqaAOS4LvAEldLFc0KrbsDX/AFIDRI1X2WtJSwgmg= -github.com/google/cadvisor v0.46.1/go.mod h1:YnCDnR8amaS0HoMEjheOI0TMPzFKCBLc30mciLEjwGI= -github.com/google/cel-go v0.12.7 h1:jM6p55R0MKBg79hZjn1zs2OlrywZ1Vk00rxVvad1/O0= github.com/google/cel-go v0.12.7/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= @@ -1152,9 +1055,6 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1167,8 +1067,6 @@ github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -1181,8 +1079,6 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= @@ -1201,24 +1097,17 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f h1:ShTPMJQes6tubcjzGMODIVG5hlrCeImaBnZzKF2N8SM= -github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -1264,19 +1153,12 @@ github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -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/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= @@ -1311,8 +1193,6 @@ github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 h1:V github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0/go.mod h1:nqCI7aelBJU61wiBeeZWJ6oi4bJy5nrjkM6lWIMA4j0= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= -github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= @@ -1345,8 +1225,8 @@ github.com/kubeovn/go-iptables v0.0.0-20230322103850-8619a8ab3dca h1:fTMjoho2et9 github.com/kubeovn/go-iptables v0.0.0-20230322103850-8619a8ab3dca/go.mod h1:jY1XeGzkx8ASNJ+SqQSxTESNXARkjvt+I6IJOTnzIjw= github.com/kubeovn/gonetworkmanager/v2 v2.0.0-20230905082151-e28c4d73a589 h1:y9exo1hjCsq7jsGUzt11kxhTiEGrGSQ0ZqibAiZk2PQ= github.com/kubeovn/gonetworkmanager/v2 v2.0.0-20230905082151-e28c4d73a589/go.mod h1:49upX+/hUyppWIqu58cumojyIwXdkA8k6reA/mQlKuI= -github.com/kubeovn/kubevirt-client-go v0.0.0-20221209084839-9c2ed1f0604d h1:sM7V2MhONBa10zYQA1yg/UbPm/Y7JqVqymtgoDiGqMo= -github.com/kubeovn/kubevirt-client-go v0.0.0-20221209084839-9c2ed1f0604d/go.mod h1:FjHUGVwls5NE1q8rsSL0LsRU46p35cwgnwSItkr8oXs= +github.com/kubeovn/kubevirt-client-go v0.0.0-20230517062539-8dd832f39ec5 h1:3tygbNMsdRZpFXEofMq8MLkTlWTRd4tDomEZdXxrbUA= +github.com/kubeovn/kubevirt-client-go v0.0.0-20230517062539-8dd832f39ec5/go.mod h1:GhMrao/zkhyDt9T4Azt3/2zxztchdSecAumECdFi+XQ= github.com/kubeovn/libovsdb v0.0.0-20221208095821-f8830e1998e8 h1:gkYOU8DJQJeDef9hYETOf0D270zVS3xYuytjFLEi0rc= github.com/kubeovn/libovsdb v0.0.0-20221208095821-f8830e1998e8/go.mod h1:N20zsElkDpTm57hVDosiZVghprt9Y4Vfqsi1HBXOzr4= github.com/kubeovn/netlink v0.0.0-20230322092337-960188369daf h1:inZiuUjcQaX0O0Sdki38TWzCl0+wJty+vaQKEr47by8= @@ -1358,13 +1238,8 @@ github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4D github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/leanovate/gopter v0.2.4/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= -github.com/libopenstorage/openstorage v1.0.0 h1:GLPam7/0mpdP8ZZtKjbfcXJBTIA/T1O6CBErVEFEyIM= -github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.0/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= @@ -1409,19 +1284,14 @@ github.com/mdlayher/socket v0.4.0/go.mod h1:xxFqz5GRCUN3UEOm9CZqEJsAbe1C8OwSK46N github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989 h1:PS1dLCGtD8bb9RPKJrc8bS7qHL6JnW1CZvwzH9dPoUs= -github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= -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/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 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 v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= @@ -1431,16 +1301,11 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/ipvs v1.0.1 h1:aoZ7fhLTXgDbzVrAnvV+XbKOU8kOET7B3+xULDF/1o0= -github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= 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= @@ -1449,21 +1314,13 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb h1:e+l77LJOEqXTIQihQJVkA6ZxPOUmfPM5e4H7rcpgtSk= -github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozillazg/go-cos v0.13.0/go.mod h1:Zp6DvvXn0RUOXGJ2chmWt2bLEqRAnJnS3DnAZsJsoaE= github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= -github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= -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 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/neverlee/keymutex v0.0.0-20171121013845-f593aa834bf9 h1:UfW5pM66x0MWE72ySrpd2Ymrn+b62kNHirozKkY3ojE= github.com/neverlee/keymutex v0.0.0-20171121013845-f593aa834bf9/go.mod h1:3hf2IoUXDKjCg/EuqSLUB5TY8StGS3haWYJiqzP907c= @@ -1497,22 +1354,9 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= -github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= -github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v1.1.4/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runc v1.1.6 h1:XbhB8IfG/EsnhNvZtNdLB0GBw92GYEFvKlhaJk9jUgA= -github.com/opencontainers/runc v1.1.6/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= -github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= +github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= github.com/openshift/api v0.0.0-20221103085154-ea838af1820e h1:Zhl/UmwLZ8fWspVgbmTFC6wcXtF+Ljpa3WcUtwdHpec= github.com/openshift/api v0.0.0-20221103085154-ea838af1820e/go.mod h1:OW9hi5XDXOQWm/kRqUww6RVxZSf0nqrS4heerSmHBC4= github.com/openshift/client-go v0.0.0-20221107163225-3335a34a1d24 h1:V3J5k9LqJJpA2D8YOoJI8+Hr14mXauYR3uTI2/Foc+w= @@ -1537,7 +1381,6 @@ github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= @@ -1577,7 +1420,6 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= @@ -1629,13 +1471,10 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021 h1:if3/24+h9Sq6eDx8UUz1SO9cT9tizyIsATfB7b4D3tc= -github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= 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/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= @@ -1649,19 +1488,17 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/scylladb/go-set v1.0.2 h1:SkvlMCKhP0wyyct6j+0IHJkBkSZL+TDzZ4E7f7BCcRE= github.com/scylladb/go-set v1.0.2/go.mod h1:DkpGd78rljTxKAnTDPFqXSGxvETQnJyuSOQwsHycqfs= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -1672,7 +1509,6 @@ github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:s github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1690,8 +1526,6 @@ github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1703,7 +1537,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1727,30 +1560,22 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/thanos-io/thanos v0.11.0/go.mod h1:N/Yes7J68KqvmY+xM6J5CJqEvWIvKSR5sqGtmuD6wDc= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.20.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= -github.com/vmware/govmomi v0.30.6 h1:O3tjSwQBy0XwI5uK1/yVIfQ1LP9bAECEDUfifnyGs9U= -github.com/vmware/govmomi v0.30.6/go.mod h1:epgoslm97rLECMV4D+08ORzUBEU7boFSepKjt7AYVGg= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1767,24 +1592,13 @@ go.elastic.co/apm/module/apmot v1.5.0/go.mod h1:d2KYwhJParTpyw2WnTNy8geNlHKKFX+4 go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= -go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU= -go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= -go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= -go.etcd.io/etcd/pkg/v3 v3.5.5 h1:Ablg7T7OkR+AeeeU32kdVhw/AGDsitkKPl7aW73ssjU= -go.etcd.io/etcd/pkg/v3 v3.5.5/go.mod h1:6ksYFxttiUGzC2uxyqiyOEvhAiD0tuIqSZkX3TyPdaE= -go.etcd.io/etcd/raft/v3 v3.5.5 h1:Ibz6XyZ60OYyRopu73lLM/P+qco3YtlZMOhnXNS051I= -go.etcd.io/etcd/raft/v3 v3.5.5/go.mod h1:76TA48q03g1y1VpTue92jZLr9lIHKUNcYdZOOGyx8rI= -go.etcd.io/etcd/server/v3 v3.5.5 h1:jNjYm/9s+f9A9r6+SC4RvNaz6AqixpOvhrFdT0PvIj0= -go.etcd.io/etcd/server/v3 v3.5.5/go.mod h1:rZ95vDw/jrvsbj9XpTqPrTAB9/kzchVdhRirySPkUBc= +go.etcd.io/etcd/api/v3 v3.5.7/go.mod h1:9qew1gCdDDLu+VwmeG+iFpL+QlpHTo7iubavdVDgCAA= +go.etcd.io/etcd/client/pkg/v3 v3.5.7/go.mod h1:o0Abi1MK86iad3YrWhgUsbGx1pmTS+hrORWc2CamuhY= +go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= +go.etcd.io/etcd/client/v3 v3.5.7/go.mod h1:sOWmj9DZUMyAngS7QQwCyAXXAL6WhgTOPLNS/NabQgw= +go.etcd.io/etcd/pkg/v3 v3.5.7/go.mod h1:kcOfWt3Ov9zgYdOiJ/o1Y9zFfLhQjylTgL4Lru8opRo= +go.etcd.io/etcd/raft/v3 v3.5.7/go.mod h1:TflkAb/8Uy6JFBxcRaH2Fr6Slm9mCPVdI2efzxY96yU= +go.etcd.io/etcd/server/v3 v3.5.7/go.mod h1:gxBgT84issUVBRpZ3XkW1T55NjOb4vZZRI4wVvNhf4A= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1797,67 +1611,45 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful v0.46.0 h1:GsspRB7RvmsQVNlaVla20njAgqWaWAr75TMcHhOxD1Y= -go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful v0.46.0/go.mod h1:CXRA45RjEIrSxbMhSZ5WyINWkir8ePVDKduaJuWZcAQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0 h1:PzIubN4/sjByhDRHLviCjJuweBXWFZWhghjg7cS28+M= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.0/go.mod h1:Ct6zzQEuGK3WpJs2n4dn+wfJYzd/+hNnxMRTWjGn30M= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0 h1:1eHu3/pUSWaOgltNK3WJFaywKsTIr/PwvHyDmi0lQA0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0/go.mod h1:HyABWq60Uy1kjJSa2BVOxUVao8Cdick5AWSKPutqy6U= -go.opentelemetry.io/contrib/propagators/b3 v1.21.0 h1:uGdgDPNzwQWRwCXJgw/7h29JaRqcq9B87Iv4hJDKAZw= go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM= go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= -go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= -go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0= go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA= -go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM= go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= -go.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM= -go.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0= go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4= go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= -go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= -go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1877,15 +1669,13 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1901,8 +1691,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= -golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= +golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1941,15 +1731,15 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2010,6 +1800,7 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -2024,6 +1815,7 @@ golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -2031,10 +1823,12 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2050,7 +1844,6 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ 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/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= @@ -2065,8 +1858,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= +golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2084,8 +1877,9 @@ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2114,7 +1908,6 @@ golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2124,7 +1917,6 @@ golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2175,13 +1967,10 @@ 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-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2189,7 +1978,6 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2212,10 +2000,12 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2226,10 +2016,12 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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= @@ -2248,7 +2040,6 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= @@ -2260,8 +2051,8 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= -golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2283,7 +2074,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2339,15 +2129,16 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2356,8 +2147,8 @@ golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc= +gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= @@ -2396,7 +2187,6 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= @@ -2425,8 +2215,6 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2434,8 +2222,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww 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/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2500,7 +2286,6 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -2576,11 +2361,7 @@ google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= @@ -2664,8 +2445,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV 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/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2675,12 +2454,9 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.1.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2699,9 +2475,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2712,32 +2485,18 @@ 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= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -k8s.io/api v0.26.15 h1:tjMERUjIwkq+2UtPZL5ZbSsLkpxUv4gXWZfV5lQl+Og= -k8s.io/api v0.26.15/go.mod h1:CtWOrFl8VLCTLolRlhbBxo4fy83tjCLEtYa5pMubIe0= -k8s.io/apiextensions-apiserver v0.26.15 h1:QePn6+5mihx8sXQLaOXzvF4XPv2RGGj8Pv+O4P75GPU= -k8s.io/apiextensions-apiserver v0.26.15/go.mod h1:PbhgN0XidyF+9vCTUmNgVFK0MMEYqlHLZ4AJeBfiNMo= -k8s.io/apimachinery v0.26.15 h1:GPxeERYBSqSZlj3xIkX4L6mBjzZ9q8JPnJ+Vj15qe+g= -k8s.io/apimachinery v0.26.15/go.mod h1:O/uIhIOWuy6ndHqQ6qbkjD7OgeMhVtlk8+Z66ZcmJQc= -k8s.io/apiserver v0.26.15 h1:9sV2i7+A+/+YjQw9DMf7XTgbUdxtOKeTkluU7VhlD6Y= -k8s.io/apiserver v0.26.15/go.mod h1:dLnCqVroGkCKYNobv9Nm1Ot8GzapzMOKltAlkOlzv8o= -k8s.io/cli-runtime v0.26.15 h1:+y3am0YLVBEfe4je5taxVUM8EKQKnUqzmXBdn3Ytxko= -k8s.io/client-go v0.26.15 h1:A2Yav2v+VZQfpEsf5ESFp2Lqq5XACKBDrwkG+jEtOg0= -k8s.io/client-go v0.26.15/go.mod h1:KJs7snLEyKPlypqTQG/ngcaqE6h3/6qTvVHDViRL+iI= -k8s.io/cloud-provider v0.26.15 h1:9WLST7NKErkXzmL6CqfBWWzm/UWNIYd9Ljpo9greC6M= -k8s.io/cloud-provider v0.26.15/go.mod h1:y8TYLhfV7ICZflbtUnRpiM2Ubkf6nbXxUP/KP7WHFEs= -k8s.io/cluster-bootstrap v0.26.15 h1:Q579lFWeECM1jGvfQ4/gysWtFAZU0+X5mM1KmWzZf/I= -k8s.io/cluster-bootstrap v0.26.15/go.mod h1:CY2RfLVkKJgo7Zt+KGvLw6HSakqgXxty57+2xB/bNbA= -k8s.io/code-generator v0.26.15/go.mod h1:JKZ03Lo95abcdMtOMlj6r6AkLW0gtL3vqIWaVH7Bk00= -k8s.io/component-base v0.26.15 h1:32XJyv5fo/lbDZhYU1HyISXTgdSUkbW5cO4DhfR6Y/8= -k8s.io/component-base v0.26.15/go.mod h1:9V+nBzUtTNtRuYfYmQQEhuKrjhL80i2l6F2H2qUsHAI= -k8s.io/component-helpers v0.26.15 h1:2ln2voQ6oLMUKzksr29g47iE1Y0rLdB+2KICF8F1f5Q= -k8s.io/component-helpers v0.26.15/go.mod h1:UwLS62rpGU8sIJfnBWChicMdf14y9hdu5DXicHay4Hk= -k8s.io/cri-api v0.26.15 h1:9HpWB35dVJUVqAqNgMrg2gcgqUq/hcxQwl/BJ3NJj0E= -k8s.io/cri-api v0.26.15/go.mod h1:oQALVNkz8DGjs0VYMYFcsCFFglNcxqaFZfoDlvRF0e0= -k8s.io/csi-translation-lib v0.26.15 h1:dfhWON0bRyDbuKep98iMB3tzQH3LPgWz1L7MX8EgPhI= -k8s.io/csi-translation-lib v0.26.15/go.mod h1:OzKZFjmBqYScPtQe3XniIkHBs1LpaP98od+PXUdS0fk= -k8s.io/dynamic-resource-allocation v0.26.15 h1:4c9ZGd4HMipSA5L9TwXExNI45ZknnzVsLMfvMknoqqE= -k8s.io/dynamic-resource-allocation v0.26.15/go.mod h1:+1o9SfP+pPQ2kZHj9K2P+DmUtAvQnv28AVWdHTIzano= +k8s.io/api v0.27.13 h1:d49LYs1dh+JMMDNYQSu8FhEzCjc2TNpYvDWoSGAKs80= +k8s.io/api v0.27.13/go.mod h1:W3lYMPs34i0XQA+cmKfejve+HwbRZjy67fL05RyJUTo= +k8s.io/apiextensions-apiserver v0.27.13 h1:it32SCkrjzhimZasL++nsshG66m2O570y56R+xj1/WE= +k8s.io/apiextensions-apiserver v0.27.13/go.mod h1:LkAz0+pjqr/92kPigX/B2sjsPhGCuG+hi8GyyjUNNsE= +k8s.io/apimachinery v0.27.13 h1:xDAnOWaRVNSkaKdfB0Ab11hixH90KGTbLwEHMloMjFM= +k8s.io/apimachinery v0.27.13/go.mod h1:TWo+8wOIz3CytsrlI9k/LBWXLRr9dqf5hRSCbbggMAg= +k8s.io/apiserver v0.27.13/go.mod h1:XHth2MKAUdcLvdhPOwvDPbSyOrMev2vRqE05oUEC5Hk= +k8s.io/client-go v0.27.13 h1:SfUbIukb6BSqaadlYRX0AzMoN6+e+9FZGEKqfisidho= +k8s.io/client-go v0.27.13/go.mod h1:I9SBaI28r6ii465Fb0dTpf5O3adOnDwNBoeqlDNbbFg= +k8s.io/code-generator v0.27.13/go.mod h1:NmuMGweDQC7Ewx+c8zgbtVPLsy5r5Rs/+nQ7kuBwNbI= +k8s.io/component-base v0.27.13 h1:JuDLZqD8L+Wu9nUNv9msjQjkh172Ag6crphzASEvlKo= +k8s.io/component-base v0.27.13/go.mod h1:QKur/xRE4R25PhScEe3lAhrVSwEuZPGlFPyEDOaWCgU= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= @@ -2750,45 +2509,27 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kms v0.26.15 h1:CSPk5Qr9mcF3dNPq2WyN1Ws90GOYUkMwbEZ/9EcOVLI= -k8s.io/kms v0.26.15/go.mod h1:W1GP8kboS8tKSCrGJTss42ufTbj6e8z+29ZAZ9kggcQ= -k8s.io/kube-aggregator v0.26.15 h1:ljO9Y9jhwlr1XCRcQczi6wt7f4UlUASycSXmGuoLUEc= +k8s.io/kms v0.27.13/go.mod h1:g3rvv+YDJ5xVEanhlnliJw4a9vZ/SL/AVw0/yQNwbEA= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kube-proxy v0.26.15 h1:hdGHBY3vWbTvxIKCDaUybRQH/kR0ClRtsUH+1uCj1Jo= -k8s.io/kube-proxy v0.26.15/go.mod h1:mZgEN1leVh4JYzuvBXCLjLnGbIVtfSQLzt/sugvySJE= -k8s.io/kube-scheduler v0.26.15 h1:bsCe6ohw5MV3X0UB+JvCI2rrELWFnOacL7Uf5/NAUMM= -k8s.io/kube-scheduler v0.26.15/go.mod h1:lLIAwYrF3Cf7OQLHi05pc+2b6PLqsGxyFTa4Id+wNEY= -k8s.io/kubectl v0.26.15 h1:Q118/ZVWmUYEm6Iod8MKuxQFwTBBopBogGq5tkudvhg= -k8s.io/kubectl v0.26.15/go.mod h1:JgN3H70qdFjI/93T91gVOAsSExxNmccoCQLDNX//aYw= -k8s.io/kubelet v0.26.15 h1:zf6epB3dqA5bperYLhyuFr+gQQ9qasM95cyeKAuodZc= -k8s.io/kubelet v0.26.15/go.mod h1:8g/EzBlR1ByT5jkYbH9iaCNCFKDUNhHj4cx38UrtyiY= -k8s.io/kubernetes v1.26.15 h1:o65B3kKH7q9xK2h2323rKKThI1rp3ZarXpb8asT932U= -k8s.io/kubernetes v1.26.15/go.mod h1:X28d33q7QRZtOw/KPdTeOksMQAMNKkSwwAzRtovsBVE= -k8s.io/legacy-cloud-providers v0.26.15 h1:/Nwh4uCpdlfm6iCF6mnP3bJBZ9XNxRLQ4Vf5BeJGwGs= -k8s.io/legacy-cloud-providers v0.26.15/go.mod h1:FmFq9/2+yhUFdcziwDEYbccC/p/qQwwgPCvMAslAvCA= -k8s.io/metrics v0.26.15 h1:U+FLqs8aFMVBWycx/lZn8nSBP5lfdmQMCqG288XOsbs= -k8s.io/mount-utils v0.26.15 h1:TvTNwRNiXRlxjb7ZUlKObpfINRmcFqMF2i+rb3iJ/co= -k8s.io/mount-utils v0.26.15/go.mod h1:huSg2NI5P8ZNfE8PkQmm5a9fFZ9iHCXFxP/rasMCgYA= -k8s.io/pod-security-admission v0.26.15 h1:77T2rOpcWaaDB5Mu9UvbvhM2TygsqfB0QJHB8eQ1TMo= -k8s.io/pod-security-admission v0.26.15/go.mod h1:3UQZIme8QMomM2n1BVLqvNVJt5HWZ6DZ/y3056aECi4= -k8s.io/sample-apiserver v0.26.15 h1:0S9t0c+ZO2Dy/sDNPGodE/SEc50gJsaEUX4P8Bf0Fa4= -k8s.io/sample-controller v0.26.15 h1:zZ1HlydLC4KFg/QXb1cuMulJnf/GJDrJvRfxSPZkmLI= -k8s.io/sample-controller v0.26.15/go.mod h1:x28ujzpoDEal4lH9CLhchdcq7ZISTCERY03cO+xDJic= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= +k8s.io/kube-openapi v0.0.0-20230515203736-54b630e78af5 h1:azYPdzztXxPSa8wb+hksEKayiz0o+PPisO/d+QhWnoo= +k8s.io/kube-openapi v0.0.0-20230515203736-54b630e78af5/go.mod h1:kzo02I3kQ4BTtEfVLaPbjvCkX97YqGve33wzlb3fofQ= +k8s.io/kubernetes v1.27.13 h1:5NBz3aNy5Jwcgi+w2+rP4x5B0Wa21NXUJxDJwdUtxlY= +k8s.io/kubernetes v1.27.13/go.mod h1:T4toI2XSWG5FJoq/H8q9eFYPymAxe/k4UnaC00uPnMs= +k8s.io/sample-controller v0.27.13 h1:jl9CAVz04UNGC4kbId/hQctEO6RLYep2mX47NwYiYlQ= +k8s.io/sample-controller v0.27.13/go.mod h1:6cvKwIISY70pOYnaJhlak3mB237MQ1+RwDnZyCs0aEQ= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y= -k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -kubevirt.io/api v0.58.0 h1:qeNeRtD6AIJ5WVJuRXajmmXtnrO5dYchy+hpCm6QwhE= -kubevirt.io/api v0.58.0/go.mod h1:U0CQlZR0JoJCaC+Va0wz4dMOtYDdVywJ98OT1KmOkzI= +k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240423183400-0849a56e8f22 h1:ao5hUqGhsqdm+bYbjH/pRkCs0unBGe9UyDahzs9zQzQ= +k8s.io/utils v0.0.0-20240423183400-0849a56e8f22/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +kubevirt.io/api v0.58.1 h1:+b9fydWSMD4SCOr1VHTEgXOmy5JzYU62ddSuQSWggys= +kubevirt.io/api v0.58.1/go.mod h1:U0CQlZR0JoJCaC+Va0wz4dMOtYDdVywJ98OT1KmOkzI= kubevirt.io/containerized-data-importer-api v1.55.2 h1:AzYnKIUFkKwO6c0uCQZYlAIxfzbiPkJXP29hFhauaQ8= kubevirt.io/containerized-data-importer-api v1.55.2/go.mod h1:92HiQEyzPoeMiCbgfG5Qe10JQVbtWMZOXucy56dKdGg= kubevirt.io/controller-lifecycle-operator-sdk/api v0.2.4 h1:fZYvD3/Vnitfkx6IJxjLAk8ugnZQ7CXVYcRfkSKmuZY= @@ -2833,16 +2574,12 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.37 h1:fAPTNEpzQMOLMGwOHNbUkR2xXTQwMJOZYNx+/mLlOh0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.37/go.mod h1:vfnxT4FXNT8eGvO+xi/DsyC/qHmdujqwrUa1WSspCsk= -sigs.k8s.io/controller-runtime v0.14.1 h1:vThDes9pzg0Y+UbCPY3Wj34CGIYPgdmspPm2GIpxpzM= -sigs.k8s.io/controller-runtime v0.14.1/go.mod h1:GaRkrY8a7UZF0kqFFbUKG7n9ICiTY5T55P1RiE3UZlU= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0= +sigs.k8s.io/controller-runtime v0.15.1 h1:9UvgKD4ZJGcj24vefUFgZFP3xej/3igL9BsOUTb/+4c= +sigs.k8s.io/controller-runtime v0.15.1/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk= sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= -sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= diff --git a/test/e2e/cyclonus.yaml b/test/e2e/cyclonus.yaml deleted file mode 100644 index 5b76e75cb6e..00000000000 --- a/test/e2e/cyclonus.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: cyclonus -spec: - template: - spec: - restartPolicy: Never - containers: - - command: - - ./cyclonus - - generate - - --exclude= - - --include=upstream-e2e - - --retries=3 - - --noisy=true - - --ignore-loopback=true - - --cleanup-namespaces=true - - --server-port=80 - - --server-protocol=tcp - name: cyclonus - imagePullPolicy: IfNotPresent - image: mfenwick100/cyclonus:latest - serviceAccount: cyclonus diff --git a/test/e2e/framework/daemonset.go b/test/e2e/framework/daemonset.go deleted file mode 100644 index 5066fd44d81..00000000000 --- a/test/e2e/framework/daemonset.go +++ /dev/null @@ -1,47 +0,0 @@ -package framework - -import ( - "context" - "fmt" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clientset "k8s.io/client-go/kubernetes" -) - -func GetPodsForDaemonSet(cs clientset.Interface, ds *appsv1.DaemonSet) (*corev1.PodList, error) { - podSelector, err := metav1.LabelSelectorAsSelector(ds.Spec.Selector) - if err != nil { - return nil, err - } - podListOptions := metav1.ListOptions{LabelSelector: podSelector.String()} - allPods, err := cs.CoreV1().Pods(ds.Namespace).List(context.TODO(), podListOptions) - if err != nil { - return nil, err - } - - ownedPods := &corev1.PodList{Items: make([]corev1.Pod, 0, len(allPods.Items))} - for i, pod := range allPods.Items { - controllerRef := metav1.GetControllerOf(&allPods.Items[i]) - if controllerRef != nil && controllerRef.UID == ds.UID { - ownedPods.Items = append(ownedPods.Items, pod) - } - } - - return ownedPods, nil -} - -func GetPodOnNodeForDaemonSet(cs clientset.Interface, ds *appsv1.DaemonSet, node string) (*corev1.Pod, error) { - pods, err := GetPodsForDaemonSet(cs, ds) - if err != nil { - return nil, err - } - for _, pod := range pods.Items { - if pod.Spec.NodeName == node { - return pod.DeepCopy(), nil - } - } - - return nil, fmt.Errorf("pod for daemonset %s/%s on node %s not found", ds.Namespace, ds.Name, node) -} diff --git a/test/e2e/framework/docker/container.go b/test/e2e/framework/docker/container.go deleted file mode 100644 index 5b2fa11bd89..00000000000 --- a/test/e2e/framework/docker/container.go +++ /dev/null @@ -1,87 +0,0 @@ -package docker - -import ( - "context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - dockerfilters "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - "github.com/docker/docker/client" -) - -func ContainerList(filters map[string][]string) ([]types.Container, error) { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return nil, err - } - defer cli.Close() - - f := dockerfilters.NewArgs() - for k, v := range filters { - for _, v1 := range v { - f.Add(k, v1) - } - } - return cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: f}) -} - -func ContainerCreate(name, image, networkName string, cmd []string) (*types.ContainerJSON, error) { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return nil, err - } - defer cli.Close() - - containerConfig := &container.Config{ - Image: image, - Cmd: cmd, - Tty: false, - } - networkConfig := &network.NetworkingConfig{ - EndpointsConfig: map[string]*network.EndpointSettings{ - networkName: new(network.EndpointSettings), - }, - } - - resp, err := cli.ContainerCreate(context.Background(), containerConfig, nil, networkConfig, nil, name) - if err != nil { - return nil, err - } - - if err = cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil { - return nil, err - } - - info, err := cli.ContainerInspect(context.Background(), resp.ID) - if err != nil { - return nil, err - } - - return &info, nil -} - -func ContainerInspect(id string) (*types.ContainerJSON, error) { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return nil, err - } - defer cli.Close() - - result, err := cli.ContainerInspect(context.Background(), id) - if err != nil { - return nil, err - } - - return &result, nil -} - -func ContainerRemove(id string) error { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return err - } - defer cli.Close() - - return cli.ContainerRemove(context.Background(), id, types.ContainerRemoveOptions{Force: true}) -} diff --git a/test/e2e/framework/docker/exec.go b/test/e2e/framework/docker/exec.go deleted file mode 100644 index 26f8ccda96b..00000000000 --- a/test/e2e/framework/docker/exec.go +++ /dev/null @@ -1,71 +0,0 @@ -package docker - -import ( - "bytes" - "context" - "fmt" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/stdcopy" - - "github.com/kubeovn/kube-ovn/test/e2e/framework" -) - -type ErrNonZeroExitCode struct { - cmd string - code int -} - -func (e ErrNonZeroExitCode) Error() string { - return fmt.Sprintf("command %q exited with code %d", e.cmd, e.code) -} - -func Exec(id string, env []string, cmd ...string) (stdout, stderr []byte, err error) { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return nil, nil, err - } - defer cli.Close() - - framework.Logf("Executing command %q in container %s", strings.Join(cmd, " "), id) - config := types.ExecConfig{ - Privileged: true, - AttachStderr: true, - AttachStdout: true, - Env: env, - Cmd: cmd, - } - createResp, err := cli.ContainerExecCreate(context.Background(), id, config) - if err != nil { - return nil, nil, err - } - - attachResp, err := cli.ContainerExecAttach(context.Background(), createResp.ID, types.ExecStartCheck{}) - if err != nil { - return nil, nil, err - } - defer attachResp.Close() - - var outBuf, errBuf bytes.Buffer - if _, err = stdcopy.StdCopy(&outBuf, &errBuf, attachResp.Reader); err != nil { - return nil, nil, err - } - - inspectResp, err := cli.ContainerExecInspect(context.Background(), createResp.ID) - if err != nil { - return nil, nil, err - } - - if inspectResp.ExitCode != 0 { - framework.Logf("command exited with code %d", inspectResp.ExitCode) - err = ErrNonZeroExitCode{cmd: strings.Join(cmd, " "), code: inspectResp.ExitCode} - } - - stdout, stderr = outBuf.Bytes(), errBuf.Bytes() - framework.Logf("stdout: %s", string(stdout)) - framework.Logf("stderr: %s", string(stderr)) - - return -} diff --git a/test/e2e/framework/docker/network.go b/test/e2e/framework/docker/network.go deleted file mode 100644 index ab2b1de926b..00000000000 --- a/test/e2e/framework/docker/network.go +++ /dev/null @@ -1,141 +0,0 @@ -package docker - -import ( - "context" - "crypto/sha1" - "encoding/binary" - "fmt" - "net" - "strconv" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - "github.com/docker/docker/client" - "github.com/kubeovn/kube-ovn/pkg/util" -) - -const MTU = 1500 - -// https://github.com/kubernetes-sigs/kind/tree/main/pkg/cluster/internal/providers/docker/network.go#L313 -// generateULASubnetFromName generate an IPv6 subnet based on the -// name and Nth probing attempt -func generateULASubnetFromName(name string, attempt int32) string { - ip := make([]byte, 16) - ip[0] = 0xfc - ip[1] = 0x00 - h := sha1.New() - _, _ = h.Write([]byte(name)) - _ = binary.Write(h, binary.LittleEndian, attempt) - bs := h.Sum(nil) - for i := 2; i < 8; i++ { - ip[i] = bs[i] - } - subnet := &net.IPNet{ - IP: net.IP(ip), - Mask: net.CIDRMask(64, 128), - } - return subnet.String() -} - -func getNetwork(name string, ignoreNotFound bool) (*types.NetworkResource, error) { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return nil, err - } - defer cli.Close() - - f := filters.NewArgs() - f.Add("name", name) - networks, err := cli.NetworkList(context.Background(), types.NetworkListOptions{Filters: f}) - if err != nil { - return nil, err - } - - if len(networks) == 0 { - if !ignoreNotFound { - return nil, fmt.Errorf("network %s does not exist", name) - } - return nil, nil - } - - info, err := cli.NetworkInspect(context.Background(), networks[0].ID, types.NetworkInspectOptions{}) - if err != nil { - return nil, err - } - return &info, nil -} - -func NetworkInspect(name string) (*types.NetworkResource, error) { - return getNetwork(name, false) -} - -func NetworkCreate(name string, ipv6, skipIfExists bool) (*types.NetworkResource, error) { - if skipIfExists { - network, err := getNetwork(name, true) - if err != nil { - return nil, err - } - if network != nil { - return network, nil - } - } - - options := types.NetworkCreate{ - CheckDuplicate: true, - Driver: "bridge", - Attachable: true, - IPAM: &network.IPAM{ - Driver: "default", - }, - Options: map[string]string{ - "com.docker.network.bridge.enable_ip_masquerade": "true", - "com.docker.network.driver.mtu": strconv.Itoa(MTU), - }, - } - if ipv6 { - options.EnableIPv6 = true - subnet := generateULASubnetFromName(name, 0) - gateway, err := util.FirstIP(subnet) - if err != nil { - return nil, err - } - config := network.IPAMConfig{ - Subnet: subnet, - Gateway: gateway, - } - options.IPAM.Config = append(options.IPAM.Config, config) - } - - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return nil, err - } - defer cli.Close() - - if _, err = cli.NetworkCreate(context.Background(), name, options); err != nil { - return nil, err - } - - return getNetwork(name, false) -} - -func NetworkConnect(networkID, containerID string) error { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return err - } - defer cli.Close() - - return cli.NetworkConnect(context.Background(), networkID, containerID, nil) -} - -func NetworkDisconnect(networkID, containerID string) error { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return err - } - defer cli.Close() - - return cli.NetworkDisconnect(context.Background(), networkID, containerID, false) -} diff --git a/test/e2e/framework/event.go b/test/e2e/framework/event.go deleted file mode 100644 index 69b44d36d18..00000000000 --- a/test/e2e/framework/event.go +++ /dev/null @@ -1,55 +0,0 @@ -package framework - -import ( - "context" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/util/wait" - typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" -) - -type EventClient struct { - f *Framework - typedcorev1.EventInterface -} - -func (f *Framework) EventClient() *EventClient { - return &EventClient{ - f: f, - EventInterface: f.ClientSet.CoreV1().Events(f.Namespace.Name), - } -} - -// WaitToHaveEvent waits the provided resource to have the specified event(s) -func (c *EventClient) WaitToHaveEvent(kind, name, eventType, reason, sourceComponent, sourceHost string) []corev1.Event { - var result []corev1.Event - err := wait.Poll(poll, timeout, func() (bool, error) { - Logf("Waiting for %s %s/%s to have event %s/%s", kind, c.f.Namespace.Name, name, eventType, reason) - selector := fields.Set{ - "involvedObject.kind": kind, - "involvedObject.name": name, - "type": eventType, - "reason": reason, - } - - events, err := c.List(context.TODO(), metav1.ListOptions{FieldSelector: selector.AsSelector().String()}) - if err != nil { - return handleWaitingAPIError(err, true, "listing events") - } - for _, event := range events.Items { - if sourceComponent != "" && event.Source.Component != sourceComponent { - continue - } - if sourceHost != "" && event.Source.Host != sourceHost { - continue - } - result = append(result, event) - } - return len(result) != 0, nil - }) - - ExpectNoError(err) - return result -} diff --git a/test/e2e/framework/expect.go b/test/e2e/framework/expect.go deleted file mode 100644 index ffb99a0bc4b..00000000000 --- a/test/e2e/framework/expect.go +++ /dev/null @@ -1,177 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package framework - -import ( - "fmt" - "regexp" - - "github.com/onsi/ginkgo/v2" - "github.com/onsi/gomega" - "github.com/onsi/gomega/format" - - "github.com/kubeovn/kube-ovn/pkg/util" -) - -var ( - macRegex = regexp.MustCompile(`^([0-9A-Fa-f]{2}:){5}([0-9A-Fa-f]{2})$`) - uuidRegex = regexp.MustCompile(`^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$`) -) - -// ExpectEqual expects the specified two are the same, otherwise an exception raises -func ExpectEqual(actual interface{}, extra interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.Equal(extra), explain...) -} - -// ExpectNotEqual expects the specified two are not the same, otherwise an exception raises -func ExpectNotEqual(actual interface{}, extra interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).NotTo(gomega.Equal(extra), explain...) -} - -// ExpectError expects an error happens, otherwise an exception raises -func ExpectError(err error, explain ...interface{}) { - gomega.ExpectWithOffset(1, err).To(gomega.HaveOccurred(), explain...) -} - -// ExpectNoError checks if "err" is set, and if so, fails assertion while logging the error. -func ExpectNoError(err error, explain ...interface{}) { - ExpectNoErrorWithOffset(1, err, explain...) -} - -// ExpectNoErrorWithOffset checks if "err" is set, and if so, fails assertion while logging the error at "offset" levels above its caller -// (for example, for call chain f -> g -> ExpectNoErrorWithOffset(1, ...) error would be logged for "f"). -func ExpectNoErrorWithOffset(offset int, err error, explain ...interface{}) { - if err == nil { - return - } - - // Errors usually contain unexported fields. We have to use - // a formatter here which can print those. - prefix := "" - if len(explain) > 0 { - if str, ok := explain[0].(string); ok { - prefix = fmt.Sprintf(str, explain[1:]...) + ": " - } else { - prefix = fmt.Sprintf("unexpected explain arguments, need format string: %v", explain) - } - } - - // This intentionally doesn't use gomega.Expect. Instead we take - // full control over what information is presented where: - // - The complete error object is logged because it may contain - // additional information that isn't included in its error - // string. - // - It is not included in the failure message because - // it might make the failure message very large and/or - // cause error aggregation to work less well: two - // failures at the same code line might not be matched in - // https://go.k8s.io/triage because the error details are too - // different. - Logf("Unexpected error: %s\n%s", prefix, format.Object(err, 1)) - Fail(prefix+err.Error(), 1+offset) -} - -// ExpectConsistOf expects actual contains precisely the extra elements. -// The ordering of the elements does not matter. -func ExpectConsistOf(actual interface{}, extra interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.ConsistOf(extra), explain...) -} - -// ExpectContainElement expects actual contains the extra elements. -func ExpectContainElement(actual interface{}, extra interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.ContainElement(extra), explain...) -} - -// ExpectNotContainElement expects actual does not contain the extra elements. -func ExpectNotContainElement(actual interface{}, extra interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).NotTo(gomega.ContainElement(extra), explain...) -} - -// ExpectHaveKey expects the actual map has the key in the keyset -func ExpectHaveKey(actual interface{}, key interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.HaveKey(key), explain...) -} - -// ExpectHaveKeyWithValue expects the actual map has the passed in key/value pair. -func ExpectHaveKeyWithValue(actual interface{}, key, value interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.HaveKeyWithValue(key, value), explain...) -} - -// ExpectNotHaveKey expects the actual map does not have the key in the keyset -func ExpectNotHaveKey(actual interface{}, key interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).NotTo(gomega.HaveKey(key), explain...) -} - -// ExpectNil expects actual is nil -func ExpectNil(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.BeNil(), explain...) -} - -// ExpectNotNil expects actual is not nil -func ExpectNotNil(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).NotTo(gomega.BeNil(), explain...) -} - -// ExpectEmpty expects actual is empty -func ExpectEmpty(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.BeEmpty(), explain...) -} - -// ExpectNotEmpty expects actual is not empty -func ExpectNotEmpty(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).NotTo(gomega.BeEmpty(), explain...) -} - -// ExpectHaveLen expects actual has the passed-in length -func ExpectHaveLen(actual interface{}, count int, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.HaveLen(count), explain...) -} - -// ExpectTrue expects actual is true -func ExpectTrue(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.BeTrue(), explain...) -} - -// ExpectFalse expects actual is false -func ExpectFalse(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).NotTo(gomega.BeTrue(), explain...) -} - -// ExpectZero expects actual actual is the zero value for its type or actual is nil. -func ExpectZero(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).To(gomega.BeZero(), explain...) -} - -// ExpectNotZero expects actual is not nil nor the zero value for its type. -func ExpectNotZero(actual interface{}, explain ...interface{}) { - gomega.ExpectWithOffset(1, actual).NotTo(gomega.BeZero(), explain...) -} - -// ExpectUUID expects that the given string is an UUID. -func ExpectUUID(s string) { - ginkgo.By("verifying the string " + s + " is an UUID") - ExpectTrue(uuidRegex.MatchString(s)) -} - -// ExpectMAC expects that the given string is a MAC address. -func ExpectMAC(s string) { - ginkgo.By("verifying the string " + s + " is a MAC address") - ExpectTrue(macRegex.MatchString(s)) -} - -// ExpectIPInCIDR expects that the given IP address in within the CIDR. -func ExpectIPInCIDR(ip, cidr string) { - ginkgo.By("verifying IP address " + ip + " is within the CIDR " + cidr) - ExpectTrue(util.CIDRContainIP(cidr, ip)) -} diff --git a/test/e2e/framework/framework.go b/test/e2e/framework/framework.go deleted file mode 100644 index 3a03c6f349c..00000000000 --- a/test/e2e/framework/framework.go +++ /dev/null @@ -1,151 +0,0 @@ -package framework - -import ( - "fmt" - "os" - "strings" - "time" - - "k8s.io/client-go/tools/clientcmd" - "k8s.io/kubernetes/test/e2e/framework" - admissionapi "k8s.io/pod-security-admission/api" - - "github.com/onsi/ginkgo/v2" - - kubeovncs "github.com/kubeovn/kube-ovn/pkg/client/clientset/versioned" -) - -const ( - // poll is how often to Poll resources. - poll = 2 * time.Second - - timeout = 2 * time.Minute -) - -type Framework struct { - KubeContext string - *framework.Framework - KubeOVNClientSet kubeovncs.Interface - - // master/release-1.10/... - ClusterVersion string - // 999.999 for master - ClusterVersionMajor uint - ClusterVersionMinor uint - // ipv4/ipv6/dual - ClusterIpFamily string - // overlay/underlay/underlay-hairpin - ClusterNetworkMode string -} - -func NewDefaultFramework(baseName string) *Framework { - f := &Framework{ - Framework: framework.NewDefaultFramework(baseName), - } - f.NamespacePodSecurityEnforceLevel = admissionapi.LevelPrivileged - f.ClusterIpFamily = os.Getenv("E2E_IP_FAMILY") - f.ClusterVersion = os.Getenv("E2E_BRANCH") - f.ClusterNetworkMode = os.Getenv("E2E_NETWORK_MODE") - - if strings.HasPrefix(f.ClusterVersion, "release-") { - n, err := fmt.Sscanf(f.ClusterVersion, "release-%d.%d", &f.ClusterVersionMajor, &f.ClusterVersionMinor) - ExpectNoError(err) - ExpectEqual(n, 2) - } else { - f.ClusterVersionMajor, f.ClusterVersionMinor = 999, 999 - } - - ginkgo.BeforeEach(f.BeforeEach) - - return f -} - -func (f *Framework) useContext() error { - if f.KubeContext == "" { - return nil - } - - pathOptions := clientcmd.NewDefaultPathOptions() - pathOptions.GlobalFile = framework.TestContext.KubeConfig - pathOptions.EnvVar = "" - - config, err := pathOptions.GetStartingConfig() - if err != nil { - return err - } - - if config.CurrentContext != f.KubeContext { - Logf("Switching context to " + f.KubeContext) - config.CurrentContext = f.KubeContext - if err = clientcmd.ModifyConfig(pathOptions, *config, true); err != nil { - return err - } - } - - return nil -} - -func NewFrameworkWithContext(baseName, kubeContext string) *Framework { - f := &Framework{KubeContext: kubeContext} - ginkgo.BeforeEach(f.BeforeEach) - - f.Framework = framework.NewDefaultFramework(baseName) - f.NamespacePodSecurityEnforceLevel = admissionapi.LevelPrivileged - f.ClusterIpFamily = os.Getenv("E2E_IP_FAMILY") - f.ClusterVersion = os.Getenv("E2E_BRANCH") - f.ClusterNetworkMode = os.Getenv("E2E_NETWORK_MODE") - - ginkgo.BeforeEach(func() { - framework.TestContext.Host = "" - }) - - return f -} - -func (f *Framework) IPv6() bool { - return f.ClusterIpFamily == "ipv6" -} - -// BeforeEach gets a kube-ovn client -func (f *Framework) BeforeEach() { - ginkgo.By("Setting kubernetes context") - ExpectNoError(f.useContext()) - - if f.KubeOVNClientSet == nil { - ginkgo.By("Creating a Kube-OVN client") - config, err := framework.LoadConfig() - ExpectNoError(err) - - config.QPS = f.Options.ClientQPS - config.Burst = f.Options.ClientBurst - f.KubeOVNClientSet, err = kubeovncs.NewForConfig(config) - ExpectNoError(err) - } - - framework.TestContext.Host = "" -} - -func (f *Framework) SkipVersionPriorTo(major, minor uint, message string) { - if f.ClusterVersionMajor < major || - (f.ClusterVersionMajor == major && f.ClusterVersionMinor < minor) { - ginkgo.Skip(message) - } -} - -func Describe(text string, body func()) bool { - return ginkgo.Describe("[CNI:Kube-OVN] "+text, body) -} - -func SerialDescribe(text string, body func()) bool { - return ginkgo.Describe("[CNI:Kube-OVN] "+text, ginkgo.Serial, body) -} - -func OrderedDescribe(text string, body func()) bool { - return ginkgo.Describe("[CNI:Kube-OVN] "+text, ginkgo.Ordered, body) -} - -// ConformanceIt is wrapper function for ginkgo It. -// Adds "[Conformance]" tag and makes static analysis easier. -func ConformanceIt(text string, body interface{}) bool { - return ginkgo.It(text+" [Conformance]", ginkgo.Offset(1), body) -} diff --git a/test/e2e/framework/image.go b/test/e2e/framework/image.go deleted file mode 100644 index 83bdad7e26f..00000000000 --- a/test/e2e/framework/image.go +++ /dev/null @@ -1,7 +0,0 @@ -package framework - -const ( - PauseImage = "kubeovn/pause:3.2" - BusyBoxImage = "busybox:stable" - AgnhostImage = "kubeovn/agnhost:2.40" -) diff --git a/test/e2e/framework/iproute/iproute.go b/test/e2e/framework/iproute/iproute.go deleted file mode 100644 index 34ef7722b95..00000000000 --- a/test/e2e/framework/iproute/iproute.go +++ /dev/null @@ -1,166 +0,0 @@ -package iproute - -import ( - "encoding/json" - "fmt" - "net" - "reflect" - "strings" - - "github.com/kubeovn/kube-ovn/test/e2e/framework/docker" -) - -type LinkInfo struct { - InfoKind string `json:"info_kind"` -} - -type AddrInfo struct { - Family string `json:"family"` - Local string `json:"local"` - PrefixLen int `json:"prefixlen"` - Broadcast string `json:"broadcast,omitempty"` - Scope string `json:"scope"` - Label string `json:"label,omitempty"` - ValidLifeTime int64 `json:"valid_life_time"` - PreferredLifeTime int64 `json:"preferred_life_time"` - NoDAD bool `json:"nodad,omitempty"` -} - -type Link struct { - IfIndex int `json:"ifindex"` - LinkIndex int `json:"link_index"` - IfName string `json:"ifname"` - Flags []string `json:"flags"` - Mtu int `json:"mtu"` - Qdisc string `json:"qdisc"` - Master string `json:"master"` - OperState string `json:"operstate"` - Group string `json:"group"` - LinkType string `json:"link_type"` - Address string `json:"address"` - Broadcast string `json:"broadcast"` - LinkNetnsID int `json:"link_netnsid"` - Promiscuity int `json:"promiscuity"` - MinMtu int `json:"min_mtu"` - MaxMtu int `json:"max_mtu"` - LinkInfo LinkInfo `json:"linkinfo"` - NumTxQueues int `json:"num_tx_queues"` - NumRxQueues int `json:"num_rx_queues"` - GsoMaxSize int `json:"gso_max_size"` - GsoMaxSegs int `json:"gso_max_segs"` - AddrInfo []AddrInfo `json:"addr_info"` -} - -func (l *Link) NonLinkLocalAddresses() []string { - var result []string - for _, addr := range l.AddrInfo { - if !net.ParseIP(addr.Local).IsLinkLocalUnicast() { - result = append(result, fmt.Sprintf("%s/%d", addr.Local, addr.PrefixLen)) - } - } - return result -} - -type Route struct { - Type string `json:"type"` - Dst string `json:"dst"` - Gateway string `json:"gateway,omitempty"` - Dev string `json:"dev"` - Protocol string `json:"protocol"` - Scope string `json:"scope"` - Metric int `json:"metric"` - Flags []interface{} `json:"flags"` - PrefSrc string `json:"prefsrc,omitempty"` - Pref string `json:"pref"` -} - -type Rule struct { - Priority int `json:"priority"` - Src string `json:"src"` - Table string `json:"table"` - Protocol string `json:"protocol"` - SrcLen int `json:"srclen,omitempty"` -} - -type ExecFunc func(cmd ...string) (stdout, stderr []byte, err error) - -type execer struct { - fn ExecFunc - ignoredErrors []reflect.Type -} - -func (e *execer) exec(cmd string, result interface{}) error { - stdout, stderr, err := e.fn(strings.Fields(cmd)...) - if err != nil { - t := reflect.TypeOf(err) - for _, err := range e.ignoredErrors { - if t == err { - return nil - } - } - return fmt.Errorf("failed to exec cmd %q: %v\nstdout:\n%s\nstderr:\n%s", cmd, err, stdout, stderr) - } - - if err = json.Unmarshal(stdout, result); err != nil { - return fmt.Errorf("failed to decode json %q: %v", string(stdout), err) - } - - return nil -} - -func devArg(device string) string { - if device == "" { - return "" - } - return " dev " + device -} - -func AddressShow(device string, execFunc ExecFunc) ([]Link, error) { - var links []Link - e := execer{fn: execFunc} - if err := e.exec("ip -d -j address show"+devArg(device), &links); err != nil { - return nil, err - } - - return links, nil -} - -func RouteShow(table, device string, execFunc ExecFunc) ([]Route, error) { - e := execer{fn: execFunc} - var args string - if table != "" { - // ignore the following error: - // Error: ipv4/ipv6: FIB table does not exist. - // Dump terminated - e.ignoredErrors = append(e.ignoredErrors, reflect.TypeOf(docker.ErrNonZeroExitCode{})) - args = " table " + table - } - args += devArg(device) - - var routes []Route - if err := e.exec("ip -d -j route show"+args, &routes); err != nil { - return nil, err - } - - var routes6 []Route - if err := e.exec("ip -d -j -6 route show"+args, &routes6); err != nil { - return nil, err - } - - return append(routes, routes6...), nil -} - -func RuleShow(device string, execFunc ExecFunc) ([]Rule, error) { - e := execer{fn: execFunc} - - var rules []Rule - if err := e.exec("ip -d -j rule show"+devArg(device), &rules); err != nil { - return nil, err - } - - var rules6 []Rule - if err := e.exec("ip -d -j -6 rule show"+devArg(device), &rules6); err != nil { - return nil, err - } - return append(rules, rules6...), nil -} diff --git a/test/e2e/framework/kind/kind.go b/test/e2e/framework/kind/kind.go deleted file mode 100644 index e441d871a50..00000000000 --- a/test/e2e/framework/kind/kind.go +++ /dev/null @@ -1,176 +0,0 @@ -package kind - -import ( - "fmt" - "net" - "net/url" - "strings" - "time" - - "github.com/docker/docker/api/types" - "k8s.io/apimachinery/pkg/util/wait" - - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" - "github.com/kubeovn/kube-ovn/test/e2e/framework/docker" - "github.com/kubeovn/kube-ovn/test/e2e/framework/iproute" -) - -const NetworkName = "kind" - -const ( - labelCluster = "io.x-k8s.kind.cluster" - labelRole = "io.x-k8s.kind.role" -) - -type Node struct { - types.Container -} - -func (n *Node) Name() string { - return strings.TrimPrefix(n.Names[0], "/") -} - -func (n *Node) Exec(cmd ...string) (stdout, stderr []byte, err error) { - return docker.Exec(n.ID, nil, cmd...) -} - -func (n *Node) NetworkConnect(networkID string) error { - for _, settings := range n.NetworkSettings.Networks { - if settings.NetworkID == networkID { - return nil - } - } - return docker.NetworkConnect(networkID, n.ID) -} - -func (n *Node) NetworkDisconnect(networkID string) error { - for _, settings := range n.NetworkSettings.Networks { - if settings.NetworkID == networkID { - return docker.NetworkDisconnect(networkID, n.ID) - } - } - return nil -} - -func (n *Node) ListLinks() ([]iproute.Link, error) { - return iproute.AddressShow("", n.Exec) -} - -func (n *Node) ListRoutes(nonLinkLocalUnicast bool) ([]iproute.Route, error) { - routes, err := iproute.RouteShow("", "", n.Exec) - if err != nil { - return nil, err - } - - if !nonLinkLocalUnicast { - return routes, nil - } - - result := make([]iproute.Route, 0, len(routes)) - for _, route := range routes { - if route.Dst == "default" { - result = append(result, route) - } - if ip := net.ParseIP(strings.Split(route.Dst, "/")[0]); !ip.IsLinkLocalUnicast() { - result = append(result, route) - } - } - return result, nil -} - -func (n *Node) WaitLinkToDisappear(linkName string, interval time.Duration, deadline time.Time) error { - err := wait.PollImmediate(interval, time.Until(deadline), func() (bool, error) { - framework.Logf("Waiting for link %s in node %s to disappear", linkName, n.Name()) - links, err := n.ListLinks() - if err != nil { - return false, err - } - for _, link := range links { - if link.IfName == linkName { - framework.Logf("link %s still exists", linkName) - return false, nil - } - } - framework.Logf("link %s no longer exists", linkName) - return true, nil - }) - if err == nil { - return nil - } - if framework.IsTimeout(err) { - return framework.TimeoutError(fmt.Sprintf("timed out while waiting for link %s in node %s to disappear", linkName, n.Name())) - } - - return err -} - -func ListClusters() ([]string, error) { - filters := map[string][]string{"label": {labelCluster}} - nodeList, err := docker.ContainerList(filters) - if err != nil { - return nil, err - } - - var clusters []string - for _, node := range nodeList { - if cluster := node.Labels[labelCluster]; !util.ContainsString(clusters, cluster) { - clusters = append(clusters, node.Labels[labelCluster]) - } - } - - return clusters, nil -} - -func ListNodes(cluster, role string) ([]Node, error) { - labels := []string{labelCluster + "=" + cluster} - if role != "" { - // control-plane or worker - labels = append(labels, labelRole+"="+role) - } - - filters := map[string][]string{"label": labels} - nodeList, err := docker.ContainerList(filters) - if err != nil { - return nil, err - } - - nodes := make([]Node, 0, len(nodeList)) - for _, node := range nodeList { - nodes = append(nodes, Node{node}) - } - - return nodes, nil -} - -func IsKindProvided(providerID string) (string, bool) { - // kind://docker/kube-ovn/kube-ovn-control-plane - u, err := url.Parse(providerID) - if err != nil || u.Scheme != "kind" || u.Host != "docker" { - return "", false - } - - fields := strings.Split(strings.Trim(u.Path, "/"), "/") - if len(fields) != 2 { - return "", false - } - return fields[0], true -} - -func NetworkConnect(networkID string, nodes []Node) error { - for _, node := range nodes { - if err := node.NetworkConnect(networkID); err != nil { - return err - } - } - return nil -} - -func NetworkDisconnect(networkID string, nodes []Node) error { - for _, node := range nodes { - if err := node.NetworkDisconnect(networkID); err != nil { - return err - } - } - return nil -} diff --git a/test/e2e/framework/kube-ovn.go b/test/e2e/framework/kube-ovn.go deleted file mode 100644 index 212557dd7ad..00000000000 --- a/test/e2e/framework/kube-ovn.go +++ /dev/null @@ -1,23 +0,0 @@ -package framework - -import ( - "context" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clientset "k8s.io/client-go/kubernetes" -) - -func GetKubeOvnImage(cs clientset.Interface) string { - ds, err := cs.AppsV1().DaemonSets(KubeOvnNamespace).Get(context.TODO(), DaemonSetOvsOvn, metav1.GetOptions{}) - ExpectNoError(err, "getting daemonset %s/%s", KubeOvnNamespace, DaemonSetOvsOvn) - return ds.Spec.Template.Spec.Containers[0].Image -} - -func GetOvsPodOnNode(cs clientset.Interface, node string) *corev1.Pod { - ds, err := cs.AppsV1().DaemonSets(KubeOvnNamespace).Get(context.TODO(), DaemonSetOvsOvn, metav1.GetOptions{}) - ExpectNoError(err, "getting daemonset %s/%s", KubeOvnNamespace, DaemonSetOvsOvn) - ovsPod, err := GetPodOnNodeForDaemonSet(cs, ds, node) - ExpectNoError(err, "getting daemonset %s/%s running on node %s", KubeOvnNamespace, DaemonSetOvsOvn, node) - return ovsPod -} diff --git a/test/e2e/framework/kubectl.go b/test/e2e/framework/kubectl.go deleted file mode 100644 index eb7f242d5c4..00000000000 --- a/test/e2e/framework/kubectl.go +++ /dev/null @@ -1,18 +0,0 @@ -package framework - -import ( - "fmt" - "strings" - - e2epodoutput "k8s.io/kubernetes/test/e2e/framework/pod/output" -) - -func KubectlExec(namespace, pod string, cmd ...string) (stdout, stderr []byte, err error) { - c := strings.Join(cmd, " ") - outStr, errStr, err := e2epodoutput.RunHostCmdWithFullOutput(namespace, pod, c) - if err != nil { - return nil, nil, fmt.Errorf("failed to exec cmd %q in pod %s/%s: %v\nstderr:\n%s", c, namespace, pod, err, errStr) - } - - return []byte(outStr), []byte(errStr), nil -} diff --git a/test/e2e/framework/log.go b/test/e2e/framework/log.go deleted file mode 100644 index 51b4260cc7e..00000000000 --- a/test/e2e/framework/log.go +++ /dev/null @@ -1,101 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package framework - -import ( - "bytes" - "fmt" - "regexp" - "runtime/debug" - "time" - - "github.com/onsi/ginkgo/v2" -) - -func nowStamp() string { - return time.Now().Format(time.StampMilli) -} - -func log(level string, format string, args ...interface{}) { - fmt.Fprintf(ginkgo.GinkgoWriter, nowStamp()+": "+level+": "+format+"\n", args...) -} - -// Logf logs the info. -func Logf(format string, args ...interface{}) { - log("INFO", format, args...) -} - -// Failf logs the fail info, including a stack trace starts with its direct caller -// (for example, for call chain f -> g -> Failf("foo", ...) error would be logged for "g"). -func Failf(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - skip := 1 - log("FAIL", "%s\n\nFull Stack Trace\n%s", msg, PrunedStack(skip)) - ginkgo.Fail(nowStamp()+": "+msg, skip) - panic("unreachable") -} - -// Fail is a replacement for ginkgo.Fail which logs the problem as it occurs -// together with a stack trace and then calls ginkgowrapper.Fail. -func Fail(msg string, callerSkip ...int) { - skip := 1 - if len(callerSkip) > 0 { - skip += callerSkip[0] - } - log("FAIL", "%s\n\nFull Stack Trace\n%s", msg, PrunedStack(skip)) - ginkgo.Fail(nowStamp()+": "+msg, skip) -} - -var codeFilterRE = regexp.MustCompile(`/github.com/onsi/ginkgo/v2/`) - -// PrunedStack is a wrapper around debug.Stack() that removes information -// about the current goroutine and optionally skips some of the initial stack entries. -// With skip == 0, the returned stack will start with the caller of PruneStack. -// From the remaining entries it automatically filters out useless ones like -// entries coming from Ginkgo. -// -// This is a modified copy of PruneStack in https://github.com/onsi/ginkgo/v2/blob/f90f37d87fa6b1dd9625e2b1e83c23ffae3de228/internal/codelocation/code_location.go#L25: -// - simplified API and thus renamed (calls debug.Stack() instead of taking a parameter) -// - source code filtering updated to be specific to Kubernetes -// - optimized to use bytes and in-place slice filtering from -// https://github.com/golang/go/wiki/SliceTricks#filter-in-place -func PrunedStack(skip int) []byte { - fullStackTrace := debug.Stack() - stack := bytes.Split(fullStackTrace, []byte("\n")) - // Ensure that the even entries are the method names and - // the odd entries the source code information. - if len(stack) > 0 && bytes.HasPrefix(stack[0], []byte("goroutine ")) { - // Ignore "goroutine 29 [running]:" line. - stack = stack[1:] - } - // The "+2" is for skipping over: - // - runtime/debug.Stack() - // - PrunedStack() - skip += 2 - if len(stack) > 2*skip { - stack = stack[2*skip:] - } - n := 0 - for i := 0; i < len(stack)/2; i++ { - // We filter out based on the source code file name. - if !codeFilterRE.Match([]byte(stack[i*2+1])) { - stack[n] = stack[i*2] - stack[n+1] = stack[i*2+1] - n += 2 - } - } - stack = stack[:n] - - return bytes.Join(stack, []byte("\n")) -} diff --git a/test/e2e/framework/pod.go b/test/e2e/framework/pod.go deleted file mode 100644 index 5778231a12f..00000000000 --- a/test/e2e/framework/pod.go +++ /dev/null @@ -1,79 +0,0 @@ -package framework - -import ( - "context" - "time" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - - "github.com/kubeovn/kube-ovn/pkg/util" -) - -type PodClient struct { - *e2epod.PodClient -} - -func (f *Framework) PodClient() *PodClient { - return &PodClient{e2epod.NewPodClient(f.Framework)} -} - -func (c *PodClient) DeleteSync(name string) { - c.PodClient.DeleteSync(name, metav1.DeleteOptions{}, timeout) -} - -func (c *PodClient) PatchPod(original, modified *corev1.Pod) *corev1.Pod { - patch, err := util.GenerateMergePatchPayload(original, modified) - ExpectNoError(err) - - var patchedPod *corev1.Pod - err = wait.PollImmediate(2*time.Second, timeout, func() (bool, error) { - p, err := c.PodInterface.Patch(context.TODO(), original.Name, types.StrategicMergePatchType, patch, metav1.PatchOptions{}, "") - if err != nil { - return handleWaitingAPIError(err, false, "patch pod %s/%s", original.Namespace, original.Name) - } - patchedPod = p - return true, nil - }) - if err == nil { - return patchedPod.DeepCopy() - } - - if IsTimeout(err) { - Failf("timed out while retrying to patch pod %s/%s", original.Namespace, original.Name) - } - ExpectNoError(maybeTimeoutError(err, "patching pod %s/%s", original.Namespace, original.Name)) - - return nil -} - -func MakePod(ns, name string, labels, annotations map[string]string, image string, command, args []string) *corev1.Pod { - if image == "" { - image = PauseImage - } - - pod := &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: ns, - Labels: labels, - Annotations: annotations, - }, - Spec: corev1.PodSpec{ - Containers: []corev1.Container{ - { - Name: "container", - Image: image, - ImagePullPolicy: corev1.PullIfNotPresent, - Command: command, - Args: args, - }, - }, - }, - } - - return pod -} diff --git a/test/e2e/framework/provider-network.go b/test/e2e/framework/provider-network.go deleted file mode 100644 index d2fea662158..00000000000 --- a/test/e2e/framework/provider-network.go +++ /dev/null @@ -1,226 +0,0 @@ -package framework - -import ( - "context" - "fmt" - "math/big" - "time" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - - "github.com/onsi/gomega" - - apiv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" - v1 "github.com/kubeovn/kube-ovn/pkg/client/clientset/versioned/typed/kubeovn/v1" - "github.com/kubeovn/kube-ovn/pkg/util" -) - -// ProviderNetworkClient is a struct for provider network client. -type ProviderNetworkClient struct { - f *Framework - v1.ProviderNetworkInterface -} - -func (f *Framework) ProviderNetworkClient() *ProviderNetworkClient { - return &ProviderNetworkClient{ - f: f, - ProviderNetworkInterface: f.KubeOVNClientSet.KubeovnV1().ProviderNetworks(), - } -} - -func (s *ProviderNetworkClient) Get(name string) *apiv1.ProviderNetwork { - pn, err := s.ProviderNetworkInterface.Get(context.TODO(), name, metav1.GetOptions{}) - ExpectNoError(err) - return pn -} - -// Create creates a new provider network according to the framework specifications -func (c *ProviderNetworkClient) Create(pn *apiv1.ProviderNetwork) *apiv1.ProviderNetwork { - pn, err := c.ProviderNetworkInterface.Create(context.TODO(), pn, metav1.CreateOptions{}) - ExpectNoError(err, "Error creating provider network") - return pn.DeepCopy() -} - -// CreateSync creates a new provider network according to the framework specifications, and waits for it to be ready. -func (c *ProviderNetworkClient) CreateSync(pn *apiv1.ProviderNetwork) *apiv1.ProviderNetwork { - pn = c.Create(pn) - ExpectTrue(c.WaitToBeReady(pn.Name, timeout)) - // Get the newest provider network after it becomes ready - return c.Get(pn.Name).DeepCopy() -} - -// Patch patches the provider network -func (c *ProviderNetworkClient) Patch(original, modified *apiv1.ProviderNetwork) *apiv1.ProviderNetwork { - patch, err := util.GenerateMergePatchPayload(original, modified) - ExpectNoError(err) - - var patchedProviderNetwork *apiv1.ProviderNetwork - err = wait.PollImmediate(2*time.Second, timeout, func() (bool, error) { - pn, err := c.ProviderNetworkInterface.Patch(context.TODO(), original.Name, types.MergePatchType, patch, metav1.PatchOptions{}, "") - if err != nil { - return handleWaitingAPIError(err, false, "patch provider network %q", original.Name) - } - patchedProviderNetwork = pn - return true, nil - }) - if err == nil { - return patchedProviderNetwork.DeepCopy() - } - - if IsTimeout(err) { - Failf("timed out while retrying to patch provider network %s", original.Name) - } - ExpectNoError(maybeTimeoutError(err, "patching provider network %s", original.Name)) - - return nil -} - -// PatchSync patches the provider network and waits for the provider network to be ready for `timeout`. -// If the provider network doesn't become ready before the timeout, it will fail the test. -func (c *ProviderNetworkClient) PatchSync(original, modified *apiv1.ProviderNetwork, requiredNodes []string, timeout time.Duration) *apiv1.ProviderNetwork { - pn := c.Patch(original, modified) - ExpectTrue(c.WaitToBeUpdated(pn, timeout)) - ExpectTrue(c.WaitToBeReady(pn.Name, timeout)) - // Get the newest subnet after it becomes ready - return c.Get(pn.Name).DeepCopy() -} - -// Delete deletes a provider network if the provider network exists -func (c *ProviderNetworkClient) Delete(name string) { - err := c.ProviderNetworkInterface.Delete(context.TODO(), name, metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - Failf("Failed to delete provider network %q: %v", name, err) - } -} - -// DeleteSync deletes the provider network and waits for the provider network to disappear for `timeout`. -// If the provider network doesn't disappear before the timeout, it will fail the test. -func (c *ProviderNetworkClient) DeleteSync(name string) { - c.Delete(name) - gomega.Expect(c.WaitToDisappear(name, 2*time.Second, timeout)).To(gomega.Succeed(), "wait for provider network %q to disappear", name) -} - -func isProviderNetworkConditionSetAsExpected(pn *apiv1.ProviderNetwork, node string, conditionType apiv1.ConditionType, wantTrue, silent bool) bool { - for _, cond := range pn.Status.Conditions { - if cond.Node == node && cond.Type == conditionType { - if (wantTrue && (cond.Status == corev1.ConditionTrue)) || (!wantTrue && (cond.Status != corev1.ConditionTrue)) { - return true - } - if !silent { - Logf("Condition %s for node %s of provider network %s is %v instead of %t. Reason: %v, message: %v", - conditionType, node, pn.Name, cond.Status == corev1.ConditionTrue, wantTrue, cond.Reason, cond.Message) - } - return false - } - } - if !silent { - Logf("Couldn't find condition %v of node %s on provider network %v", conditionType, node, pn.Name) - } - return false -} - -// IsProviderNetworkConditionSetAsExpected returns a wantTrue value if the subnet has a match to the conditionType, -// otherwise returns an opposite value of the wantTrue with detailed logging. -func IsProviderNetworkConditionSetAsExpected(pn *apiv1.ProviderNetwork, node string, conditionType apiv1.ConditionType, wantTrue bool) bool { - return isProviderNetworkConditionSetAsExpected(pn, node, conditionType, wantTrue, false) -} - -// WaitConditionToBe returns whether provider network "name's" condition state matches wantTrue -// within timeout. If wantTrue is true, it will ensure the provider network condition status is -// ConditionTrue; if it's false, it ensures the provider network condition is in any state other -// than ConditionTrue (e.g. not true or unknown). -func (c *ProviderNetworkClient) WaitConditionToBe(name, node string, conditionType apiv1.ConditionType, wantTrue bool, deadline time.Time) bool { - timeout := time.Until(deadline) - Logf("Waiting up to %v for provider network %s condition %s of node %s to be %t", timeout, name, conditionType, node, wantTrue) - for ; time.Now().Before(deadline); time.Sleep(poll) { - if pn := c.Get(name); IsProviderNetworkConditionSetAsExpected(pn, node, conditionType, wantTrue) { - return true - } - } - Logf("ProviderNetwork %s didn't reach desired %s condition status (%t) within %v", name, conditionType, wantTrue, timeout) - return false -} - -// WaitToBeReady returns whether the provider network is ready within timeout. -func (c *ProviderNetworkClient) WaitToBeReady(name string, timeout time.Duration) bool { - for start := time.Now(); time.Since(start) < timeout; time.Sleep(poll) { - if c.Get(name).Status.Ready { - return true - } - } - return false -} - -// WaitToBeUpdated returns whether the provider network is updated within timeout. -func (c *ProviderNetworkClient) WaitToBeUpdated(pn *apiv1.ProviderNetwork, timeout time.Duration) bool { - Logf("Waiting up to %v for provider network %s to be updated", timeout, pn.Name) - rv, _ := big.NewInt(0).SetString(pn.ResourceVersion, 10) - for start := time.Now(); time.Since(start) < timeout; time.Sleep(poll) { - s := c.Get(pn.Name) - if current, _ := big.NewInt(0).SetString(s.ResourceVersion, 10); current.Cmp(rv) > 0 { - return true - } - } - Logf("ProviderNetwork %s was not updated within %v", pn.Name, timeout) - return false -} - -// WaitToDisappear waits the given timeout duration for the specified provider network to disappear. -func (c *ProviderNetworkClient) WaitToDisappear(name string, interval, timeout time.Duration) error { - var lastProviderNetwork *apiv1.ProviderNetwork - err := wait.PollImmediate(interval, timeout, func() (bool, error) { - Logf("Waiting for provider network %s to disappear", name) - subnets, err := c.List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return handleWaitingAPIError(err, true, "listing subnets") - } - found := false - for i, subnet := range subnets.Items { - if subnet.Name == name { - Logf("Provider network %s still exists", name) - found = true - lastProviderNetwork = &(subnets.Items[i]) - break - } - } - if !found { - Logf("Provider network %s no longer exists", name) - return true, nil - } - return false, nil - }) - if err == nil { - return nil - } - if IsTimeout(err) { - return TimeoutError(fmt.Sprintf("timed out while waiting for subnet %s to disappear", name), - lastProviderNetwork, - ) - } - return maybeTimeoutError(err, "waiting for subnet %s to disappear", name) -} - -func MakeProviderNetwork(name string, exchangeLinkName bool, defaultInterface string, customInterfaces map[string][]string, excludeNodes []string) *apiv1.ProviderNetwork { - pn := &apiv1.ProviderNetwork{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: apiv1.ProviderNetworkSpec{ - DefaultInterface: defaultInterface, - ExcludeNodes: excludeNodes, - ExchangeLinkName: exchangeLinkName, - }, - } - for iface, nodes := range customInterfaces { - ci := apiv1.CustomInterface{ - Interface: iface, - Nodes: nodes, - } - pn.Spec.CustomInterfaces = append(pn.Spec.CustomInterfaces, ci) - } - return pn -} diff --git a/test/e2e/framework/service.go b/test/e2e/framework/service.go deleted file mode 100644 index cff7c2d456b..00000000000 --- a/test/e2e/framework/service.go +++ /dev/null @@ -1,131 +0,0 @@ -package framework - -import ( - "context" - "fmt" - "math/big" - "time" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - v1core "k8s.io/client-go/kubernetes/typed/core/v1" - - "github.com/onsi/gomega" -) - -// ServiceClient is a struct for service client. -type ServiceClient struct { - f *Framework - v1core.ServiceInterface -} - -func (f *Framework) ServiceClient() *ServiceClient { - return &ServiceClient{ - f: f, - ServiceInterface: f.ClientSet.CoreV1().Services(f.Namespace.Name), - } -} - -func (s *ServiceClient) Get(name string) *corev1.Service { - service, err := s.ServiceInterface.Get(context.TODO(), name, metav1.GetOptions{}) - ExpectNoError(err) - return service -} - -// Create creates a new service according to the framework specifications -func (c *ServiceClient) Create(service *corev1.Service) *corev1.Service { - s, err := c.ServiceInterface.Create(context.TODO(), service, metav1.CreateOptions{}) - ExpectNoError(err, "Error creating service") - return s.DeepCopy() -} - -// CreateSync creates a new service according to the framework specifications, and waits for it to be updated. -func (c *ServiceClient) CreateSync(service *corev1.Service) *corev1.Service { - s := c.Create(service) - ExpectTrue(c.WaitToBeUpdated(s)) - // Get the newest service - return c.Get(s.Name).DeepCopy() -} - -// Delete deletes a service if the service exists -func (c *ServiceClient) Delete(name string) { - err := c.ServiceInterface.Delete(context.TODO(), name, metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - Failf("Failed to delete service %q: %v", name, err) - } -} - -// DeleteSync deletes the service and waits for the service to disappear for `timeout`. -// If the service doesn't disappear before the timeout, it will fail the test. -func (c *ServiceClient) DeleteSync(name string) { - c.Delete(name) - gomega.Expect(c.WaitToDisappear(name, 2*time.Second, timeout)).To(gomega.Succeed(), "wait for service %q to disappear", name) -} - -// WaitToBeUpdated returns whether the service is updated within timeout. -func (c *ServiceClient) WaitToBeUpdated(service *corev1.Service) bool { - Logf("Waiting up to %v for service %s to be updated", timeout, service.Name) - rv, _ := big.NewInt(0).SetString(service.ResourceVersion, 10) - for start := time.Now(); time.Since(start) < timeout; time.Sleep(poll) { - s := c.Get(service.Name) - if current, _ := big.NewInt(0).SetString(s.ResourceVersion, 10); current.Cmp(rv) > 0 { - return true - } - } - Logf("Service %s was not updated within %v", service.Name, timeout) - return false -} - -// WaitToDisappear waits the given timeout duration for the specified service to disappear. -func (c *ServiceClient) WaitToDisappear(name string, interval, timeout time.Duration) error { - var lastService *corev1.Service - err := wait.PollImmediate(interval, timeout, func() (bool, error) { - Logf("Waiting for service %s to disappear", name) - services, err := c.List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return handleWaitingAPIError(err, true, "listing services") - } - found := false - for i, service := range services.Items { - if service.Name == name { - Logf("Service %s still exists", name) - found = true - lastService = &(services.Items[i]) - break - } - } - if !found { - Logf("Service %s no longer exists", name) - return true, nil - } - return false, nil - }) - if err == nil { - return nil - } - if IsTimeout(err) { - return TimeoutError(fmt.Sprintf("timed out while waiting for service %s to disappear", name), - lastService, - ) - } - return maybeTimeoutError(err, "waiting for service %s to disappear", name) -} - -func MakeService(name string, svcType corev1.ServiceType, annotations, selector map[string]string, ports []corev1.ServicePort, affinity corev1.ServiceAffinity) *corev1.Service { - service := &corev1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Annotations: annotations, - }, - Spec: corev1.ServiceSpec{ - Ports: ports, - Selector: selector, - SessionAffinity: affinity, - Type: svcType, - }, - } - - return service -} diff --git a/test/e2e/framework/subnet.go b/test/e2e/framework/subnet.go deleted file mode 100644 index b0c0f46fb91..00000000000 --- a/test/e2e/framework/subnet.go +++ /dev/null @@ -1,258 +0,0 @@ -package framework - -import ( - "context" - "fmt" - "math/big" - "strings" - "time" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - - "github.com/onsi/gomega" - - apiv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" - v1 "github.com/kubeovn/kube-ovn/pkg/client/clientset/versioned/typed/kubeovn/v1" - "github.com/kubeovn/kube-ovn/pkg/util" -) - -// SubnetClient is a struct for subnet client. -type SubnetClient struct { - f *Framework - v1.SubnetInterface -} - -func (f *Framework) SubnetClient() *SubnetClient { - return &SubnetClient{ - f: f, - SubnetInterface: f.KubeOVNClientSet.KubeovnV1().Subnets(), - } -} - -func (s *SubnetClient) Get(name string) *apiv1.Subnet { - subnet, err := s.SubnetInterface.Get(context.TODO(), name, metav1.GetOptions{}) - ExpectNoError(err) - return subnet -} - -// Create creates a new subnet according to the framework specifications -func (c *SubnetClient) Create(subnet *apiv1.Subnet) *apiv1.Subnet { - s, err := c.SubnetInterface.Create(context.TODO(), subnet, metav1.CreateOptions{}) - ExpectNoError(err, "Error creating subnet") - return s.DeepCopy() -} - -// CreateSync creates a new subnet according to the framework specifications, and waits for it to be ready. -func (c *SubnetClient) CreateSync(subnet *apiv1.Subnet) *apiv1.Subnet { - s := c.Create(subnet) - ExpectTrue(c.WaitToBeReady(s.Name, timeout)) - // Get the newest subnet after it becomes ready - return c.Get(s.Name).DeepCopy() -} - -// Update updates the subnet -func (c *SubnetClient) Update(subnet *apiv1.Subnet, options metav1.UpdateOptions, timeout time.Duration) *apiv1.Subnet { - var updatedSubnet *apiv1.Subnet - err := wait.PollImmediate(2*time.Second, timeout, func() (bool, error) { - s, err := c.SubnetInterface.Update(context.TODO(), subnet, options) - if err != nil { - return handleWaitingAPIError(err, false, "update subnet %q", subnet.Name) - } - updatedSubnet = s - return true, nil - }) - if err == nil { - return updatedSubnet.DeepCopy() - } - - if IsTimeout(err) { - Failf("timed out while retrying to update subnet %s", subnet.Name) - } - ExpectNoError(maybeTimeoutError(err, "updating subnet %s", subnet.Name)) - - return nil -} - -// UpdateSync updates the subnet and waits for the subnet to be ready for `timeout`. -// If the subnet doesn't become ready before the timeout, it will fail the test. -func (c *SubnetClient) UpdateSync(subnet *apiv1.Subnet, options metav1.UpdateOptions, timeout time.Duration) *apiv1.Subnet { - s := c.Update(subnet, options, timeout) - ExpectTrue(c.WaitToBeUpdated(s, timeout)) - ExpectTrue(c.WaitToBeReady(s.Name, timeout)) - // Get the newest subnet after it becomes ready - return c.Get(s.Name).DeepCopy() -} - -// Patch patches the subnet -func (c *SubnetClient) Patch(original, modified *apiv1.Subnet, timeout time.Duration) *apiv1.Subnet { - patch, err := util.GenerateMergePatchPayload(original, modified) - ExpectNoError(err) - - var patchedSubnet *apiv1.Subnet - err = wait.PollImmediate(2*time.Second, timeout, func() (bool, error) { - s, err := c.SubnetInterface.Patch(context.TODO(), original.Name, types.MergePatchType, patch, metav1.PatchOptions{}, "") - if err != nil { - return handleWaitingAPIError(err, false, "patch subnet %q", original.Name) - } - patchedSubnet = s - return true, nil - }) - if err == nil { - return patchedSubnet.DeepCopy() - } - - if IsTimeout(err) { - Failf("timed out while retrying to patch subnet %s", original.Name) - } - ExpectNoError(maybeTimeoutError(err, "patching subnet %s", original.Name)) - - return nil -} - -// PatchSync patches the subnet and waits for the subnet to be ready for `timeout`. -// If the subnet doesn't become ready before the timeout, it will fail the test. -func (c *SubnetClient) PatchSync(original, modified *apiv1.Subnet) *apiv1.Subnet { - s := c.Patch(original, modified, timeout) - ExpectTrue(c.WaitToBeUpdated(s, timeout)) - ExpectTrue(c.WaitToBeReady(s.Name, timeout)) - // Get the newest subnet after it becomes ready - return c.Get(s.Name).DeepCopy() -} - -// Delete deletes a subnet if the subnet exists -func (c *SubnetClient) Delete(name string) { - err := c.SubnetInterface.Delete(context.TODO(), name, metav1.DeleteOptions{}) - if err != nil && !apierrors.IsNotFound(err) { - Failf("Failed to delete subnet %q: %v", name, err) - } -} - -// DeleteSync deletes the subnet and waits for the subnet to disappear for `timeout`. -// If the subnet doesn't disappear before the timeout, it will fail the test. -func (c *SubnetClient) DeleteSync(name string) { - c.Delete(name) - gomega.Expect(c.WaitToDisappear(name, 2*time.Second, timeout)).To(gomega.Succeed(), "wait for subnet %q to disappear", name) -} - -func isSubnetConditionSetAsExpected(subnet *apiv1.Subnet, conditionType apiv1.ConditionType, wantTrue, silent bool) bool { - for _, cond := range subnet.Status.Conditions { - if cond.Type == conditionType { - if (wantTrue && (cond.Status == corev1.ConditionTrue)) || (!wantTrue && (cond.Status != corev1.ConditionTrue)) { - return true - } - if !silent { - Logf("Condition %s of subnet %s is %v instead of %t. Reason: %v, message: %v", - conditionType, subnet.Name, cond.Status == corev1.ConditionTrue, wantTrue, cond.Reason, cond.Message) - } - return false - } - } - if !silent { - Logf("Couldn't find condition %v on subnet %v", conditionType, subnet.Name) - } - return false -} - -// IsSubnetConditionSetAsExpected returns a wantTrue value if the subnet has a match to the conditionType, -// otherwise returns an opposite value of the wantTrue with detailed logging. -func IsSubnetConditionSetAsExpected(subnet *apiv1.Subnet, conditionType apiv1.ConditionType, wantTrue bool) bool { - return isSubnetConditionSetAsExpected(subnet, conditionType, wantTrue, false) -} - -// WaitConditionToBe returns whether subnet "name's" condition state matches wantTrue -// within timeout. If wantTrue is true, it will ensure the subnet condition status is -// ConditionTrue; if it's false, it ensures the subnet condition is in any state other -// than ConditionTrue (e.g. not true or unknown). -func (c *SubnetClient) WaitConditionToBe(name string, conditionType apiv1.ConditionType, wantTrue bool, timeout time.Duration) bool { - Logf("Waiting up to %v for subnet %s condition %s to be %t", timeout, name, conditionType, wantTrue) - for start := time.Now(); time.Since(start) < timeout; time.Sleep(poll) { - subnet := c.Get(name) - if IsSubnetConditionSetAsExpected(subnet, conditionType, wantTrue) { - return true - } - } - Logf("Subnet %s didn't reach desired %s condition status (%t) within %v", name, conditionType, wantTrue, timeout) - return false -} - -// WaitToBeReady returns whether the subnet is ready within timeout. -func (c *SubnetClient) WaitToBeReady(name string, timeout time.Duration) bool { - return c.WaitConditionToBe(name, apiv1.Ready, true, timeout) -} - -// WaitToBeUpdated returns whether the subnet is updated within timeout. -func (c *SubnetClient) WaitToBeUpdated(subnet *apiv1.Subnet, timeout time.Duration) bool { - Logf("Waiting up to %v for subnet %s to be updated", timeout, subnet.Name) - rv, _ := big.NewInt(0).SetString(subnet.ResourceVersion, 10) - for start := time.Now(); time.Since(start) < timeout; time.Sleep(poll) { - s := c.Get(subnet.Name) - if current, _ := big.NewInt(0).SetString(s.ResourceVersion, 10); current.Cmp(rv) > 0 { - return true - } - } - Logf("Subnet %s was not updated within %v", subnet.Name, timeout) - return false -} - -// WaitToDisappear waits the given timeout duration for the specified subnet to disappear. -func (c *SubnetClient) WaitToDisappear(name string, interval, timeout time.Duration) error { - var lastSubnet *apiv1.Subnet - err := wait.PollImmediate(interval, timeout, func() (bool, error) { - Logf("Waiting for subnet %s to disappear", name) - subnets, err := c.List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return handleWaitingAPIError(err, true, "listing subnets") - } - found := false - for i, subnet := range subnets.Items { - if subnet.Name == name { - Logf("Subnet %s still exists", name) - found = true - lastSubnet = &(subnets.Items[i]) - break - } - } - if !found { - Logf("Subnet %s no longer exists", name) - return true, nil - } - return false, nil - }) - if err == nil { - return nil - } - if IsTimeout(err) { - return TimeoutError(fmt.Sprintf("timed out while waiting for subnet %s to disappear", name), - lastSubnet, - ) - } - return maybeTimeoutError(err, "waiting for subnet %s to disappear", name) -} - -func MakeSubnet(name, vlan, cidr, gateway string, excludeIPs, gatewayNodes, namespaces []string) *apiv1.Subnet { - subnet := &apiv1.Subnet{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: apiv1.SubnetSpec{ - Vlan: vlan, - CIDRBlock: cidr, - Gateway: gateway, - Protocol: util.CheckProtocol(cidr), - ExcludeIps: excludeIPs, - GatewayNode: strings.Join(gatewayNodes, ","), - Namespaces: namespaces, - }, - } - if len(gatewayNodes) != 0 { - subnet.Spec.GatewayType = apiv1.GWCentralizedType - } else { - subnet.Spec.GatewayType = apiv1.GWDistributedType - } - - return subnet -} diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go deleted file mode 100644 index c8b901afcd0..00000000000 --- a/test/e2e/framework/util.go +++ /dev/null @@ -1,137 +0,0 @@ -package framework - -import ( - "fmt" - "math/big" - "math/rand" - "net" - "sort" - "strings" - "time" - - "github.com/kubeovn/kube-ovn/pkg/util" -) - -const ( - KubeOvnNamespace = "kube-system" - DaemonSetOvsOvn = "ovs-ovn" -) - -func init() { - rand.Seed(time.Now().UnixNano()) -} - -// RandomSuffix provides a random sequence to append to resources. -func RandomSuffix() string { - return fmt.Sprintf("%04d", rand.Intn(10000)) -} - -func RandomCIDR(family string) string { - fnIPv4 := func() string { - cidr := net.IPNet{ - IP: net.ParseIP("10.99.0.0").To4(), - Mask: net.CIDRMask(24, 32), - } - cidr.IP[2] = byte(rand.Intn(0xff + 1)) - return cidr.String() - } - - fnIPv6 := func() string { - cidr := net.IPNet{ - IP: net.ParseIP("fc00:10:ff::").To16(), - Mask: net.CIDRMask(96, 128), - } - cidr.IP[10] = byte(rand.Intn(0xff + 1)) - cidr.IP[11] = byte(rand.Intn(0xff + 1)) - return cidr.String() - } - - switch family { - case "ipv4": - return fnIPv4() - case "ipv6": - return fnIPv6() - case "dual": - return fnIPv4() + "," + fnIPv6() - default: - Failf("invalid ip family: %q", family) - return "" - } -} - -func sortIPs(ips []string) { - sort.Slice(ips, func(i, j int) bool { - return util.Ip2BigInt(ips[i]).Cmp(util.Ip2BigInt(ips[j])) < 0 - }) -} - -// ipv4/ipv6 only -func RandomExcludeIPs(cidr string, count int) []string { - if cidr == "" || count == 0 { - return nil - } - - rangeCount := rand.Intn(count + 1) - ips := strings.Split(RandomIPPool(cidr, ";", rangeCount*2+count-rangeCount), ";") - sortIPs(ips) - - var idx int - rangeLeft := rangeCount - ret := make([]string, 0, count) - for i := 0; i < count; i++ { - if rangeLeft != 0 && rand.Intn(count-i) < rangeLeft { - ret = append(ret, fmt.Sprintf("%s..%s", ips[idx], ips[idx+1])) - idx++ - rangeLeft-- - } else { - ret = append(ret, ips[idx]) - } - idx++ - } - - return ret -} - -func RandomIPPool(cidr, sep string, count int) string { - fn := func(cidr string) []string { - if cidr == "" { - return nil - } - - firstIP, _ := util.FirstIP(cidr) - _, ipnet, _ := net.ParseCIDR(cidr) - - base := util.Ip2BigInt(firstIP) - base.Add(base, big.NewInt(1)) - prefix, size := ipnet.Mask.Size() - rnd := rand.New(rand.NewSource(time.Now().UnixNano())) - max := big.NewInt(0).Exp(big.NewInt(2), big.NewInt(int64(size-prefix)), nil) - max.Sub(max, big.NewInt(3)) - - ips := make([]string, 0, count) - for len(ips) != count { - n := big.NewInt(0).Rand(rnd, max) - if ip := util.BigInt2Ip(n.Add(n, base)); !util.ContainsString(ips, ip) { - ips = append(ips, ip) - } - } - return ips - } - - cidrV4, cidrV6 := util.SplitStringIP(cidr) - ipsV4, ipsV6 := fn(cidrV4), fn(cidrV6) - - dual := make([]string, 0, count) - for i := 0; i < count; i++ { - var ips []string - if i < len(ipsV4) { - ips = append(ips, ipsV4[i]) - } - if i < len(ipsV6) { - ips = append(ips, ipsV6[i]) - } - dual = append(dual, strings.Join(ips, ",")) - } - - return strings.Join(dual, sep) -} diff --git a/test/e2e/framework/vlan.go b/test/e2e/framework/vlan.go deleted file mode 100644 index 2c96802549c..00000000000 --- a/test/e2e/framework/vlan.go +++ /dev/null @@ -1,88 +0,0 @@ -package framework - -import ( - "context" - "time" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - - apiv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" - v1 "github.com/kubeovn/kube-ovn/pkg/client/clientset/versioned/typed/kubeovn/v1" - "github.com/kubeovn/kube-ovn/pkg/util" -) - -// VlanClient is a struct for vlan client. -type VlanClient struct { - f *Framework - v1.VlanInterface -} - -func (f *Framework) VlanClient() *VlanClient { - return &VlanClient{ - f: f, - VlanInterface: f.KubeOVNClientSet.KubeovnV1().Vlans(), - } -} - -func (s *VlanClient) Get(name string) *apiv1.Vlan { - vlan, err := s.VlanInterface.Get(context.TODO(), name, metav1.GetOptions{}) - ExpectNoError(err) - return vlan -} - -// Create creates a new vlan according to the framework specifications -func (c *VlanClient) Create(pn *apiv1.Vlan) *apiv1.Vlan { - vlan, err := c.VlanInterface.Create(context.TODO(), pn, metav1.CreateOptions{}) - ExpectNoError(err, "Error creating vlan") - return vlan.DeepCopy() -} - -// Patch patches the vlan -func (c *VlanClient) Patch(original, modified *apiv1.Vlan, timeout time.Duration) *apiv1.Vlan { - patch, err := util.GenerateMergePatchPayload(original, modified) - ExpectNoError(err) - - var patchedVlan *apiv1.Vlan - err = wait.PollImmediate(2*time.Second, timeout, func() (bool, error) { - pn, err := c.VlanInterface.Patch(context.TODO(), original.Name, types.MergePatchType, patch, metav1.PatchOptions{}, "") - if err != nil { - return handleWaitingAPIError(err, false, "patch vlan %q", original.Name) - } - patchedVlan = pn - return true, nil - }) - if err == nil { - return patchedVlan.DeepCopy() - } - - if IsTimeout(err) { - Failf("timed out while retrying to patch vlan %s", original.Name) - } - ExpectNoError(maybeTimeoutError(err, "patching vlan %s", original.Name)) - - return nil -} - -// Delete deletes a vlan if the vlan exists -func (c *VlanClient) Delete(name string, options metav1.DeleteOptions) { - err := c.VlanInterface.Delete(context.TODO(), name, options) - if err != nil && !apierrors.IsNotFound(err) { - Failf("Failed to delete vlan %q: %v", name, err) - } -} - -func MakeVlan(name, provider string, id int) *apiv1.Vlan { - vlan := &apiv1.Vlan{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: apiv1.VlanSpec{ - Provider: provider, - ID: id, - }, - } - return vlan -} diff --git a/test/e2e/framework/wait.go b/test/e2e/framework/wait.go deleted file mode 100644 index e40985d8f7b..00000000000 --- a/test/e2e/framework/wait.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package framework - -import ( - "fmt" - "time" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/util/wait" -) - -type timeoutError struct { - msg string - observedObjects []interface{} -} - -func (e *timeoutError) Error() string { - return e.msg -} - -func TimeoutError(msg string, observedObjects ...interface{}) *timeoutError { - return &timeoutError{ - msg: msg, - observedObjects: observedObjects, - } -} - -// maybeTimeoutError returns a TimeoutError if err is a timeout. Otherwise, wrap err. -// taskFormat and taskArgs should be the task being performed when the error occurred, -// e.g. "waiting for pod to be running". -func maybeTimeoutError(err error, taskFormat string, taskArgs ...interface{}) error { - if IsTimeout(err) { - return TimeoutError(fmt.Sprintf("timed out while "+taskFormat, taskArgs...)) - } else if err != nil { - return fmt.Errorf("error while %s: %w", fmt.Sprintf(taskFormat, taskArgs...), err) - } else { - return nil - } -} - -func IsTimeout(err error) bool { - if err == wait.ErrWaitTimeout { - return true - } - if _, ok := err.(*timeoutError); ok { - return true - } - return false -} - -// handleWaitingAPIErrror handles an error from an API request in the context of a Wait function. -// If the error is retryable, sleep the recommended delay and ignore the error. -// If the erorr is terminal, return it. -func handleWaitingAPIError(err error, retryNotFound bool, taskFormat string, taskArgs ...interface{}) (bool, error) { - taskDescription := fmt.Sprintf(taskFormat, taskArgs...) - if retryNotFound && apierrors.IsNotFound(err) { - Logf("Ignoring NotFound error while " + taskDescription) - return false, nil - } - if retry, delay := shouldRetry(err); retry { - Logf("Retryable error while %s, retrying after %v: %v", taskDescription, delay, err) - if delay > 0 { - time.Sleep(delay) - } - return false, nil - } - Logf("Encountered non-retryable error while %s: %v", taskDescription, err) - return false, err -} - -// Decide whether to retry an API request. Optionally include a delay to retry after. -func shouldRetry(err error) (retry bool, retryAfter time.Duration) { - // if the error sends the Retry-After header, we respect it as an explicit confirmation we should retry. - if delay, shouldRetry := apierrors.SuggestsClientDelay(err); shouldRetry { - return shouldRetry, time.Duration(delay) * time.Second - } - - // these errors indicate a transient error that should be retried. - if apierrors.IsTimeout(err) || apierrors.IsTooManyRequests(err) { - return true, 0 - } - - return false, 0 -} diff --git a/test/e2e/k8s-network/e2e_test.go b/test/e2e/k8s-network/e2e_test.go deleted file mode 100644 index 6d9192e2298..00000000000 --- a/test/e2e/k8s-network/e2e_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package k8s_network - -import ( - "flag" - "os" - "path/filepath" - "testing" - - "k8s.io/klog/v2" - "k8s.io/kubernetes/test/e2e" - "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/framework/config" - - "github.com/onsi/ginkgo/v2" - - // Import tests. - _ "k8s.io/kubernetes/test/e2e/network" -) - -func init() { - klog.SetOutput(ginkgo.GinkgoWriter) - - // Register flags. - config.CopyFlags(config.Flags, flag.CommandLine) - framework.RegisterCommonFlags(flag.CommandLine) - framework.RegisterClusterFlags(flag.CommandLine) -} - -func TestE2E(t *testing.T) { - if framework.TestContext.KubeConfig == "" { - framework.TestContext.KubeConfig = filepath.Join(os.Getenv("HOME"), ".kube", "config") - } - framework.AfterReadingAllFlags(&framework.TestContext) - - e2e.RunE2ETests(t) -} diff --git a/test/e2e/kube-ovn/e2e_test.go b/test/e2e/kube-ovn/e2e_test.go deleted file mode 100644 index 032df42bb83..00000000000 --- a/test/e2e/kube-ovn/e2e_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package kube_ovn - -import ( - "flag" - "os" - "path/filepath" - "testing" - - "k8s.io/klog/v2" - "k8s.io/kubernetes/test/e2e" - "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/framework/config" - - "github.com/onsi/ginkgo/v2" - - // Import tests. - _ "github.com/kubeovn/kube-ovn/test/e2e/kube-ovn/ipam" - _ "github.com/kubeovn/kube-ovn/test/e2e/kube-ovn/kubectl-ko" - _ "github.com/kubeovn/kube-ovn/test/e2e/kube-ovn/node" - _ "github.com/kubeovn/kube-ovn/test/e2e/kube-ovn/qos" - _ "github.com/kubeovn/kube-ovn/test/e2e/kube-ovn/subnet" - _ "github.com/kubeovn/kube-ovn/test/e2e/kube-ovn/underlay" -) - -func init() { - klog.SetOutput(ginkgo.GinkgoWriter) - - // Register flags. - config.CopyFlags(config.Flags, flag.CommandLine) - framework.RegisterCommonFlags(flag.CommandLine) - framework.RegisterClusterFlags(flag.CommandLine) -} - -func TestE2E(t *testing.T) { - if framework.TestContext.KubeConfig == "" { - framework.TestContext.KubeConfig = filepath.Join(os.Getenv("HOME"), ".kube", "config") - } - framework.AfterReadingAllFlags(&framework.TestContext) - - e2e.RunE2ETests(t) -} diff --git a/test/e2e/kube-ovn/ipam/ipam.go b/test/e2e/kube-ovn/ipam/ipam.go deleted file mode 100644 index 33c3599575e..00000000000 --- a/test/e2e/kube-ovn/ipam/ipam.go +++ /dev/null @@ -1,330 +0,0 @@ -package ipam - -import ( - "context" - "strings" - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/test/e2e/framework/deployment" - e2epod "k8s.io/kubernetes/test/e2e/framework/pod" - "k8s.io/kubernetes/test/e2e/framework/statefulset" - - "github.com/onsi/ginkgo/v2" - - apiv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" -) - -var _ = framework.Describe("[group:ipam]", func() { - f := framework.NewDefaultFramework("ipam") - - var cs clientset.Interface - var podClient *framework.PodClient - var subnetClient *framework.SubnetClient - var namespaceName, subnetName string - var subnet *apiv1.Subnet - var cidr string - - ginkgo.BeforeEach(func() { - cs = f.ClientSet - podClient = f.PodClient() - subnetClient = f.SubnetClient() - namespaceName = f.Namespace.Name - subnetName = namespaceName - cidr = framework.RandomCIDR(f.ClusterIpFamily) - - ginkgo.By("Creating subnet " + subnetName) - subnet = framework.MakeSubnet(subnetName, "", cidr, "", nil, nil, []string{namespaceName}) - subnet = subnetClient.CreateSync(subnet) - }) - ginkgo.AfterEach(func() { - ginkgo.By("Deleting subnet " + subnetName) - subnetClient.DeleteSync(subnetName) - }) - - framework.ConformanceIt("should allocate static ipv4 and mac for pod", func() { - name := "pod-" + framework.RandomSuffix() - mac := util.GenerateMac() - ip := framework.RandomIPPool(cidr, ";", 1) - - ginkgo.By("Creating pod " + name + " with ip " + ip + " and mac " + mac) - annotations := map[string]string{ - util.IpAddressAnnotation: ip, - util.MacAddressAnnotation: mac, - } - pod := framework.MakePod(namespaceName, name, nil, annotations, "", nil, nil) - pod = podClient.CreateSync(pod) - - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpAddressAnnotation, ip) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.MacAddressAnnotation, mac) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - - podIPs := make([]string, 0, len(pod.Status.PodIPs)) - for _, podIP := range pod.Status.PodIPs { - podIPs = append(podIPs, podIP.IP) - } - framework.ExpectConsistOf(podIPs, strings.Split(ip, ",")) - - ginkgo.By("Deleting pod " + name) - podClient.DeleteSync(pod.Name) - }) - - framework.ConformanceIt("should allocate static ip for pod with comma separated ippool", func() { - if f.ClusterIpFamily == "dual" { - ginkgo.Skip("Comma separated ippool is not supported for dual stack") - } - - name := "pod-" + framework.RandomSuffix() - pool := framework.RandomIPPool(cidr, ",", 3) - - ginkgo.By("Creating pod " + name + " with ippool " + pool) - annotations := map[string]string{util.IpPoolAnnotation: pool} - pod := framework.MakePod(namespaceName, name, nil, annotations, "", nil, nil) - pod = podClient.CreateSync(pod) - - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpPoolAnnotation, pool) - framework.ExpectEqual(pod.Annotations[util.IpAddressAnnotation], pod.Status.PodIP) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectMAC(pod.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - - framework.ExpectContainElement(strings.Split(pool, ","), pod.Status.PodIP) - - ginkgo.By("Deleting pod " + name) - podClient.DeleteSync(pod.Name) - }) - - framework.ConformanceIt("should allocate static ip for deployment with ippool", func() { - ippoolSep := ";" - if f.ClusterVersionMajor <= 1 && f.ClusterVersionMinor < 11 { - if f.ClusterIpFamily == "dual" { - ginkgo.Skip("Support for dual stack ippool was introduced in v1.11") - } - ippoolSep = "," - } - - replicas := 3 - name := "deployment-" + framework.RandomSuffix() - ippool := framework.RandomIPPool(cidr, ippoolSep, replicas) - labels := map[string]string{"app": name} - - ginkgo.By("Creating deployment " + name + " with ippool " + ippool) - deploy := deployment.NewDeployment(name, int32(replicas), labels, "pause", framework.PauseImage, "") - deploy.Spec.Template.Annotations = map[string]string{util.IpPoolAnnotation: ippool} - deploy, err := cs.AppsV1().Deployments(namespaceName).Create(context.TODO(), deploy, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to to create deployment") - err = deployment.WaitForDeploymentComplete(cs, deploy) - framework.ExpectNoError(err, "deployment failed to complete") - - ginkgo.By("Getting pods for deployment " + name) - pods, err := deployment.GetPodsForDeployment(cs, deploy) - framework.ExpectNoError(err, "failed to get pods for deployment "+name) - framework.ExpectHaveLen(pods.Items, replicas) - - ips := strings.Split(ippool, ippoolSep) - for _, pod := range pods.Items { - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpPoolAnnotation, ippool) - framework.ExpectContainElement(ips, pod.Annotations[util.IpAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectMAC(pod.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - - podIPs := make([]string, 0, len(pod.Status.PodIPs)) - for _, podIP := range pod.Status.PodIPs { - podIPs = append(podIPs, podIP.IP) - } - framework.ExpectConsistOf(podIPs, strings.Split(pod.Annotations[util.IpAddressAnnotation], ",")) - } - - ginkgo.By("Deleting pods for deployment " + name) - for _, pod := range pods.Items { - err = podClient.Delete(context.TODO(), pod.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete pod "+pod.Name) - } - err = deployment.WaitForDeploymentComplete(cs, deploy) - framework.ExpectNoError(err, "deployment failed to complete") - - ginkgo.By("Waiting for new pods to be ready") - err = e2epod.WaitForPodsRunningReady(cs, namespaceName, *deploy.Spec.Replicas, 0, time.Minute, nil) - framework.ExpectNoError(err, "timed out waiting for pods to be ready") - - ginkgo.By("Getting pods for deployment " + name + " after deletion") - pods, err = deployment.GetPodsForDeployment(cs, deploy) - framework.ExpectNoError(err, "failed to get pods for deployment "+name) - framework.ExpectHaveLen(pods.Items, replicas) - for _, pod := range pods.Items { - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpPoolAnnotation, ippool) - framework.ExpectContainElement(ips, pod.Annotations[util.IpAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectMAC(pod.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - - podIPs := make([]string, 0, len(pod.Status.PodIPs)) - for _, podIP := range pod.Status.PodIPs { - podIPs = append(podIPs, podIP.IP) - } - framework.ExpectConsistOf(podIPs, strings.Split(pod.Annotations[util.IpAddressAnnotation], ",")) - } - - ginkgo.By("Deleting deployment " + name) - err = cs.AppsV1().Deployments(namespaceName).Delete(context.TODO(), name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete deployment "+name) - }) - - framework.ConformanceIt("should allocate static ip for statefulset", func() { - replicas := 3 - name := "statefulset-" + framework.RandomSuffix() - labels := map[string]string{"app": name} - - ginkgo.By("Creating statefulset " + name) - sts := statefulset.NewStatefulSet(name, namespaceName, name, int32(replicas), nil, nil, labels) - sts.Spec.Template.Spec.Containers[0].Image = framework.PauseImage - sts, err := cs.AppsV1().StatefulSets(namespaceName).Create(context.TODO(), sts, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to to create statefulset") - statefulset.WaitForRunningAndReady(cs, int32(replicas), sts) - - ginkgo.By("Getting pods for statefulset " + name) - pods := statefulset.GetPodList(cs, sts) - framework.ExpectHaveLen(pods.Items, replicas) - statefulset.SortStatefulPods(pods) - - ips := make([]string, 0, replicas) - for _, pod := range pods.Items { - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectMAC(pod.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - - podIPs := make([]string, 0, len(pod.Status.PodIPs)) - for _, podIP := range pod.Status.PodIPs { - podIPs = append(podIPs, podIP.IP) - } - framework.ExpectConsistOf(podIPs, strings.Split(pod.Annotations[util.IpAddressAnnotation], ",")) - ips = append(ips, pod.Annotations[util.IpAddressAnnotation]) - } - - ginkgo.By("Deleting pods for statefulset " + name) - for _, pod := range pods.Items { - err = podClient.Delete(context.TODO(), pod.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete pod "+pod.Name) - } - statefulset.WaitForRunningAndReady(cs, int32(replicas), sts) - - ginkgo.By("Getting pods for statefulset " + name) - pods = statefulset.GetPodList(cs, sts) - framework.ExpectHaveLen(pods.Items, replicas) - statefulset.SortStatefulPods(pods) - - for i, pod := range pods.Items { - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpAddressAnnotation, ips[i]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectMAC(pod.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - } - - ginkgo.By("Deleting statefulset " + name) - err = cs.AppsV1().StatefulSets(namespaceName).Delete(context.TODO(), name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete statefulset "+name) - }) - - framework.ConformanceIt("should allocate static ip for statefulset with ippool", func() { - ippoolSep := ";" - if f.ClusterVersionMajor <= 1 && f.ClusterVersionMinor < 11 { - if f.ClusterIpFamily == "dual" { - ginkgo.Skip("Support for dual stack ippool was introduced in v1.11") - } - ippoolSep = "," - } - - replicas := 3 - name := "statefulset-" + framework.RandomSuffix() - ippool := framework.RandomIPPool(cidr, ippoolSep, replicas) - labels := map[string]string{"app": name} - - ginkgo.By("Creating statefulset " + name + " with ippool " + ippool) - sts := statefulset.NewStatefulSet(name, namespaceName, name, int32(replicas), nil, nil, labels) - sts.Spec.Template.Spec.Containers[0].Image = framework.PauseImage - sts.Spec.Template.Annotations = map[string]string{util.IpPoolAnnotation: ippool} - sts, err := cs.AppsV1().StatefulSets(namespaceName).Create(context.TODO(), sts, metav1.CreateOptions{}) - framework.ExpectNoError(err, "failed to to create statefulset") - statefulset.WaitForRunningAndReady(cs, int32(replicas), sts) - - ginkgo.By("Getting pods for statefulset " + name) - pods := statefulset.GetPodList(cs, sts) - framework.ExpectHaveLen(pods.Items, replicas) - statefulset.SortStatefulPods(pods) - - ips := make([]string, 0, replicas) - for _, pod := range pods.Items { - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpPoolAnnotation, ippool) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectMAC(pod.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - - podIPs := make([]string, 0, len(pod.Status.PodIPs)) - for _, podIP := range pod.Status.PodIPs { - podIPs = append(podIPs, podIP.IP) - } - framework.ExpectConsistOf(podIPs, strings.Split(pod.Annotations[util.IpAddressAnnotation], ",")) - ips = append(ips, pod.Annotations[util.IpAddressAnnotation]) - } - framework.ExpectConsistOf(ips, strings.Split(ippool, ippoolSep)) - - ginkgo.By("Deleting pods for statefulset " + name) - for _, pod := range pods.Items { - err = podClient.Delete(context.TODO(), pod.Name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete pod "+pod.Name) - } - statefulset.WaitForRunningAndReady(cs, int32(replicas), sts) - - ginkgo.By("Getting pods for statefulset " + name) - pods = statefulset.GetPodList(cs, sts) - framework.ExpectHaveLen(pods.Items, replicas) - statefulset.SortStatefulPods(pods) - - for i, pod := range pods.Items { - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.CidrAnnotation, subnet.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.GatewayAnnotation, subnet.Spec.Gateway) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpPoolAnnotation, ippool) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IpAddressAnnotation, ips[i]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.LogicalSwitchAnnotation, subnet.Name) - framework.ExpectMAC(pod.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - - podIPs := make([]string, 0, len(pod.Status.PodIPs)) - for _, podIP := range pod.Status.PodIPs { - podIPs = append(podIPs, podIP.IP) - } - framework.ExpectConsistOf(podIPs, strings.Split(pod.Annotations[util.IpAddressAnnotation], ",")) - } - - ginkgo.By("Deleting statefulset " + name) - err = cs.AppsV1().StatefulSets(namespaceName).Delete(context.TODO(), name, metav1.DeleteOptions{}) - framework.ExpectNoError(err, "failed to delete statefulset "+name) - }) -}) diff --git a/test/e2e/kube-ovn/kubectl-ko/kubectl-ko.go b/test/e2e/kube-ovn/kubectl-ko/kubectl-ko.go deleted file mode 100644 index 3459d5c2485..00000000000 --- a/test/e2e/kube-ovn/kubectl-ko/kubectl-ko.go +++ /dev/null @@ -1,151 +0,0 @@ -package kubectl_ko - -import ( - "fmt" - "strings" - - clientset "k8s.io/client-go/kubernetes" - k8sframework "k8s.io/kubernetes/test/e2e/framework" - e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - - "github.com/onsi/ginkgo/v2" - - apiv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" -) - -const ( - targetIPv4 = "8.8.8.8" - targetIPv6 = "2001:4860:4860::8888" -) - -func execOrDie(cmd string) { - ginkgo.By(`Executing "kubectl ` + cmd + `"`) - e2ekubectl.NewKubectlCommand("", strings.Fields(cmd)...).ExecOrDie("") -} - -var _ = framework.Describe("[group:kubectl-ko]", func() { - f := framework.NewDefaultFramework("kubectl-ko") - - var cs clientset.Interface - var podClient *framework.PodClient - var namespaceName, kubectlConfig string - ginkgo.BeforeEach(func() { - cs = f.ClientSet - podClient = f.PodClient() - namespaceName = f.Namespace.Name - kubectlConfig = k8sframework.TestContext.KubeConfig - k8sframework.TestContext.KubeConfig = "" - }) - ginkgo.AfterEach(func() { - k8sframework.TestContext.KubeConfig = kubectlConfig - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko nbctl show"`, func() { - execOrDie("ko nbctl show") - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko sbctl show"`, func() { - execOrDie("ko sbctl show") - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko vsctl show"`, func() { - ginkgo.By("Getting nodes") - nodeList, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - for _, node := range nodeList.Items { - execOrDie(fmt.Sprintf("ko vsctl %s show", node.Name)) - } - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko ofctl show br-int"`, func() { - ginkgo.By("Getting nodes") - nodeList, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - for _, node := range nodeList.Items { - execOrDie(fmt.Sprintf("ko ofctl %s show br-int", node.Name)) - } - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko dpctl show"`, func() { - ginkgo.By("Getting nodes") - nodeList, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - for _, node := range nodeList.Items { - execOrDie(fmt.Sprintf("ko dpctl %s show", node.Name)) - } - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko appctl list-commands"`, func() { - ginkgo.By("Getting nodes") - nodeList, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - for _, node := range nodeList.Items { - execOrDie(fmt.Sprintf("ko appctl %s list-commands", node.Name)) - } - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko nb/sb status/backup"`, func() { - databases := [...]string{"nb", "sb"} - actions := [...]string{"status", "backup"} - for _, db := range databases { - for _, action := range actions { - execOrDie(fmt.Sprintf("ko %s %s", db, action)) - // TODO: verify backup files are present - } - } - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko tcpdump -c1"`, func() { - name := "pod-" + framework.RandomSuffix() - ginkgo.By("Creating pod " + name) - ping, target := "ping", targetIPv4 - if f.IPv6() { - ping, target = "ping6", targetIPv6 - } - - cmd := []string{"sh", "-c", fmt.Sprintf(`while true; do %s -c1 -w1 %s; sleep 1; done`, ping, target)} - pod := framework.MakePod(namespaceName, name, nil, nil, framework.BusyBoxImage, cmd, nil) - pod.Spec.TerminationGracePeriodSeconds = new(int64) - pod = podClient.CreateSync(pod) - - execOrDie(fmt.Sprintf("ko tcpdump %s/%s -c1", pod.Namespace, pod.Name)) - - ginkgo.By("Deleting pod " + name) - podClient.DeleteSync(pod.Name) - }) - - framework.ConformanceIt(`should succeed to execute "kubectl ko trace "`, func() { - name := "pod-" + framework.RandomSuffix() - ginkgo.By("Creating pod " + name) - pod := framework.MakePod(namespaceName, name, nil, nil, "", nil, nil) - pod = podClient.CreateSync(pod) - - for _, ip := range pod.Status.PodIPs { - target := targetIPv4 - if util.CheckProtocol(ip.IP) == apiv1.ProtocolIPv6 { - target = targetIPv6 - } - - prefix := fmt.Sprintf("ko trace %s/%s %s", pod.Namespace, pod.Name, target) - execOrDie(fmt.Sprintf("%s icmp", prefix)) - execOrDie(fmt.Sprintf("%s tcp 80", prefix)) - execOrDie(fmt.Sprintf("%s udp 53", prefix)) - } - - ginkgo.By("Deleting pod " + name) - podClient.DeleteSync(pod.Name) - }) - - framework.ConformanceIt(`should support "kubectl ko diagnose subnet IPPorts "`, func() { - f.SkipVersionPriorTo(1, 12, "This feature was introduce in v1.12") - execOrDie("ko diagnose subnet ovn-default") - execOrDie("ko diagnose IPPorts tcp-114.114.114.114-53,udp-114.114.114.114-53") - }) -}) diff --git a/test/e2e/kube-ovn/node/node.go b/test/e2e/kube-ovn/node/node.go deleted file mode 100644 index d3df826caab..00000000000 --- a/test/e2e/kube-ovn/node/node.go +++ /dev/null @@ -1,46 +0,0 @@ -package node - -import ( - clientset "k8s.io/client-go/kubernetes" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - - "github.com/onsi/ginkgo/v2" - - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" -) - -var _ = framework.Describe("[group:node]", func() { - f := framework.NewDefaultFramework("node") - f.SkipNamespaceCreation = true - - var cs clientset.Interface - var subnetClient *framework.SubnetClient - ginkgo.BeforeEach(func() { - cs = f.ClientSet - subnetClient = f.SubnetClient() - }) - - framework.ConformanceIt("should allocate ip in join subnet to node", func() { - ginkgo.By("Getting join subnet") - join := subnetClient.Get("join") - - ginkgo.By("Getting nodes") - nodeList, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - ginkgo.By("Validating node annotations") - for _, node := range nodeList.Items { - framework.ExpectHaveKeyWithValue(node.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectUUID(node.Annotations[util.ChassisAnnotation]) - framework.ExpectHaveKeyWithValue(node.Annotations, util.CidrAnnotation, join.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(node.Annotations, util.GatewayAnnotation, join.Spec.Gateway) - framework.ExpectIPInCIDR(node.Annotations[util.IpAddressAnnotation], join.Spec.CIDRBlock) - framework.ExpectHaveKeyWithValue(node.Annotations, util.LogicalSwitchAnnotation, join.Name) - framework.ExpectMAC(node.Annotations[util.MacAddressAnnotation]) - framework.ExpectHaveKeyWithValue(node.Annotations, util.PortNameAnnotation, "node-"+node.Name) - - // TODO: check IP/route on ovn0 - } - }) -}) diff --git a/test/e2e/kube-ovn/qos/qos.go b/test/e2e/kube-ovn/qos/qos.go deleted file mode 100644 index 47921531ea0..00000000000 --- a/test/e2e/kube-ovn/qos/qos.go +++ /dev/null @@ -1,185 +0,0 @@ -package qos - -import ( - "fmt" - "strconv" - "strings" - "time" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/wait" - clientset "k8s.io/client-go/kubernetes" - e2epodoutput "k8s.io/kubernetes/test/e2e/framework/pod/output" - - "github.com/onsi/ginkgo/v2" - - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" -) - -func parseConfig(table, config string) map[string]string { - kvs := make(map[string]string, 3) - for _, s := range strings.Fields(config) { - kv := strings.Split(s, "=") - if len(kv) != 2 { - framework.Logf("ignore %s config %s", table, s) - continue - } - kvs[kv[0]] = kv[1] - } - - return kvs -} - -func getOvsQosForPod(cs clientset.Interface, table string, pod *corev1.Pod) map[string]string { - ovsPod := framework.GetOvsPodOnNode(cs, pod.Spec.NodeName) - cmd := fmt.Sprintf(`ovs-vsctl --no-heading --columns=other_config --bare find %s external_ids:pod="%s/%s"`, table, pod.Namespace, pod.Name) - output := e2epodoutput.RunHostCmdOrDie(ovsPod.Namespace, ovsPod.Name, cmd) - return parseConfig(table, output) -} - -func getOvsQosForPodRetry(cs clientset.Interface, table string, pod *corev1.Pod, expected map[string]string) map[string]string { - ovsPod := framework.GetOvsPodOnNode(cs, pod.Spec.NodeName) - cmd := fmt.Sprintf(`ovs-vsctl --no-heading --columns=other_config --bare find %s external_ids:pod="%s/%s"`, table, pod.Namespace, pod.Name) - - var config map[string]string - err := wait.PollImmediate(2*time.Second, 2*time.Minute, func() (bool, error) { - output, err := e2epodoutput.RunHostCmd(ovsPod.Namespace, ovsPod.Name, cmd) - if err != nil { - return false, err - } - if output == "" { - return false, nil - } - kvs := parseConfig(table, output) - for k, v := range expected { - if kvs[k] != v { - return false, nil - } - } - - config = kvs - return true, nil - }) - framework.ExpectNoError(err, "timed out getting ovs %s config for pod %s/%s", table, pod.Namespace, pod.Name) - - return config -} - -var _ = framework.Describe("[group:qos]", func() { - f := framework.NewDefaultFramework("qos") - - var subnetName, namespaceName string - var cs clientset.Interface - var podClient *framework.PodClient - var subnetClient *framework.SubnetClient - - ginkgo.BeforeEach(func() { - cs = f.ClientSet - podClient = f.PodClient() - subnetClient = f.SubnetClient() - namespaceName = f.Namespace.Name - }) - ginkgo.AfterEach(func() { - if subnetName != "" { - ginkgo.By("Deleting subnet " + subnetName) - subnetClient.DeleteSync(subnetName) - } - }) - - framework.ConformanceIt("should support netem QoS", func() { - f.SkipVersionPriorTo(1, 9, "Support for netem QoS was introduced in v1.9") - - name := "pod-" + framework.RandomSuffix() - ginkgo.By("Creating pod " + name) - latency, limit, loss := 600, 2000, 10 - annotations := map[string]string{ - util.NetemQosLatencyAnnotation: strconv.Itoa(latency), - util.NetemQosLimitAnnotation: strconv.Itoa(limit), - util.NetemQosLossAnnotation: strconv.Itoa(loss), - } - pod := framework.MakePod(namespaceName, name, nil, annotations, "", nil, nil) - pod = podClient.CreateSync(pod) - - ginkgo.By("Validating pod annotations") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.NetemQosLatencyAnnotation, strconv.Itoa(latency)) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.NetemQosLimitAnnotation, strconv.Itoa(limit)) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.NetemQosLossAnnotation, strconv.Itoa(loss)) - - ginkgo.By("Validating OVS QoS") - qos := getOvsQosForPod(cs, "qos", pod) - framework.ExpectHaveKeyWithValue(qos, "latency", strconv.Itoa(latency*1000)) - framework.ExpectHaveKeyWithValue(qos, "limit", strconv.Itoa(limit)) - framework.ExpectHaveKeyWithValue(qos, "loss", strconv.Itoa(loss)) - - ginkgo.By("Deleting pod " + name) - podClient.DeleteSync(pod.Name) - }) - - framework.ConformanceIt("should be able to update netem QoS", func() { - f.SkipVersionPriorTo(1, 9, "Support for netem QoS was introduced in v1.9") - - name := "pod-" + framework.RandomSuffix() - ginkgo.By("Creating pod " + name + " without QoS") - pod := framework.MakePod(namespaceName, name, nil, nil, "", nil, nil) - pod = podClient.CreateSync(pod) - - ginkgo.By("Validating pod annotations") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - framework.ExpectNotHaveKey(pod.Annotations, util.NetemQosLatencyAnnotation) - framework.ExpectNotHaveKey(pod.Annotations, util.NetemQosLimitAnnotation) - framework.ExpectNotHaveKey(pod.Annotations, util.NetemQosLossAnnotation) - - ginkgo.By("Adding netem QoS to pod annotations") - latency, limit, loss := 600, 2000, 10 - modifiedPod := pod.DeepCopy() - modifiedPod.Annotations[util.NetemQosLatencyAnnotation] = strconv.Itoa(latency) - modifiedPod.Annotations[util.NetemQosLimitAnnotation] = strconv.Itoa(limit) - modifiedPod.Annotations[util.NetemQosLossAnnotation] = strconv.Itoa(loss) - pod = podClient.PatchPod(pod, modifiedPod) - - ginkgo.By("Validating pod annotations") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.NetemQosLatencyAnnotation, strconv.Itoa(latency)) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.NetemQosLimitAnnotation, strconv.Itoa(limit)) - framework.ExpectHaveKeyWithValue(pod.Annotations, util.NetemQosLossAnnotation, strconv.Itoa(loss)) - - ginkgo.By("Validating OVS QoS") - qos := getOvsQosForPodRetry(cs, "qos", pod, nil) - framework.ExpectHaveKeyWithValue(qos, "latency", strconv.Itoa(latency*1000)) - framework.ExpectHaveKeyWithValue(qos, "limit", strconv.Itoa(limit)) - framework.ExpectHaveKeyWithValue(qos, "loss", strconv.Itoa(loss)) - - ginkgo.By("Deleting pod " + name) - podClient.DeleteSync(pod.Name) - }) - - framework.ConformanceIt("should support htb QoS", func() { - f.SkipVersionPriorTo(1, 9, "Support for htb QoS with priority was introduced in v1.9") - - name := "pod-" + framework.RandomSuffix() - ginkgo.By("Creating pod " + name) - ingressRate := 300 - annotations := map[string]string{ - util.IngressRateAnnotation: strconv.Itoa(ingressRate), - } - pod := framework.MakePod(namespaceName, name, nil, annotations, "", nil, nil) - pod = podClient.CreateSync(pod) - - ginkgo.By("Validating pod annotations") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.AllocatedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.RoutedAnnotation, "true") - framework.ExpectHaveKeyWithValue(pod.Annotations, util.IngressRateAnnotation, strconv.Itoa(ingressRate)) - - ginkgo.By("Validating OVS Queue") - queue := getOvsQosForPod(cs, "queue", pod) - framework.ExpectHaveKeyWithValue(queue, "max-rate", strconv.Itoa(ingressRate*1000*1000)) - - ginkgo.By("Deleting pod " + name) - podClient.DeleteSync(pod.Name) - }) -}) diff --git a/test/e2e/kube-ovn/subnet/subnet.go b/test/e2e/kube-ovn/subnet/subnet.go deleted file mode 100644 index f995e144809..00000000000 --- a/test/e2e/kube-ovn/subnet/subnet.go +++ /dev/null @@ -1,525 +0,0 @@ -package subnet - -import ( - "fmt" - "math/rand" - "net" - "strconv" - "strings" - - clientset "k8s.io/client-go/kubernetes" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - - "github.com/onsi/ginkgo/v2" - - apiv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" - "github.com/kubeovn/kube-ovn/test/e2e/framework/docker" - "github.com/kubeovn/kube-ovn/test/e2e/framework/iproute" - "github.com/kubeovn/kube-ovn/test/e2e/framework/kind" -) - -var _ = framework.Describe("[group:subnet]", func() { - f := framework.NewDefaultFramework("subnet") - - var subnet *apiv1.Subnet - var cs clientset.Interface - var podClient *framework.PodClient - var subnetClient *framework.SubnetClient - var namespaceName, subnetName string - var cidr, cidrV4, cidrV6, firstIPv4, firstIPv6 string - var gateways []string - - ginkgo.BeforeEach(func() { - cs = f.ClientSet - podClient = f.PodClient() - subnetClient = f.SubnetClient() - namespaceName = f.Namespace.Name - subnetName = "subnet-" + framework.RandomSuffix() - cidr = framework.RandomCIDR(f.ClusterIpFamily) - cidrV4, cidrV6 = util.SplitStringIP(cidr) - gateways = nil - if cidrV4 == "" { - firstIPv4 = "" - } else { - firstIPv4, _ = util.FirstIP(cidrV4) - gateways = append(gateways, firstIPv4) - } - if cidrV6 == "" { - firstIPv6 = "" - } else { - firstIPv6, _ = util.FirstIP(cidrV6) - gateways = append(gateways, firstIPv6) - } - }) - ginkgo.AfterEach(func() { - ginkgo.By("Deleting subnet " + subnetName) - subnetClient.DeleteSync(subnetName) - }) - - framework.ConformanceIt("should create subnet with only cidr provided", func() { - ginkgo.By("Creating subnet " + subnetName) - subnet = framework.MakeSubnet(subnetName, "", cidr, "", nil, nil, nil) - subnet = subnetClient.CreateSync(subnet) - - ginkgo.By("Validating subnet finalizers") - framework.ExpectContainElement(subnet.Finalizers, util.ControllerName) - - ginkgo.By("Validating subnet spec fields") - framework.ExpectFalse(subnet.Spec.Default) - framework.ExpectEqual(subnet.Spec.Protocol, util.CheckProtocol(cidr)) - framework.ExpectEmpty(subnet.Spec.Namespaces) - framework.ExpectConsistOf(subnet.Spec.ExcludeIps, gateways) - framework.ExpectEqual(subnet.Spec.Gateway, strings.Join(gateways, ",")) - framework.ExpectEqual(subnet.Spec.GatewayType, apiv1.GWDistributedType) - framework.ExpectEmpty(subnet.Spec.GatewayNode) - framework.ExpectFalse(subnet.Spec.NatOutgoing) - framework.ExpectFalse(subnet.Spec.Private) - framework.ExpectEmpty(subnet.Spec.AllowSubnets) - - ginkgo.By("Validating subnet status fields") - framework.ExpectEmpty(subnet.Status.ActivateGateway) - framework.ExpectZero(subnet.Status.V4UsingIPs) - framework.ExpectZero(subnet.Status.V6UsingIPs) - - if cidrV4 == "" { - framework.ExpectZero(subnet.Status.V4AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV4) - framework.ExpectEqual(subnet.Status.V4AvailableIPs, util.AddressCount(ipnet)-1) - } - if cidrV6 == "" { - framework.ExpectZero(subnet.Status.V6AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV6) - framework.ExpectEqual(subnet.Status.V6AvailableIPs, util.AddressCount(ipnet)-1) - } - - // TODO: check routes on ovn0 - }) - - framework.ConformanceIt("should format subnet cidr", func() { - fn := func(cidr string) string { - if cidr == "" { - return "" - } - _, ipnet, _ := net.ParseCIDR(cidr) - ipnet.IP = net.ParseIP(framework.RandomIPPool(cidr, ";", 1)) - return ipnet.String() - } - - s := make([]string, 0, 2) - if c := fn(cidrV4); c != "" { - s = append(s, c) - } - if c := fn(cidrV6); c != "" { - s = append(s, c) - } - - subnet = framework.MakeSubnet(subnetName, "", strings.Join(s, ","), "", nil, nil, nil) - ginkgo.By("Creating subnet " + subnetName + " with cidr " + subnet.Spec.CIDRBlock) - subnet = subnetClient.CreateSync(subnet) - - ginkgo.By("Validating subnet finalizers") - framework.ExpectContainElement(subnet.ObjectMeta.Finalizers, util.ControllerName) - - ginkgo.By("Validating subnet spec fields") - framework.ExpectFalse(subnet.Spec.Default) - framework.ExpectEqual(subnet.Spec.Protocol, util.CheckProtocol(cidr)) - framework.ExpectEmpty(subnet.Spec.Namespaces) - framework.ExpectConsistOf(subnet.Spec.ExcludeIps, gateways) - framework.ExpectEqual(subnet.Spec.Gateway, strings.Join(gateways, ",")) - framework.ExpectEqual(subnet.Spec.GatewayType, apiv1.GWDistributedType) - framework.ExpectEmpty(subnet.Spec.GatewayNode) - framework.ExpectFalse(subnet.Spec.NatOutgoing) - framework.ExpectFalse(subnet.Spec.Private) - framework.ExpectEmpty(subnet.Spec.AllowSubnets) - - ginkgo.By("Validating subnet status fields") - framework.ExpectEmpty(subnet.Status.ActivateGateway) - framework.ExpectZero(subnet.Status.V4UsingIPs) - framework.ExpectZero(subnet.Status.V6UsingIPs) - - if cidrV4 == "" { - framework.ExpectZero(subnet.Status.V4AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV4) - framework.ExpectEqual(subnet.Status.V4AvailableIPs, util.AddressCount(ipnet)-1) - } - if cidrV6 == "" { - framework.ExpectZero(subnet.Status.V6AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV6) - framework.ExpectEqual(subnet.Status.V6AvailableIPs, util.AddressCount(ipnet)-1) - } - - // TODO: check routes on ovn0 - }) - - framework.ConformanceIt("should create subnet with exclude ips", func() { - excludeIPv4 := framework.RandomExcludeIPs(cidrV4, rand.Intn(10)+1) - excludeIPv6 := framework.RandomExcludeIPs(cidrV6, rand.Intn(10)+1) - excludeIPs := append(excludeIPv4, excludeIPv6...) - - ginkgo.By(fmt.Sprintf("Creating subnet %s with exclude ips %v", subnetName, excludeIPs)) - subnet = framework.MakeSubnet(subnetName, "", cidr, "", excludeIPs, nil, nil) - subnet = subnetClient.CreateSync(subnet) - - ginkgo.By("Validating subnet finalizers") - framework.ExpectContainElement(subnet.ObjectMeta.Finalizers, util.ControllerName) - - ginkgo.By("Validating subnet spec fields") - framework.ExpectFalse(subnet.Spec.Default) - framework.ExpectEqual(subnet.Spec.Protocol, util.CheckProtocol(cidr)) - framework.ExpectEmpty(subnet.Spec.Namespaces) - framework.ExpectConsistOf(subnet.Spec.ExcludeIps, append(excludeIPs, gateways...)) - framework.ExpectEqual(subnet.Spec.Gateway, strings.Join(gateways, ",")) - framework.ExpectEqual(subnet.Spec.GatewayType, apiv1.GWDistributedType) - framework.ExpectEmpty(subnet.Spec.GatewayNode) - framework.ExpectFalse(subnet.Spec.NatOutgoing) - framework.ExpectFalse(subnet.Spec.Private) - framework.ExpectEmpty(subnet.Spec.AllowSubnets) - - ginkgo.By("Validating subnet status fields") - framework.ExpectEmpty(subnet.Status.ActivateGateway) - framework.ExpectZero(subnet.Status.V4UsingIPs) - framework.ExpectZero(subnet.Status.V6UsingIPs) - - if cidrV4 == "" { - framework.ExpectZero(subnet.Status.V4AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV4) - expected := util.AddressCount(ipnet) - util.CountIpNums(excludeIPv4) - 1 - framework.ExpectEqual(subnet.Status.V4AvailableIPs, expected) - } - if cidrV6 == "" { - framework.ExpectZero(subnet.Status.V6AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV6) - expected := util.AddressCount(ipnet) - util.CountIpNums(excludeIPv6) - 1 - framework.ExpectEqual(subnet.Status.V6AvailableIPs, expected) - } - }) - - framework.ConformanceIt("should create subnet with centralized gateway", func() { - ginkgo.By("Getting nodes") - nodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - framework.ExpectNotEmpty(nodes.Items) - - ginkgo.By("Creating subnet " + subnetName) - gatewayNodes := make([]string, 0, len(nodes.Items)) - for i := 0; i < 3 && i < len(nodes.Items); i++ { - gatewayNodes = append(gatewayNodes, nodes.Items[i].Name) - } - subnet = framework.MakeSubnet(subnetName, "", cidr, "", nil, gatewayNodes, nil) - subnet = subnetClient.CreateSync(subnet) - - ginkgo.By("Validating subnet finalizers") - framework.ExpectContainElement(subnet.Finalizers, util.ControllerName) - - ginkgo.By("Validating subnet spec fields") - framework.ExpectFalse(subnet.Spec.Default) - framework.ExpectEqual(subnet.Spec.Protocol, util.CheckProtocol(cidr)) - framework.ExpectEmpty(subnet.Spec.Namespaces) - framework.ExpectConsistOf(subnet.Spec.ExcludeIps, gateways) - framework.ExpectEqual(subnet.Spec.Gateway, strings.Join(gateways, ",")) - framework.ExpectEqual(subnet.Spec.GatewayType, apiv1.GWCentralizedType) - framework.ExpectConsistOf(strings.Split(subnet.Spec.GatewayNode, ","), gatewayNodes) - framework.ExpectFalse(subnet.Spec.NatOutgoing) - framework.ExpectFalse(subnet.Spec.Private) - framework.ExpectEmpty(subnet.Spec.AllowSubnets) - - ginkgo.By("Validating subnet status fields") - framework.ExpectContainElement(gatewayNodes, subnet.Status.ActivateGateway) - framework.ExpectZero(subnet.Status.V4UsingIPs) - framework.ExpectZero(subnet.Status.V6UsingIPs) - - if cidrV4 == "" { - framework.ExpectZero(subnet.Status.V4AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV4) - framework.ExpectEqual(subnet.Status.V4AvailableIPs, util.AddressCount(ipnet)-1) - } - if cidrV6 == "" { - framework.ExpectZero(subnet.Status.V6AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV6) - framework.ExpectEqual(subnet.Status.V6AvailableIPs, util.AddressCount(ipnet)-1) - } - }) - - framework.ConformanceIt("should be able to switch gateway mode to centralized", func() { - ginkgo.By("Getting nodes") - nodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - framework.ExpectNotEmpty(nodes.Items) - - ginkgo.By("Creating subnet " + subnetName) - subnet = framework.MakeSubnet(subnetName, "", cidr, "", nil, nil, nil) - subnet = subnetClient.CreateSync(subnet) - - ginkgo.By("Validating subnet finalizers") - framework.ExpectContainElement(subnet.Finalizers, util.ControllerName) - - ginkgo.By("Validating subnet spec fields") - framework.ExpectFalse(subnet.Spec.Default) - framework.ExpectEqual(subnet.Spec.Protocol, util.CheckProtocol(cidr)) - framework.ExpectEmpty(subnet.Spec.Namespaces) - framework.ExpectConsistOf(subnet.Spec.ExcludeIps, gateways) - framework.ExpectEqual(subnet.Spec.Gateway, strings.Join(gateways, ",")) - framework.ExpectEqual(subnet.Spec.GatewayType, apiv1.GWDistributedType) - framework.ExpectEmpty(subnet.Spec.GatewayNode) - framework.ExpectFalse(subnet.Spec.NatOutgoing) - framework.ExpectFalse(subnet.Spec.Private) - framework.ExpectEmpty(subnet.Spec.AllowSubnets) - - ginkgo.By("Validating subnet status fields") - framework.ExpectEmpty(subnet.Status.ActivateGateway) - framework.ExpectZero(subnet.Status.V4UsingIPs) - framework.ExpectZero(subnet.Status.V6UsingIPs) - - if cidrV4 == "" { - framework.ExpectZero(subnet.Status.V4AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV4) - framework.ExpectEqual(subnet.Status.V4AvailableIPs, util.AddressCount(ipnet)-1) - } - if cidrV6 == "" { - framework.ExpectZero(subnet.Status.V6AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV6) - framework.ExpectEqual(subnet.Status.V6AvailableIPs, util.AddressCount(ipnet)-1) - } - - ginkgo.By("Converting gateway mode to centralized") - gatewayNodes := make([]string, 0, len(nodes.Items)) - for i := 0; i < 3 && i < len(nodes.Items); i++ { - gatewayNodes = append(gatewayNodes, nodes.Items[i].Name) - } - modifiedSubnet := subnet.DeepCopy() - modifiedSubnet.Spec.GatewayNode = strings.Join(gatewayNodes, ",") - modifiedSubnet.Spec.GatewayType = apiv1.GWCentralizedType - subnet = subnetClient.PatchSync(subnet, modifiedSubnet) - - ginkgo.By("Validating subnet finalizers") - framework.ExpectContainElement(subnet.ObjectMeta.Finalizers, util.ControllerName) - - ginkgo.By("Validating subnet spec fields") - framework.ExpectFalse(subnet.Spec.Default) - framework.ExpectEqual(subnet.Spec.Protocol, util.CheckProtocol(cidr)) - framework.ExpectEmpty(subnet.Spec.Namespaces) - framework.ExpectConsistOf(subnet.Spec.ExcludeIps, gateways) - framework.ExpectEqual(subnet.Spec.Gateway, strings.Join(gateways, ",")) - framework.ExpectEqual(subnet.Spec.GatewayType, apiv1.GWCentralizedType) - framework.ExpectConsistOf(strings.Split(subnet.Spec.GatewayNode, ","), gatewayNodes) - framework.ExpectFalse(subnet.Spec.NatOutgoing) - framework.ExpectFalse(subnet.Spec.Private) - framework.ExpectEmpty(subnet.Spec.AllowSubnets) - - ginkgo.By("Validating subnet status fields") - framework.ExpectContainElement(gatewayNodes, subnet.Status.ActivateGateway) - framework.ExpectZero(subnet.Status.V4UsingIPs) - framework.ExpectZero(subnet.Status.V6UsingIPs) - - if cidrV4 == "" { - framework.ExpectZero(subnet.Status.V4AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV4) - framework.ExpectEqual(subnet.Status.V4AvailableIPs, util.AddressCount(ipnet)-1) - } - if cidrV6 == "" { - framework.ExpectZero(subnet.Status.V6AvailableIPs) - } else { - _, ipnet, _ := net.ParseCIDR(cidrV6) - framework.ExpectEqual(subnet.Status.V6AvailableIPs, util.AddressCount(ipnet)-1) - } - }) - - framework.ConformanceIt("should support distributed external egress gateway", func() { - ginkgo.By("Getting nodes") - nodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - framework.ExpectNotEmpty(nodes.Items) - - clusterName, ok := kind.IsKindProvided(nodes.Items[0].Spec.ProviderID) - if !ok { - ginkgo.Skip("external egress gateway spec only runs in clusters created by kind") - } - - ginkgo.By("Getting docker network used by kind") - network, err := docker.NetworkInspect(kind.NetworkName) - framework.ExpectNoError(err) - - ginkgo.By("Determine external egress gateway addresses") - gateways := make([]string, 0, 2) - for _, config := range network.IPAM.Config { - if config.Subnet != "" { - switch util.CheckProtocol(config.Subnet) { - case apiv1.ProtocolIPv4: - if cidrV4 != "" { - gateway, err := util.LastIP(config.Subnet) - framework.ExpectNoError(err) - gateways = append(gateways, gateway) - } - case apiv1.ProtocolIPv6: - if cidrV6 != "" { - gateway, err := util.LastIP(config.Subnet) - framework.ExpectNoError(err) - gateways = append(gateways, gateway) - } - } - } - } - - ginkgo.By("Creating subnet " + subnetName) - prPriority := 1000 + rand.Intn(1000) - prTable := 1000 + rand.Intn(1000) - subnet = framework.MakeSubnet(subnetName, "", cidr, "", nil, nil, nil) - subnet.Spec.ExternalEgressGateway = strings.Join(gateways, ",") - subnet.Spec.PolicyRoutingPriority = uint32(prPriority) - subnet.Spec.PolicyRoutingTableID = uint32(prTable) - subnet = subnetClient.CreateSync(subnet) - - ginkgo.By("Creating pod") - podName := "pod-" + framework.RandomSuffix() - pod := framework.MakePod(namespaceName, podName, nil, nil, "", nil, nil) - pod = podClient.CreateSync(pod) - - ginkgo.By("Getting kind nodes") - kindNodes, err := kind.ListNodes(clusterName, "") - framework.ExpectNoError(err) - framework.ExpectNotEmpty(kindNodes) - - for _, node := range kindNodes { - ginkgo.By("Getting ip rules in node " + node.Name()) - rules, err := iproute.RuleShow("", node.Exec) - framework.ExpectNoError(err) - - ginkgo.By("Checking ip rules in node " + node.Name()) - podIPs := make([]string, 0, len(pod.Status.PodIPs)) - for _, podIP := range pod.Status.PodIPs { - podIPs = append(podIPs, podIP.IP) - } - for _, rule := range rules { - if rule.Priority == prPriority && - rule.Table == strconv.Itoa(prTable) { - framework.ExpectEqual(pod.Spec.NodeName, node.Name()) - framework.ExpectContainElement(podIPs, rule.Src) - framework.ExpectEqual(rule.SrcLen, 0) - } - } - - if pod.Spec.NodeName != node.Name() { - continue - } - - ginkgo.By("Getting ip routes in node " + node.Name()) - routes, err := iproute.RouteShow(strconv.Itoa(prTable), "", node.Exec) - framework.ExpectNoError(err) - - ginkgo.By("Checking ip routes in node " + node.Name()) - framework.ExpectHaveLen(routes, len(gateways)) - nexthops := make([]string, 0, 2) - for _, route := range routes { - framework.ExpectEqual(route.Dst, "default") - nexthops = append(nexthops, route.Gateway) - } - framework.ExpectConsistOf(nexthops, gateways) - } - }) - - framework.ConformanceIt("should support centralized external egress gateway", func() { - ginkgo.By("Getting nodes") - nodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - framework.ExpectNotEmpty(nodes.Items) - - clusterName, ok := kind.IsKindProvided(nodes.Items[0].Spec.ProviderID) - if !ok { - ginkgo.Skip("external egress gateway spec only runs in clusters created by kind") - } - - ginkgo.By("Getting docker network used by kind") - network, err := docker.NetworkInspect(kind.NetworkName) - framework.ExpectNoError(err) - - ginkgo.By("Determine external egress gateway addresses") - cidrs := make([]string, 0, 2) - gateways := make([]string, 0, 2) - for _, config := range network.IPAM.Config { - if config.Subnet != "" { - switch util.CheckProtocol(config.Subnet) { - case apiv1.ProtocolIPv4: - if cidrV4 != "" { - gateway, err := util.LastIP(config.Subnet) - framework.ExpectNoError(err) - cidrs = append(cidrs, cidrV4) - gateways = append(gateways, gateway) - } - case apiv1.ProtocolIPv6: - if cidrV6 != "" { - gateway, err := util.LastIP(config.Subnet) - framework.ExpectNoError(err) - cidrs = append(cidrs, cidrV6) - gateways = append(gateways, gateway) - } - } - } - } - - ginkgo.By("Creating subnet " + subnetName) - gatewayNodes := make([]string, 0, len(nodes.Items)) - for i := 0; i < 3 && i < len(nodes.Items); i++ { - gatewayNodes = append(gatewayNodes, nodes.Items[i].Name) - } - prPriority := 1000 + rand.Intn(1000) - prTable := 1000 + rand.Intn(1000) - subnet = framework.MakeSubnet(subnetName, "", cidr, "", nil, gatewayNodes, nil) - subnet.Spec.ExternalEgressGateway = strings.Join(gateways, ",") - subnet.Spec.PolicyRoutingPriority = uint32(prPriority) - subnet.Spec.PolicyRoutingTableID = uint32(prTable) - subnet = subnetClient.CreateSync(subnet) - - ginkgo.By("Getting kind nodes") - kindNodes, err := kind.ListNodes(clusterName, "") - framework.ExpectNoError(err) - framework.ExpectNotEmpty(kindNodes) - - for _, node := range kindNodes { - shouldHavePolicyRoute := util.ContainsString(gatewayNodes, node.Name()) - ginkgo.By("Getting ip rules in node " + node.Name()) - rules, err := iproute.RuleShow("", node.Exec) - framework.ExpectNoError(err) - - ginkgo.By("Checking ip rules in node " + node.Name()) - var found int - for _, rule := range rules { - if rule.Priority == prPriority && - rule.Table == strconv.Itoa(prTable) { - framework.ExpectContainElement(cidrs, fmt.Sprintf("%s/%d", rule.Src, rule.SrcLen)) - found++ - } - } - if !shouldHavePolicyRoute { - framework.ExpectZero(found) - continue - } - framework.ExpectEqual(found, len(gateways)) - - ginkgo.By("Getting ip routes in node " + node.Name()) - routes, err := iproute.RouteShow(strconv.Itoa(prTable), "", node.Exec) - framework.ExpectNoError(err) - - ginkgo.By("Checking ip routes in node " + node.Name()) - framework.ExpectHaveLen(routes, len(gateways)) - nexthops := make([]string, 0, 2) - for _, route := range routes { - framework.ExpectEqual(route.Dst, "default") - nexthops = append(nexthops, route.Gateway) - } - framework.ExpectConsistOf(nexthops, gateways) - } - }) -}) diff --git a/test/e2e/kube-ovn/underlay/underlay.go b/test/e2e/kube-ovn/underlay/underlay.go deleted file mode 100644 index 69341edde2a..00000000000 --- a/test/e2e/kube-ovn/underlay/underlay.go +++ /dev/null @@ -1,729 +0,0 @@ -package underlay - -import ( - "fmt" - "net" - "os/exec" - "strconv" - "strings" - "time" - - dockertypes "github.com/docker/docker/api/types" - "github.com/onsi/ginkgo/v2" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clientset "k8s.io/client-go/kubernetes" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - - apiv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" - "github.com/kubeovn/kube-ovn/test/e2e/framework/docker" - "github.com/kubeovn/kube-ovn/test/e2e/framework/iproute" - "github.com/kubeovn/kube-ovn/test/e2e/framework/kind" -) - -const dockerNetworkName = "kube-ovn-vlan" -const curlListenPort = 8081 - -func makeProviderNetwork(providerNetworkName string, exchangeLinkName bool, linkMap map[string]*iproute.Link) *apiv1.ProviderNetwork { - var defaultInterface string - customInterfaces := make(map[string][]string, 0) - for node, link := range linkMap { - if !strings.ContainsRune(node, '-') { - continue - } - - if defaultInterface == "" { - defaultInterface = link.IfName - } else if link.IfName != defaultInterface { - customInterfaces[link.IfName] = append(customInterfaces[link.IfName], node) - } - } - - return framework.MakeProviderNetwork(providerNetworkName, exchangeLinkName, defaultInterface, customInterfaces, nil) -} - -var _ = framework.SerialDescribe("[group:underlay]", func() { - f := framework.NewDefaultFramework("underlay") - - var skip bool - var itFn func(bool) - var cs clientset.Interface - var nodeNames []string - var clusterName, providerNetworkName, vlanName, subnetName, podName, namespaceName, u2oPodNameUnderlay, u2oOverlaySubnetName, u2oPodNameOverlay string - var linkMap map[string]*iproute.Link - var routeMap map[string][]iproute.Route - var eventClient *framework.EventClient - var podClient *framework.PodClient - var subnetClient *framework.SubnetClient - var vlanClient *framework.VlanClient - var providerNetworkClient *framework.ProviderNetworkClient - var dockerNetwork *dockertypes.NetworkResource - var containerID string - var image string - - ginkgo.BeforeEach(func() { - cs = f.ClientSet - eventClient = f.EventClient() - podClient = f.PodClient() - subnetClient = f.SubnetClient() - vlanClient = f.VlanClient() - providerNetworkClient = f.ProviderNetworkClient() - namespaceName = f.Namespace.Name - podName = "pod-" + framework.RandomSuffix() - subnetName = "subnet-" + framework.RandomSuffix() - vlanName = "vlan-" + framework.RandomSuffix() - providerNetworkName = "pn-" + framework.RandomSuffix() - containerID = "" - if image == "" { - image = framework.GetKubeOvnImage(cs) - } - u2oPodNameUnderlay = "" - u2oOverlaySubnetName = "" - u2oPodNameOverlay = "" - - if skip { - ginkgo.Skip("underlay spec only runs on kind clusters") - } - - if clusterName == "" { - ginkgo.By("Getting k8s nodes") - k8sNodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - cluster, ok := kind.IsKindProvided(k8sNodes.Items[0].Spec.ProviderID) - if !ok { - skip = true - ginkgo.Skip("underlay spec only runs on kind clusters") - } - clusterName = cluster - } - - if dockerNetwork == nil { - ginkgo.By("Ensuring docker network " + dockerNetworkName + " exists") - network, err := docker.NetworkCreate(dockerNetworkName, true, true) - framework.ExpectNoError(err, "creating docker network "+dockerNetworkName) - dockerNetwork = network - } - - ginkgo.By("Getting kind nodes") - nodes, err := kind.ListNodes(clusterName, "") - framework.ExpectNoError(err, "getting nodes in kind cluster") - framework.ExpectNotEmpty(nodes) - - ginkgo.By("Connecting nodes to the docker network") - err = kind.NetworkConnect(dockerNetwork.ID, nodes) - framework.ExpectNoError(err, "connecting nodes to network "+dockerNetworkName) - - ginkgo.By("Getting node links that belong to the docker network") - nodes, err = kind.ListNodes(clusterName, "") - framework.ExpectNoError(err, "getting nodes in kind cluster") - linkMap = make(map[string]*iproute.Link, len(nodes)) - routeMap = make(map[string][]iproute.Route, len(nodes)) - nodeNames = make([]string, 0, len(nodes)) - for _, node := range nodes { - links, err := node.ListLinks() - framework.ExpectNoError(err, "failed to list links on node %s: %v", node.Name(), err) - - routes, err := node.ListRoutes(true) - framework.ExpectNoError(err, "failed to list routes on node %s: %v", node.Name(), err) - - for _, link := range links { - if link.Address == node.NetworkSettings.Networks[dockerNetworkName].MacAddress { - linkMap[node.ID] = &link - break - } - } - framework.ExpectHaveKey(linkMap, node.ID) - - link := linkMap[node.ID] - for _, route := range routes { - if route.Dev == link.IfName { - r := iproute.Route{ - Dst: route.Dst, - Gateway: route.Gateway, - Dev: route.Dev, - Flags: route.Flags, - } - routeMap[node.ID] = append(routeMap[node.ID], r) - } - } - framework.ExpectHaveKey(linkMap, node.ID) - - linkMap[node.Name()] = linkMap[node.ID] - routeMap[node.Name()] = routeMap[node.ID] - nodeNames = append(nodeNames, node.Name()) - } - - itFn = func(exchangeLinkName bool) { - ginkgo.By("Creating provider network") - pn := makeProviderNetwork(providerNetworkName, exchangeLinkName, linkMap) - pn = providerNetworkClient.CreateSync(pn) - - ginkgo.By("Getting k8s nodes") - k8sNodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - ginkgo.By("Validating node labels") - for _, node := range k8sNodes.Items { - link := linkMap[node.Name] - framework.ExpectHaveKeyWithValue(node.Labels, fmt.Sprintf(util.ProviderNetworkInterfaceTemplate, providerNetworkName), link.IfName) - framework.ExpectHaveKeyWithValue(node.Labels, fmt.Sprintf(util.ProviderNetworkReadyTemplate, providerNetworkName), "true") - framework.ExpectHaveKeyWithValue(node.Labels, fmt.Sprintf(util.ProviderNetworkMtuTemplate, providerNetworkName), strconv.Itoa(link.Mtu)) - framework.ExpectNotHaveKey(node.Labels, fmt.Sprintf(util.ProviderNetworkExcludeTemplate, providerNetworkName)) - } - - ginkgo.By("Validating provider network status") - framework.ExpectEqual(pn.Status.Ready, true, "field .status.ready should be true") - framework.ExpectConsistOf(pn.Status.ReadyNodes, nodeNames) - framework.ExpectEmpty(pn.Status.Vlans) - - ginkgo.By("Getting kind nodes") - kindNodes, err := kind.ListNodes(clusterName, "") - framework.ExpectNoError(err) - - ginkgo.By("Validating node links") - linkNameMap := make(map[string]string, len(kindNodes)) - bridgeName := util.ExternalBridgeName(providerNetworkName) - for _, node := range kindNodes { - if exchangeLinkName { - bridgeName = linkMap[node.ID].IfName - } - - links, err := node.ListLinks() - framework.ExpectNoError(err, "failed to list links on node %s: %v", node.Name(), err) - - var port, bridge *iproute.Link - for i, link := range links { - if link.IfIndex == linkMap[node.ID].IfIndex { - port = &links[i] - } else if link.IfName == bridgeName { - bridge = &links[i] - } - if port != nil && bridge != nil { - break - } - } - framework.ExpectNotNil(port) - framework.ExpectEqual(port.Address, linkMap[node.ID].Address) - framework.ExpectEqual(port.Mtu, linkMap[node.ID].Mtu) - framework.ExpectEqual(port.Master, "ovs-system") - framework.ExpectEqual(port.OperState, "UP") - if exchangeLinkName { - framework.ExpectEqual(port.IfName, util.ExternalBridgeName(providerNetworkName)) - } - - framework.ExpectNotNil(bridge) - framework.ExpectEqual(bridge.LinkInfo.InfoKind, "openvswitch") - framework.ExpectEqual(bridge.Address, port.Address) - framework.ExpectEqual(bridge.Mtu, port.Mtu) - framework.ExpectEqual(bridge.OperState, "UNKNOWN") - framework.ExpectContainElement(bridge.Flags, "UP") - - framework.ExpectEmpty(port.NonLinkLocalAddresses()) - framework.ExpectConsistOf(bridge.NonLinkLocalAddresses(), linkMap[node.ID].NonLinkLocalAddresses()) - - linkNameMap[node.ID] = port.IfName - } - - ginkgo.By("Validating node routes") - for _, node := range kindNodes { - if exchangeLinkName { - bridgeName = linkMap[node.ID].IfName - } - - routes, err := node.ListRoutes(true) - framework.ExpectNoError(err, "failed to list routes on node %s: %v", node.Name(), err) - - var portRoutes, bridgeRoutes []iproute.Route - for _, route := range routes { - r := iproute.Route{ - Dst: route.Dst, - Gateway: route.Gateway, - Dev: route.Dev, - Flags: route.Flags, - } - if route.Dev == linkNameMap[node.ID] { - portRoutes = append(portRoutes, r) - } else if route.Dev == bridgeName { - r.Dev = linkMap[node.ID].IfName - bridgeRoutes = append(bridgeRoutes, r) - } - } - - framework.ExpectEmpty(portRoutes, "no routes should exists on provider link") - framework.ExpectConsistOf(bridgeRoutes, routeMap[node.ID]) - } - } - }) - ginkgo.AfterEach(func() { - if containerID != "" { - ginkgo.By("Deleting container " + containerID) - err := docker.ContainerRemove(containerID) - framework.ExpectNoError(err) - } - - ginkgo.By("Deleting pod " + podName) - podClient.DeleteSync(podName) - - if u2oPodNameUnderlay != "" { - ginkgo.By("Deleting underlay pod " + u2oPodNameUnderlay) - podClient.DeleteSync(u2oPodNameUnderlay) - - ginkgo.By("Deleting overlay pod " + u2oPodNameOverlay) - podClient.DeleteSync(u2oPodNameOverlay) - - ginkgo.By("Deleting subnet " + u2oOverlaySubnetName) - subnetClient.DeleteSync(u2oOverlaySubnetName) - } - - ginkgo.By("Deleting subnet " + subnetName) - subnetClient.DeleteSync(subnetName) - - ginkgo.By("Deleting vlan " + vlanName) - vlanClient.Delete(vlanName, metav1.DeleteOptions{}) - - ginkgo.By("Deleting provider network") - providerNetworkClient.DeleteSync(providerNetworkName) - - ginkgo.By("Getting nodes") - nodes, err := kind.ListNodes(clusterName, "") - framework.ExpectNoError(err, "getting nodes in cluster") - - ginkgo.By("Waiting for ovs bridge to disappear") - deadline := time.Now().Add(time.Minute) - for _, node := range nodes { - err = node.WaitLinkToDisappear(util.ExternalBridgeName(providerNetworkName), 2*time.Second, deadline) - framework.ExpectNoError(err, "timed out waiting for ovs bridge to disappear in node %s", node.Name()) - } - - if dockerNetwork != nil { - ginkgo.By("Disconnecting nodes from the docker network") - err = kind.NetworkDisconnect(dockerNetwork.ID, nodes) - framework.ExpectNoError(err, "disconnecting nodes from network "+dockerNetworkName) - } - }) - - framework.ConformanceIt(`should be able to create provider network`, func() { - itFn(false) - }) - - framework.ConformanceIt(`should exchange link names`, func() { - f.SkipVersionPriorTo(1, 9, "Support for exchanging link names was introduced in v1.9") - - itFn(true) - }) - - framework.ConformanceIt("should keep pod mtu the same with node interface", func() { - ginkgo.By("Creating provider network") - pn := makeProviderNetwork(providerNetworkName, false, linkMap) - _ = providerNetworkClient.CreateSync(pn) - - ginkgo.By("Getting docker network " + dockerNetworkName) - network, err := docker.NetworkInspect(dockerNetworkName) - framework.ExpectNoError(err, "getting docker network "+dockerNetworkName) - - ginkgo.By("Creating vlan " + vlanName) - vlan := framework.MakeVlan(vlanName, providerNetworkName, 0) - _ = vlanClient.Create(vlan) - - ginkgo.By("Creating subnet " + subnetName) - cidr := make([]string, 0, 2) - gateway := make([]string, 0, 2) - for _, config := range dockerNetwork.IPAM.Config { - switch util.CheckProtocol(config.Subnet) { - case apiv1.ProtocolIPv4: - if f.ClusterIpFamily != "ipv6" { - cidr = append(cidr, config.Subnet) - gateway = append(gateway, config.Gateway) - } - case apiv1.ProtocolIPv6: - if f.ClusterIpFamily != "ipv4" { - cidr = append(cidr, config.Subnet) - gateway = append(gateway, config.Gateway) - } - } - } - excludeIPs := make([]string, 0, len(network.Containers)*2) - for _, container := range network.Containers { - if container.IPv4Address != "" && f.ClusterIpFamily != "ipv6" { - excludeIPs = append(excludeIPs, strings.Split(container.IPv4Address, "/")[0]) - } - if container.IPv6Address != "" && f.ClusterIpFamily != "ipv4" { - excludeIPs = append(excludeIPs, strings.Split(container.IPv6Address, "/")[0]) - } - } - subnet := framework.MakeSubnet(subnetName, vlanName, strings.Join(cidr, ","), strings.Join(gateway, ","), excludeIPs, nil, []string{namespaceName}) - _ = subnetClient.CreateSync(subnet) - - ginkgo.By("Creating pod " + podName) - cmd := []string{"sh", "-c", "sleep 600"} - pod := framework.MakePod(namespaceName, podName, nil, nil, image, cmd, nil) - _ = podClient.CreateSync(pod) - - ginkgo.By("Validating pod MTU") - links, err := iproute.AddressShow("eth0", func(cmd ...string) ([]byte, []byte, error) { - return framework.KubectlExec(namespaceName, podName, cmd...) - }) - framework.ExpectNoError(err) - framework.ExpectHaveLen(links, 1, "should get eth0 information") - framework.ExpectEqual(links[0].Mtu, docker.MTU) - }) - - framework.ConformanceIt("should be able to detect IPv4 address conflict", func() { - if f.ClusterIpFamily != "ipv4" { - ginkgo.Skip("Address conflict detection only supports IPv4") - } - f.SkipVersionPriorTo(1, 9, "Address conflict detection was introduced in v1.9") - - ginkgo.By("Creating provider network") - pn := makeProviderNetwork(providerNetworkName, false, linkMap) - _ = providerNetworkClient.CreateSync(pn) - - ginkgo.By("Getting docker network " + dockerNetworkName) - network, err := docker.NetworkInspect(dockerNetworkName) - framework.ExpectNoError(err, "getting docker network "+dockerNetworkName) - - containerName := "container-" + framework.RandomSuffix() - ginkgo.By("Creating container " + containerName) - cmd := []string{"sh", "-c", "sleep 600"} - containerInfo, err := docker.ContainerCreate(containerName, image, dockerNetworkName, cmd) - framework.ExpectNoError(err) - - ginkgo.By("Creating vlan " + vlanName) - vlan := framework.MakeVlan(vlanName, providerNetworkName, 0) - _ = vlanClient.Create(vlan) - - ginkgo.By("Creating subnet " + subnetName) - cidr := make([]string, 0, 2) - gateway := make([]string, 0, 2) - for _, config := range dockerNetwork.IPAM.Config { - if util.CheckProtocol(config.Subnet) == apiv1.ProtocolIPv4 { - cidr = append(cidr, config.Subnet) - gateway = append(gateway, config.Gateway) - break - } - } - excludeIPs := make([]string, 0, len(network.Containers)*2) - for _, container := range network.Containers { - if container.IPv4Address != "" { - excludeIPs = append(excludeIPs, strings.Split(container.IPv4Address, "/")[0]) - } - } - subnet := framework.MakeSubnet(subnetName, vlanName, strings.Join(cidr, ","), strings.Join(gateway, ","), excludeIPs, nil, []string{namespaceName}) - _ = subnetClient.CreateSync(subnet) - - ip := containerInfo.NetworkSettings.Networks[dockerNetworkName].IPAddress - mac := containerInfo.NetworkSettings.Networks[dockerNetworkName].MacAddress - ginkgo.By("Creating pod " + podName + " with IP address " + ip) - annotations := map[string]string{util.IpAddressAnnotation: ip} - pod := framework.MakePod(namespaceName, podName, nil, annotations, image, cmd, nil) - _ = podClient.Create(pod) - - ginkgo.By("Waiting for pod events") - events := eventClient.WaitToHaveEvent("Pod", podName, "Warning", "FailedCreatePodSandBox", "kubelet", "") - message := fmt.Sprintf("IP address %s has already been used by host with MAC %s", ip, mac) - var found bool - for _, event := range events { - if strings.Contains(event.Message, message) { - found = true - framework.Logf("Found pod event: %s", event.Message) - break - } - } - framework.ExpectTrue(found, "Address conflict should be reported in pod events") - }) - - framework.ConformanceIt("should support underlay to overlay subnet interconnection ", func() { - ginkgo.By("Creating provider network") - pn := makeProviderNetwork(providerNetworkName, false, linkMap) - _ = providerNetworkClient.CreateSync(pn) - - ginkgo.By("Getting docker network " + dockerNetworkName) - network, err := docker.NetworkInspect(dockerNetworkName) - framework.ExpectNoError(err, "getting docker network "+dockerNetworkName) - - ginkgo.By("Creating vlan " + vlanName) - vlan := framework.MakeVlan(vlanName, providerNetworkName, 0) - _ = vlanClient.Create(vlan) - - ginkgo.By("Creating underlay subnet " + subnetName) - underlayCidr := make([]string, 0, 2) - gateway := make([]string, 0, 2) - for _, config := range dockerNetwork.IPAM.Config { - switch util.CheckProtocol(config.Subnet) { - case apiv1.ProtocolIPv4: - if f.ClusterIpFamily != "ipv6" { - underlayCidr = append(underlayCidr, config.Subnet) - gateway = append(gateway, config.Gateway) - } - case apiv1.ProtocolIPv6: - if f.ClusterIpFamily != "ipv4" { - underlayCidr = append(underlayCidr, config.Subnet) - gateway = append(gateway, config.Gateway) - } - } - } - - excludeIPs := make([]string, 0, len(network.Containers)*2) - for _, container := range network.Containers { - if container.IPv4Address != "" && f.ClusterIpFamily != "ipv6" { - excludeIPs = append(excludeIPs, strings.Split(container.IPv4Address, "/")[0]) - } - if container.IPv6Address != "" && f.ClusterIpFamily != "ipv4" { - excludeIPs = append(excludeIPs, strings.Split(container.IPv6Address, "/")[0]) - } - } - - subnet := framework.MakeSubnet(subnetName, vlanName, strings.Join(underlayCidr, ","), strings.Join(gateway, ","), excludeIPs, nil, []string{namespaceName}) - subnet.Spec.U2OInterconnection = true - _ = subnetClient.CreateSync(subnet) - ginkgo.By("Creating underlay subnet pod") - annotations := map[string]string{ - util.LogicalSwitchAnnotation: subnetName, - } - - u2oPodNameUnderlay = "pod-" + framework.RandomSuffix() - args := []string{"netexec", "--http-port", strconv.Itoa(curlListenPort)} - underlayPod := framework.MakePod(namespaceName, u2oPodNameUnderlay, nil, annotations, framework.AgnhostImage, nil, args) - underlayPod.Spec.Containers[0].ImagePullPolicy = corev1.PullIfNotPresent - - originUnderlayPod := underlayPod.DeepCopy() - underlayPod = podClient.CreateSync(underlayPod) - - // get subnet again because ipam change - subnet = subnetClient.Get(subnetName) - - ginkgo.By("Creating overlay subnet") - u2oOverlaySubnetName = "subnet-" + framework.RandomSuffix() - cidr := framework.RandomCIDR(f.ClusterIpFamily) - - overlaySubnet := framework.MakeSubnet(u2oOverlaySubnetName, "", cidr, "", nil, nil, nil) - overlaySubnet = subnetClient.CreateSync(overlaySubnet) - - ginkgo.By("Creating overlay subnet pod") - u2oPodNameOverlay = "pod-" + framework.RandomSuffix() - overlayAnnotations := map[string]string{ - util.LogicalSwitchAnnotation: overlaySubnet.Name, - } - args = []string{"netexec", "--http-port", strconv.Itoa(curlListenPort)} - overlayPod := framework.MakePod(namespaceName, u2oPodNameOverlay, nil, overlayAnnotations, framework.AgnhostImage, nil, args) - overlayPod.Spec.Containers[0].ImagePullPolicy = corev1.PullIfNotPresent - overlayPod = podClient.CreateSync(overlayPod) - - ginkgo.By("step1: Enable u2o check") - checkU2OItems(true, subnet, underlayPod, overlayPod) - - ginkgo.By("step2: Disable u2o check") - podClient.DeleteSync(u2oPodNameUnderlay) - - subnet = subnetClient.Get(subnetName) - modifiedSubnet := subnet.DeepCopy() - modifiedSubnet.Spec.U2OInterconnection = false - subnetClient.PatchSync(subnet, modifiedSubnet) - time.Sleep(5 * time.Second) - - underlayPod = podClient.CreateSync(originUnderlayPod) - subnet = subnetClient.Get(subnetName) - checkU2OItems(false, subnet, underlayPod, overlayPod) - - ginkgo.By("step3: recover enable u2o check") - podClient.DeleteSync(u2oPodNameUnderlay) - - subnet = subnetClient.Get(subnetName) - modifiedSubnet = subnet.DeepCopy() - modifiedSubnet.Spec.U2OInterconnection = true - subnetClient.PatchSync(subnet, modifiedSubnet) - time.Sleep(5 * time.Second) - underlayPod = podClient.CreateSync(originUnderlayPod) - subnet = subnetClient.Get(subnetName) - checkU2OItems(true, subnet, underlayPod, overlayPod) - - ginkgo.By("step4: check if kube-ovn-controller restart") - restartCmd := "kubectl rollout restart deployment kube-ovn-controller -n kube-system" - _, err = exec.Command("bash", "-c", restartCmd).CombinedOutput() - framework.ExpectNoError(err, "restart kube-ovn-controller") - checkU2OItems(true, subnet, underlayPod, overlayPod) - - ginkgo.By("step5: Disable u2o check after restart kube-controller") - podClient.DeleteSync(u2oPodNameUnderlay) - - subnet = subnetClient.Get(subnetName) - modifiedSubnet = subnet.DeepCopy() - modifiedSubnet.Spec.U2OInterconnection = false - subnetClient.PatchSync(subnet, modifiedSubnet) - time.Sleep(5 * time.Second) - underlayPod = podClient.CreateSync(originUnderlayPod) - subnet = subnetClient.Get(subnetName) - checkU2OItems(false, subnet, underlayPod, overlayPod) - - ginkgo.By("step6: recover enable u2o check after restart kube-controller") - podClient.DeleteSync(u2oPodNameUnderlay) - - subnet = subnetClient.Get(subnetName) - modifiedSubnet = subnet.DeepCopy() - modifiedSubnet.Spec.U2OInterconnection = true - subnetClient.PatchSync(subnet, modifiedSubnet) - time.Sleep(5 * time.Second) - underlayPod = podClient.CreateSync(originUnderlayPod) - subnet = subnetClient.Get(subnetName) - checkU2OItems(true, subnet, underlayPod, overlayPod) - }) -}) - -func checkU2OItems(isEnableU2O bool, subnet *apiv1.Subnet, underlayPod, overlayPod *corev1.Pod) { - - ginkgo.By("checking underlay subnet's u2o interconnect ip") - if isEnableU2O { - framework.ExpectTrue(subnet.Spec.U2OInterconnection) - framework.ExpectIPInCIDR(subnet.Status.U2OInterconnectionIP, subnet.Spec.CIDRBlock) - } else { - framework.ExpectFalse(subnet.Spec.U2OInterconnection) - framework.ExpectEmpty(subnet.Status.U2OInterconnectionIP) - } - - v4gw, v6gw := util.SplitStringIP(subnet.Spec.Gateway) - - underlayCidr := strings.Split(subnet.Spec.CIDRBlock, ",") - for _, cidr := range underlayCidr { - var protocolStr, gw string - if util.CheckProtocol(cidr) == apiv1.ProtocolIPv4 { - protocolStr = "ip4" - gw = v4gw - ginkgo.By("checking underlay subnet's using ips") - if isEnableU2O { - framework.ExpectEqual(int(subnet.Status.V4UsingIPs), 2) - } else { - framework.ExpectEqual(int(subnet.Status.V4UsingIPs), 1) - } - } else { - protocolStr = "ip6" - gw = v6gw - if isEnableU2O { - framework.ExpectEqual(int(subnet.Status.V6UsingIPs), 2) - } else { - framework.ExpectEqual(int(subnet.Status.V6UsingIPs), 1) - } - } - agName := strings.Replace(fmt.Sprintf("%s.u2o_exclude_ip.%s", subnet.Name, protocolStr), "-", ".", -1) - ginkgo.By(fmt.Sprintf("checking underlay subnet's policy1 route %s", protocolStr)) - - hitPolicyStr := fmt.Sprintf("%d %s.dst == %s && %s.dst != $%s allow", util.SubnetRouterPolicyPriority, protocolStr, cidr, protocolStr, agName) - checkPolicy(hitPolicyStr, isEnableU2O) - - ginkgo.By(fmt.Sprintf("checking underlay subnet's policy2 route %s", protocolStr)) - hitPolicyStr = fmt.Sprintf("%d %s.dst == $%s && %s.src == %s reroute %s", util.SubnetRouterPolicyPriority, protocolStr, agName, protocolStr, cidr, gw) - - checkPolicy(hitPolicyStr, isEnableU2O) - - ginkgo.By(fmt.Sprintf("checking underlay subnet's policy3 route %s", protocolStr)) - hitPolicyStr = fmt.Sprintf("%d %s.src == %s reroute %s", util.GatewayRouterPolicyPriority, protocolStr, cidr, gw) - checkPolicy(hitPolicyStr, isEnableU2O) - } - - ginkgo.By("checking underlay pod's ip route's nexthop equal the u2o interconnection ip") - routes, err := iproute.RouteShow("", "eth0", func(cmd ...string) ([]byte, []byte, error) { - return framework.KubectlExec(underlayPod.Namespace, underlayPod.Name, cmd...) - }) - framework.ExpectNoError(err) - framework.ExpectNotEmpty(routes) - - v4InterconnIp, v6InterconnIp := util.SplitStringIP(subnet.Status.U2OInterconnectionIP) - - isV4DefaultRouteExist := false - isV6DefaultRouteExist := false - for _, route := range routes { - if route.Dst == "default" { - if util.CheckProtocol(route.Gateway) == apiv1.ProtocolIPv4 { - if isEnableU2O { - framework.ExpectEqual(route.Gateway, v4InterconnIp) - } else { - framework.ExpectEqual(route.Gateway, v4gw) - } - isV4DefaultRouteExist = true - } else { - if isEnableU2O { - framework.ExpectEqual(route.Gateway, v6InterconnIp) - } else { - framework.ExpectEqual(route.Gateway, v6gw) - } - isV6DefaultRouteExist = true - } - } - } - - if subnet.Spec.Protocol == apiv1.ProtocolIPv4 { - framework.ExpectTrue(isV4DefaultRouteExist) - } else if subnet.Spec.Protocol == apiv1.ProtocolIPv6 { - framework.ExpectTrue(isV6DefaultRouteExist) - } else if subnet.Spec.Protocol == apiv1.ProtocolDual { - framework.ExpectTrue(isV4DefaultRouteExist) - framework.ExpectTrue(isV6DefaultRouteExist) - } - - UPodIPs := underlayPod.Status.PodIPs - OPodIPs := overlayPod.Status.PodIPs - var v4UPodIP, v4OPodIP, v6UPodIP, v6OPodIP string - for _, UPodIP := range UPodIPs { - if util.CheckProtocol(UPodIP.IP) == apiv1.ProtocolIPv4 { - v4UPodIP = UPodIP.IP - } else { - v6UPodIP = UPodIP.IP - } - } - for _, OPodIP := range OPodIPs { - if util.CheckProtocol(OPodIP.IP) == apiv1.ProtocolIPv4 { - v4OPodIP = OPodIP.IP - } else { - v6OPodIP = OPodIP.IP - } - } - - if v4UPodIP != "" && v4OPodIP != "" { - ginkgo.By("checking underlay pod access to overlay pod v4") - checkReachable(underlayPod.Name, underlayPod.Namespace, v4UPodIP, v4OPodIP, strconv.Itoa(curlListenPort), isEnableU2O) - - ginkgo.By("checking overlay pod access to underlay pod v4") - checkReachable(overlayPod.Name, overlayPod.Namespace, v4OPodIP, v4UPodIP, strconv.Itoa(curlListenPort), isEnableU2O) - } - - if v6UPodIP != "" && v6OPodIP != "" { - ginkgo.By("checking underlay pod access to overlay pod v6") - checkReachable(underlayPod.Name, underlayPod.Namespace, v6UPodIP, v6OPodIP, strconv.Itoa(curlListenPort), isEnableU2O) - - ginkgo.By("checking overlay pod access to underlay pod v6") - checkReachable(overlayPod.Name, overlayPod.Namespace, v6OPodIP, v6UPodIP, strconv.Itoa(curlListenPort), isEnableU2O) - } -} - -func checkReachable(podName, podNamespace, sourceIP, targetIP, targetPort string, expectReachable bool) { - ginkgo.By("checking curl reachable") - cmd := fmt.Sprintf("kubectl exec %s -n %s -- curl -q -s --connect-timeout 5 %s/clientip", podName, podNamespace, net.JoinHostPort(targetIP, targetPort)) - output, _ := exec.Command("bash", "-c", cmd).CombinedOutput() - outputStr := string(output) - if expectReachable { - client, _, err := net.SplitHostPort(strings.TrimSpace(outputStr)) - framework.ExpectNoError(err) - // check packet has not SNAT - framework.ExpectEqual(sourceIP, client) - } else { - isReachable := !strings.Contains(outputStr, "terminated with exit code") - framework.ExpectEqual(isReachable, expectReachable) - } -} - -func checkPolicy(hitPolicyStr string, expectPolicyExist bool) { - policyExist := false - output, _ := exec.Command("bash", "-c", "kubectl ko nbctl lr-policy-list ovn-cluster").CombinedOutput() - outputStr := string(output) - lines := strings.Split(outputStr, "\n") - for _, line := range lines { - if strings.Contains(strings.Join(strings.Fields(line), " "), hitPolicyStr) { - policyExist = true - break - } - - } - framework.ExpectEqual(policyExist, expectPolicyExist) -} diff --git a/test/e2e/lb-svc/e2e_test.go b/test/e2e/lb-svc/e2e_test.go deleted file mode 100644 index 40f043b619f..00000000000 --- a/test/e2e/lb-svc/e2e_test.go +++ /dev/null @@ -1,226 +0,0 @@ -package lb_svc - -import ( - "context" - "flag" - "fmt" - "math/big" - "math/rand" - "os" - "path/filepath" - "strings" - "testing" - "time" - - dockertypes "github.com/docker/docker/api/types" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" - "k8s.io/kubernetes/test/e2e" - k8sframework "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/framework/config" - "k8s.io/kubernetes/test/e2e/framework/deployment" - e2enode "k8s.io/kubernetes/test/e2e/framework/node" - - "github.com/onsi/ginkgo/v2" - - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" - "github.com/kubeovn/kube-ovn/test/e2e/framework/docker" - "github.com/kubeovn/kube-ovn/test/e2e/framework/kind" -) - -const subnetProvider = "lb-svc-attachment.kube-system" - -func init() { - klog.SetOutput(ginkgo.GinkgoWriter) - - // Register flags. - config.CopyFlags(config.Flags, flag.CommandLine) - k8sframework.RegisterCommonFlags(flag.CommandLine) - k8sframework.RegisterClusterFlags(flag.CommandLine) -} - -func TestE2E(t *testing.T) { - if k8sframework.TestContext.KubeConfig == "" { - k8sframework.TestContext.KubeConfig = filepath.Join(os.Getenv("HOME"), ".kube", "config") - } - k8sframework.AfterReadingAllFlags(&k8sframework.TestContext) - - e2e.RunE2ETests(t) -} - -func lbSvcDeploymentName(serviceName string) string { - return "lb-svc-" + serviceName -} - -var _ = framework.SerialDescribe("[group:lb-svc]", func() { - f := framework.NewDefaultFramework("lb-svc") - - var skip bool - var cs clientset.Interface - var subnetClient *framework.SubnetClient - var serviceClient *framework.ServiceClient - var clusterName, subnetName, namespaceName, serviceName string - var dockerNetwork *dockertypes.NetworkResource - var cidr, gateway string - ginkgo.BeforeEach(func() { - cs = f.ClientSet - subnetClient = f.SubnetClient() - serviceClient = f.ServiceClient() - namespaceName = f.Namespace.Name - subnetName = "subnet-" + framework.RandomSuffix() - serviceName = "service-" + framework.RandomSuffix() - - if skip { - ginkgo.Skip("lb svc spec only runs on kind clusters") - } - - if clusterName == "" { - ginkgo.By("Getting k8s nodes") - k8sNodes, err := e2enode.GetReadySchedulableNodes(cs) - framework.ExpectNoError(err) - - cluster, ok := kind.IsKindProvided(k8sNodes.Items[0].Spec.ProviderID) - if !ok { - skip = true - ginkgo.Skip("lb svc spec only runs on kind clusters") - } - clusterName = cluster - } - - if dockerNetwork == nil { - ginkgo.By("Getting docker network " + kind.NetworkName) - network, err := docker.NetworkInspect(kind.NetworkName) - framework.ExpectNoError(err, "getting docker network "+kind.NetworkName) - dockerNetwork = network - } - - ginkgo.By("Creating subnet " + subnetName) - for _, config := range dockerNetwork.IPAM.Config { - if !strings.ContainsRune(config.Subnet, ':') { - cidr = config.Subnet - gateway = config.Gateway - break - } - } - excludeIPs := make([]string, 0, len(dockerNetwork.Containers)) - for _, container := range dockerNetwork.Containers { - if container.IPv4Address != "" { - excludeIPs = append(excludeIPs, container.IPv4Address) - } - } - subnet := framework.MakeSubnet(subnetName, "", cidr, gateway, excludeIPs, nil, []string{namespaceName}) - subnet.Spec.Provider = subnetProvider - _ = subnetClient.Create(subnet) - }) - ginkgo.AfterEach(func() { - ginkgo.By("Deleting service " + serviceName) - serviceClient.DeleteSync(serviceName) - - ginkgo.By("Deleting subnet " + subnetName) - subnetClient.DeleteSync(subnetName) - }) - - framework.ConformanceIt("should allocate dynamic external IP for service", func() { - ginkgo.By("Creating service " + serviceName) - ports := []corev1.ServicePort{{ - Name: "tcp", - Protocol: corev1.ProtocolTCP, - Port: 80, - TargetPort: intstr.FromInt(80), - }} - annotations := map[string]string{ - subnetProvider + ".kubernetes.io/logical_switch": subnetName, - } - selector := map[string]string{"app": "lb-svc-dynamic"} - service := framework.MakeService(serviceName, corev1.ServiceTypeLoadBalancer, annotations, selector, ports, corev1.ServiceAffinityNone) - _ = serviceClient.CreateSync(service) - - ginkgo.By("Waiting for 10 seconds") - time.Sleep(10 * time.Second) - - deploymentName := lbSvcDeploymentName(serviceName) - ginkgo.By("Getting deployment " + deploymentName) - deploy, err := cs.AppsV1().Deployments(namespaceName).Get(context.Background(), deploymentName, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get deployment") - framework.ExpectEqual(deploy.Status.AvailableReplicas, int32(1)) - - ginkgo.By("Waiting for deployment " + deploymentName + " to be ready") - err = deployment.WaitForDeploymentComplete(cs, deploy) - framework.ExpectNoError(err, "deployment failed to complete") - - ginkgo.By("Getting pods for deployment " + deploymentName) - pods, err := deployment.GetPodsForDeployment(cs, deploy) - framework.ExpectNoError(err) - framework.ExpectHaveLen(pods.Items, 1) - - ginkgo.By("Checking pod annotations") - key := fmt.Sprintf(util.AllocatedAnnotationTemplate, subnetProvider) - framework.ExpectHaveKeyWithValue(pods.Items[0].Annotations, key, "true") - cidrKey := fmt.Sprintf(util.CidrAnnotationTemplate, subnetProvider) - ipKey := fmt.Sprintf(util.IpAddressAnnotationTemplate, subnetProvider) - framework.ExpectHaveKey(pods.Items[0].Annotations, cidrKey) - framework.ExpectHaveKey(pods.Items[0].Annotations, ipKey) - cidr := pods.Items[0].Annotations[cidrKey] - ip := pods.Items[0].Annotations[ipKey] - framework.ExpectTrue(util.CIDRContainIP(cidr, ip)) - - ginkgo.By("Checking service external IP") - service = serviceClient.Get(serviceName) - framework.ExpectNotEmpty(service.Status.LoadBalancer.Ingress) - framework.ExpectEqual(service.Status.LoadBalancer.Ingress[0].IP, ip) - }) - - framework.ConformanceIt("should allocate static external IP for service", func() { - ginkgo.By("Creating service " + serviceName) - base := util.Ip2BigInt(gateway) - lbIP := util.BigInt2Ip(base.Add(base, big.NewInt(50+rand.Int63n(50)))) - ports := []corev1.ServicePort{{ - Name: "tcp", - Protocol: corev1.ProtocolTCP, - Port: 80, - TargetPort: intstr.FromInt(80), - }} - annotations := map[string]string{ - subnetProvider + ".kubernetes.io/logical_switch": subnetName, - } - selector := map[string]string{"app": "lb-svc-static"} - service := framework.MakeService(serviceName, corev1.ServiceTypeLoadBalancer, annotations, selector, ports, corev1.ServiceAffinityNone) - service.Spec.LoadBalancerIP = lbIP - _ = serviceClient.Create(service) - - ginkgo.By("Waiting for 10 seconds") - time.Sleep(10 * time.Second) - - deploymentName := lbSvcDeploymentName(serviceName) - ginkgo.By("Getting deployment " + deploymentName) - deploy, err := cs.AppsV1().Deployments(namespaceName).Get(context.Background(), deploymentName, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get deployment") - framework.ExpectEqual(deploy.Status.AvailableReplicas, int32(1)) - - ginkgo.By("Waiting for deployment " + deploymentName + " to be ready") - err = deployment.WaitForDeploymentComplete(cs, deploy) - framework.ExpectNoError(err, "deployment failed to complete") - - ginkgo.By("Getting pods for deployment " + deploymentName) - pods, err := deployment.GetPodsForDeployment(cs, deploy) - framework.ExpectNoError(err) - framework.ExpectHaveLen(pods.Items, 1) - - ginkgo.By("Checking pod annotations") - key := fmt.Sprintf(util.AllocatedAnnotationTemplate, subnetProvider) - framework.ExpectHaveKeyWithValue(pods.Items[0].Annotations, key, "true") - ipKey := fmt.Sprintf(util.IpAddressAnnotationTemplate, subnetProvider) - framework.ExpectHaveKeyWithValue(pods.Items[0].Annotations, ipKey, lbIP) - cidr := pods.Items[0].Annotations[fmt.Sprintf(util.CidrAnnotationTemplate, subnetProvider)] - framework.ExpectTrue(util.CIDRContainIP(cidr, lbIP)) - - ginkgo.By("Checking service external IP") - service = serviceClient.Get(serviceName) - framework.ExpectNotEmpty(service.Status.LoadBalancer.Ingress) - framework.ExpectEqual(service.Status.LoadBalancer.Ingress[0].IP, lbIP) - }) -}) diff --git a/test/e2e/ovn-ic/e2e_test.go b/test/e2e/ovn-ic/e2e_test.go deleted file mode 100644 index ca9e5645f59..00000000000 --- a/test/e2e/ovn-ic/e2e_test.go +++ /dev/null @@ -1,343 +0,0 @@ -package ovn_ic - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "math/rand" - "net" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "testing" - "time" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - k8stypes "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" - "k8s.io/kubernetes/test/e2e" - k8sframework "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/framework/config" - e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl" - e2epodoutput "k8s.io/kubernetes/test/e2e/framework/pod/output" - - "github.com/onsi/ginkgo/v2" - - "github.com/kubeovn/kube-ovn/pkg/util" - "github.com/kubeovn/kube-ovn/test/e2e/framework" - "github.com/kubeovn/kube-ovn/test/e2e/framework/kind" -) - -var clusters []string - -func init() { - klog.SetOutput(ginkgo.GinkgoWriter) - - // Register flags. - config.CopyFlags(config.Flags, flag.CommandLine) - k8sframework.RegisterCommonFlags(flag.CommandLine) - k8sframework.RegisterClusterFlags(flag.CommandLine) -} - -func TestE2E(t *testing.T) { - if k8sframework.TestContext.KubeConfig == "" { - k8sframework.TestContext.KubeConfig = filepath.Join(os.Getenv("HOME"), ".kube", "config") - } - k8sframework.AfterReadingAllFlags(&k8sframework.TestContext) - - var err error - if clusters, err = kind.ListClusters(); err != nil { - t.Fatalf("failed to list kind clusters: %v", err) - } - if len(clusters) < 2 { - t.Fatal("no enough kind clusters to run ovn-ic e2e testing") - } - - e2e.RunE2ETests(t) -} - -func execOrDie(kubeContext, cmd string) string { - ginkgo.By(`Switching context to ` + kubeContext) - e2ekubectl.NewKubectlCommand("", "config", "use-context", kubeContext).ExecOrDie("") - - ginkgo.By(`Executing "kubectl ` + cmd + `"`) - return e2ekubectl.NewKubectlCommand("", strings.Fields(cmd)...).ExecOrDie("") -} - -func execPodOrDie(kubeContext, namespace, pod, cmd string) string { - ginkgo.By(`Switching context to ` + kubeContext) - e2ekubectl.NewKubectlCommand("", "config", "use-context", kubeContext).ExecOrDie("") - - ginkgo.By(fmt.Sprintf(`Executing %q in pod %s/%s`, cmd, namespace, pod)) - return e2epodoutput.RunHostCmdOrDie(namespace, pod, cmd) -} - -var _ = framework.SerialDescribe("[group:ovn-ic]", func() { - frameworks := make([]*framework.Framework, len(clusters)) - for i := range clusters { - frameworks[i] = framework.NewFrameworkWithContext("ovn-ic", "kind-"+clusters[i]) - } - - clientSets := make([]clientset.Interface, len(clusters)) - podClients := make([]*framework.PodClient, len(clusters)) - namespaceNames := make([]string, len(clusters)) - var kubectlConfig string - ginkgo.BeforeEach(func() { - for i := range clusters { - clientSets[i] = frameworks[i].ClientSet - podClients[i] = frameworks[i].PodClient() - namespaceNames[i] = frameworks[i].Namespace.Name - } - kubectlConfig = k8sframework.TestContext.KubeConfig - k8sframework.TestContext.KubeConfig = "" - }) - ginkgo.AfterEach(func() { - k8sframework.TestContext.KubeConfig = kubectlConfig - }) - - fnCheckPodHTTP := func() { - podNames := make([]string, len(clusters)) - pods := make([]*corev1.Pod, len(clusters)) - ports := make([]string, len(clusters)) - for i := range clusters { - podNames[i] = "pod-" + framework.RandomSuffix() - ginkgo.By("Creating pod " + podNames[i] + " in cluster " + clusters[i]) - port := 8000 + rand.Intn(1000) - ports[i] = strconv.Itoa(port) - args := []string{"netexec", "--http-port", ports[i]} - pods[i] = framework.MakePod(namespaceNames[i], podNames[i], nil, nil, framework.AgnhostImage, nil, args) - pods[i].Spec.Containers[0].ReadinessProbe = &corev1.Probe{ - ProbeHandler: corev1.ProbeHandler{ - HTTPGet: &corev1.HTTPGetAction{ - Port: intstr.FromInt(port), - }, - }, - } - pods[i] = podClients[i].CreateSync(pods[i]) - } - - for i := range clusters { - sourceIPs := make([]string, 0, len(pods[i].Status.PodIPs)) - for _, podIP := range pods[i].Status.PodIPs { - sourceIPs = append(sourceIPs, podIP.IP) - } - - for j := range clusters { - if j == i { - continue - } - - for _, podIP := range pods[j].Status.PodIPs { - ip := podIP.IP - protocol := strings.ToLower(util.CheckProtocol(ip)) - ginkgo.By("Checking connection from cluster " + clusters[i] + " to cluster " + clusters[j] + " via " + protocol) - cmd := fmt.Sprintf("curl -q -s --connect-timeout 5 %s/clientip", net.JoinHostPort(ip, ports[j])) - output := execPodOrDie(frameworks[i].KubeContext, pods[i].Namespace, pods[i].Name, cmd) - client, _, err := net.SplitHostPort(strings.TrimSpace(output)) - framework.ExpectNoError(err) - framework.ExpectContainElement(sourceIPs, client) - } - } - } - } - - framework.ConformanceIt("should create logical switch ts", func() { - azNames := make([]string, len(clusters)) - for i := range clusters { - ginkgo.By("fetching the ConfigMap in cluster " + clusters[i]) - cm, err := clientSets[i].CoreV1().ConfigMaps(framework.KubeOvnNamespace).Get(context.TODO(), util.InterconnectionConfig, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get ConfigMap") - azNames[i] = cm.Data["az-name"] - } - - for i := range clusters { - ginkgo.By("Ensuring logical switch ts exists in cluster " + clusters[i]) - output := execOrDie(frameworks[i].KubeContext, "ko nbctl show ts") - for _, az := range azNames { - framework.ExpectTrue(strings.Contains(output, "ts-"+az), "should have lsp ts-"+az) - } - } - }) - - framework.ConformanceIt("should be able to communicate between clusters", func() { - fnCheckPodHTTP() - }) - - framework.ConformanceIt("should be able to update az name", func() { - azNames := make([]string, len(clusters)) - for i := range clusters { - ginkgo.By("fetching the ConfigMap in cluster " + clusters[i]) - cm, err := clientSets[i].CoreV1().ConfigMaps(framework.KubeOvnNamespace).Get(context.TODO(), util.InterconnectionConfig, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get ConfigMap") - azNames[i] = cm.Data["az-name"] - } - - azNames[0] = fmt.Sprintf("az%04d", rand.Intn(10000)) - configMapPatchPayload, err := json.Marshal(corev1.ConfigMap{ - Data: map[string]string{ - "az-name": azNames[0], - }, - }) - framework.ExpectNoError(err, "failed to marshal patch data") - - ginkgo.By("patching the ConfigMap in cluster " + clusters[0]) - _, err = clientSets[0].CoreV1().ConfigMaps(framework.KubeOvnNamespace).Patch(context.TODO(), util.InterconnectionConfig, k8stypes.StrategicMergePatchType, []byte(configMapPatchPayload), metav1.PatchOptions{}) - framework.ExpectNoError(err, "failed to patch ConfigMap") - - ginkgo.By("Waiting for new az names to be applied") - time.Sleep(10 * time.Second) - - pods, err := clientSets[0].CoreV1().Pods("kube-system").List(context.TODO(), metav1.ListOptions{LabelSelector: "app=ovs"}) - framework.ExpectNoError(err, "failed to get ovs-ovn pods") - cmd := "ovn-appctl -t ovn-controller inc-engine/recompute" - for _, pod := range pods.Items { - execPodOrDie(frameworks[0].KubeContext, "kube-system", pod.Name, cmd) - } - time.Sleep(2 * time.Second) - - ginkgo.By("Ensuring logical switch ts exists in cluster " + clusters[0]) - output := execOrDie(frameworks[0].KubeContext, "ko nbctl show ts") - for _, az := range azNames { - lsp := "ts-" + az - framework.ExpectTrue(strings.Contains(output, lsp), "should have lsp "+lsp) - framework.ExpectTrue(strings.Contains(output, lsp), "should have lsp "+lsp) - } - - fnCheckPodHTTP() - }) - - framework.ConformanceIt("Should Support ECMP OVN Interconnection", func() { - - ginkgo.By("case 1: ecmp gateway network test") - checkECMPCount(3) - fnCheckPodHTTP() - - ginkgo.By("case 2: reduce two clusters from 3 gateway to 1 gateway") - oldGatewayStr := make([]string, len(clusters)) - gwNodes := make([]string, len(clusters)) - for i := range clusters { - ginkgo.By("fetching the ConfigMap in cluster " + clusters[i]) - cm, err := clientSets[i].CoreV1().ConfigMaps(framework.KubeOvnNamespace).Get(context.TODO(), util.InterconnectionConfig, metav1.GetOptions{}) - framework.ExpectNoError(err, "failed to get ConfigMap") - gwNodes[i] = cm.Data["gw-nodes"] - oldGatewayStr[i] = cm.Data["gw-nodes"] - gws := strings.Split(gwNodes[i], ",") - newGatewayStr := strings.Join(gws[0:len(gws)-2], ",") - - configMapPatchPayload, _ := json.Marshal(corev1.ConfigMap{ - Data: map[string]string{ - "gw-nodes": newGatewayStr, - }, - }) - _, err = clientSets[i].CoreV1().ConfigMaps(framework.KubeOvnNamespace).Patch(context.TODO(), util.InterconnectionConfig, k8stypes.StrategicMergePatchType, []byte(configMapPatchPayload), metav1.PatchOptions{}) - framework.ExpectNoError(err, "patch ovn-ic-config failed") - } - fnCheckPodHTTP() - - ginkgo.By("case 3: recover two clusters from 1 gateway to 3 gateway") - for i := range clusters { - ginkgo.By("fetching the ConfigMap in cluster " + clusters[i]) - - configMapPatchPayload, _ := json.Marshal(corev1.ConfigMap{ - Data: map[string]string{ - "gw-nodes": oldGatewayStr[i], - }, - }) - - _, err := clientSets[i].CoreV1().ConfigMaps(framework.KubeOvnNamespace).Patch(context.TODO(), util.InterconnectionConfig, k8stypes.StrategicMergePatchType, []byte(configMapPatchPayload), metav1.PatchOptions{}) - framework.ExpectNoError(err, "patch ovn-ic-config failed") - } - fnCheckPodHTTP() - - ginkgo.By("case 4: scale ecmp path from 3 to 5 ") - switchCmd := "kubectl config use-context kind-kube-ovn" - _, err := exec.Command("bash", "-c", switchCmd).CombinedOutput() - framework.ExpectNoError(err, "switch to kube-ovn cluster failed") - - patchCmd := "kubectl patch deployment ovn-ic-server -n kube-system --type='json' -p=\"[{'op': 'replace', 'path': '/spec/template/spec/containers/0/env/1/value', 'value': '5'}]\"" - _, _ = exec.Command("bash", "-c", patchCmd).CombinedOutput() - checkECMPCount(5) - fnCheckPodHTTP() - - ginkgo.By("case 5: reduce ecmp path from 5 to 3 ") - patchCmd = "kubectl patch deployment ovn-ic-server -n kube-system --type='json' -p=\"[{'op': 'replace', 'path': '/spec/template/spec/containers/0/env/1/value', 'value': '3'}]\"" - _, _ = exec.Command("bash", "-c", patchCmd).CombinedOutput() - checkECMPCount(3) - fnCheckPodHTTP() - - ginkgo.By("case 6: disable gateway kube-ovn1-worker gateway") - switchCmd = "kubectl config use-context kind-kube-ovn1" - _, err = exec.Command("bash", "-c", switchCmd).CombinedOutput() - framework.ExpectNoError(err, "switch to kube-ovn1 cluster failed") - - disableNetworkCmd := "docker exec kube-ovn1-worker iptables -I INPUT -p udp --dport 6081 -j DROP" - _, err = exec.Command("bash", "-c", disableNetworkCmd).CombinedOutput() - framework.ExpectNoError(err, "disable kube-ovn1-worker gateway failed") - - taintCmd := "kubectl taint nodes kube-ovn1-worker e2e=test:NoSchedule" - _, _ = exec.Command("bash", "-c", taintCmd).CombinedOutput() - fnCheckPodHTTP() - - ginkgo.By("case 7: disable gateway kube-ovn1-worker2 gateway") - switchCmd = "kubectl config use-context kind-kube-ovn1" - _, err = exec.Command("bash", "-c", switchCmd).CombinedOutput() - framework.ExpectNoError(err, "switch to kube-ovn1 cluster failed") - - disableNetworkCmd = "docker exec kube-ovn1-worker2 iptables -I INPUT -p udp --dport 6081 -j DROP" - _, err = exec.Command("bash", "-c", disableNetworkCmd).CombinedOutput() - framework.ExpectNoError(err, "disable kube-ovn1-worker2 gateway failed") - - taintCmd = "kubectl taint nodes kube-ovn1-worker2 e2e=test:NoSchedule" - _, _ = exec.Command("bash", "-c", taintCmd).CombinedOutput() - fnCheckPodHTTP() - - ginkgo.By("case 8: enable gateway kube-ovn1-worker gateway") - switchCmd = "kubectl config use-context kind-kube-ovn1" - _, err = exec.Command("bash", "-c", switchCmd).CombinedOutput() - framework.ExpectNoError(err, "switch to kube-ovn1 cluster failed") - - disableNetworkCmd = "docker exec kube-ovn1-worker iptables -D INPUT -p udp --dport 6081 -j DROP" - _, err = exec.Command("bash", "-c", disableNetworkCmd).CombinedOutput() - framework.ExpectNoError(err, "enable kube-ovn1-worker gateway failed") - - taintCmd = "kubectl taint nodes kube-ovn1-worker e2e=test:NoSchedule-" - _, _ = exec.Command("bash", "-c", taintCmd).CombinedOutput() - fnCheckPodHTTP() - - ginkgo.By("case 9: enable gateway kube-ovn1-worker2 gateway") - switchCmd = "kubectl config use-context kind-kube-ovn1" - _, err = exec.Command("bash", "-c", switchCmd).CombinedOutput() - framework.ExpectNoError(err, "switch to kube-ovn1 cluster failed") - - disableNetworkCmd = "docker exec kube-ovn1-worker2 iptables -D INPUT -p udp --dport 6081 -j DROP" - _, err = exec.Command("bash", "-c", disableNetworkCmd).CombinedOutput() - framework.ExpectNoError(err, "enable kube-ovn1-worker2 gateway failed") - - taintCmd = "kubectl taint nodes kube-ovn1-worker2 e2e=test:NoSchedule-" - _, _ = exec.Command("bash", "-c", taintCmd).CombinedOutput() - fnCheckPodHTTP() - }) -}) - -func checkECMPCount(expectCount int) { - ecmpCount := 0 - maxRetryTimes := 10 - for i := 0; i < maxRetryTimes; i++ { - time.Sleep(3 * time.Second) - execCmd := "kubectl ko nbctl lr-route-list ovn-cluster " - output, err := exec.Command("bash", "-c", execCmd).CombinedOutput() - framework.ExpectNoError(err) - ecmpCount = strings.Count(string(output), "ecmp") - if ecmpCount == expectCount { - break - } - } - - framework.ExpectEqual(ecmpCount, expectCount) -}