diff --git a/Makefile b/Makefile index ff5bcd93..5521ed24 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,7 @@ SHELL = /usr/bin/env bash -o pipefail test: envtest manifests generate fmt vet ## Run tests. source <($(LOCALBIN)/setup-envtest use -p env 1.24.2); go test ./internal/... ./controllers/... ./utils/... -coverprofile cover.out + @cd "$(REPO_ROOT)/apis/autoscaling" && go test ./v1alpha2 # Build manager binary manager: generate fmt vet @@ -69,7 +70,7 @@ run: generate fmt vet # Install CRDs into a cluster install: manifests - kubectl apply -f config/crd/bases + kubectl apply -f config/crd/output/crds.yaml .PHONY: check check: $(GOLANGCI_LINT) @@ -80,12 +81,12 @@ check: $(GOLANGCI_LINT) # Deploy controller in the configured Kubernetes cluster in ~/.kube/config deploy: manifests - kubectl apply -f config/crd/bases + kubectl apply -f config/crd/output/crds.yaml kustomize build config/default | kubectl apply -f - # Generate manifests e.g. CRD, RBAC etc. manifests: controller-gen - cd "$(REPO_ROOT)/api" && $(CONTROLLER_GEN) crd paths="./..." output:crd:artifacts:config=../config/crd/bases + cd "$(REPO_ROOT)/apis/autoscaling" && $(CONTROLLER_GEN) crd paths="./..." output:crd:artifacts:config=../../config/crd/bases $(CONTROLLER_GEN) rbac:roleName=manager-role webhook paths="./controllers/..." kustomize build config/crd -o config/crd/output/crds.yaml @@ -99,7 +100,7 @@ vet: # Generate code generate: controller-gen - cd "$(REPO_ROOT)/api" && $(CONTROLLER_GEN) object:headerFile=../hack/boilerplate.go.txt paths=./... + cd "$(REPO_ROOT)/apis/autoscaling" && $(CONTROLLER_GEN) object:headerFile=../../hack/boilerplate.go.txt paths=./... # Build the docker image docker-build: test @@ -113,7 +114,7 @@ docker-push: # Revendor revendor: - @cd "$(REPO_ROOT)/api" && go mod tidy + @cd "$(REPO_ROOT)/apis/autoscaling" && go mod tidy @env GO111MODULE=on go mod tidy @env GO111MODULE=on go mod vendor diff --git a/PROJECT b/PROJECT index 06f4122c..4f723047 100644 --- a/PROJECT +++ b/PROJECT @@ -1,16 +1,29 @@ -projectName: hvpa-controller +domain: k8s.io layout: - go.kubebuilder.io/v3 -domain: k8s.io +multigroup: true +projectName: hvpa-controller repo: github.com/gardener/hvpa-controller resources: -- group: autoscaling - kind: Hvpa - version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true controller: true domain: k8s.io - path: github.com/gardener/hvpa-controller/api/v1alpha1 - api: + group: autoscaling + kind: Hvpa + path: github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1 + version: v1alpha1 + webhooks: + conversion: true + webhookVersion: v1 +- api: crdVersion: v1 namespaced: true + controller: true + domain: k8s.io + group: autoscaling + kind: Hvpa + path: github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2 + version: v1alpha2 version: "3" diff --git a/api/go.mod b/api/go.mod deleted file mode 100644 index 6a8afaf8..00000000 --- a/api/go.mod +++ /dev/null @@ -1,26 +0,0 @@ -module github.com/gardener/hvpa-controller/api - -go 1.18 - -require ( - k8s.io/api v0.25.3 - k8s.io/apimachinery v0.25.3 - k8s.io/autoscaler/vertical-pod-autoscaler v0.9.0 -) - -require ( - github.com/go-logr/logr v1.2.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect - golang.org/x/text v0.3.7 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/api/go.sum b/api/go.sum deleted file mode 100644 index 339d7af7..00000000 --- a/api/go.sum +++ /dev/null @@ -1,285 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -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/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -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/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -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/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/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/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -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= -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= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -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= -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= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -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= -k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= -k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ= -k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI= -k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc= -k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= -k8s.io/autoscaler/vertical-pod-autoscaler v0.9.0 h1:mJCdJl9DDJnA9QGnky7R8h2g72us5ELWnYzhO+817rM= -k8s.io/autoscaler/vertical-pod-autoscaler v0.9.0/go.mod h1:PwWTGRRCxefhAezrDbG/tRYSAW7etHjjMPAr8fXKVAA= -k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= -k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/component-base v0.18.3/go.mod h1:bp5GzGR0aGkYEfTj+eTY0AN/vXTgkJdQXjNTTVUaa3k= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/metrics v0.18.3/go.mod h1:TkuJE3ezDZ1ym8pYkZoEzJB7HDiFE7qxl+EmExEBoPA= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/apis/autoscaling/go.mod b/apis/autoscaling/go.mod new file mode 100644 index 00000000..50a15734 --- /dev/null +++ b/apis/autoscaling/go.mod @@ -0,0 +1,71 @@ +module github.com/gardener/hvpa-controller/apis/autoscaling + +go 1.18 + +require ( + github.com/onsi/ginkgo v1.16.5 + github.com/onsi/gomega v1.20.1 + k8s.io/api v0.25.3 + k8s.io/apimachinery v0.25.3 + k8s.io/autoscaler/vertical-pod-autoscaler v0.9.0 + sigs.k8s.io/controller-runtime v0.13.0 +) + +require ( + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.8.0 // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.5 // indirect + github.com/go-openapi/swag v0.19.14 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/google/uuid v1.1.2 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/nxadm/tail v1.4.8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/spf13/pflag v1.0.5 // indirect + golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect + gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/apiextensions-apiserver v0.25.0 // indirect + k8s.io/client-go v0.25.0 // indirect + k8s.io/component-base v0.25.0 // indirect + k8s.io/klog/v2 v2.70.1 // indirect + k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect + k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/apis/autoscaling/go.sum b/apis/autoscaling/go.sum new file mode 100644 index 00000000..c092cba6 --- /dev/null +++ b/apis/autoscaling/go.sum @@ -0,0 +1,707 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +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/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +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= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +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/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +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.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +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 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +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/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/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/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/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +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/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +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= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +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= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/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= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/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-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/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-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +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= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= +gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +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= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/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= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= +k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ= +k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI= +k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= +k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= +k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc= +k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= +k8s.io/autoscaler/vertical-pod-autoscaler v0.9.0 h1:mJCdJl9DDJnA9QGnky7R8h2g72us5ELWnYzhO+817rM= +k8s.io/autoscaler/vertical-pod-autoscaler v0.9.0/go.mod h1:PwWTGRRCxefhAezrDbG/tRYSAW7etHjjMPAr8fXKVAA= +k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= +k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E= +k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= +k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/component-base v0.18.3/go.mod h1:bp5GzGR0aGkYEfTj+eTY0AN/vXTgkJdQXjNTTVUaa3k= +k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= +k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= +k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA= +k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= +k8s.io/metrics v0.18.3/go.mod h1:TkuJE3ezDZ1ym8pYkZoEzJB7HDiFE7qxl+EmExEBoPA= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4= +k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= +sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/api/v1alpha1/groupversion_info.go b/apis/autoscaling/v1alpha1/groupversion_info.go similarity index 99% rename from api/v1alpha1/groupversion_info.go rename to apis/autoscaling/v1alpha1/groupversion_info.go index 96063838..430fdf96 100644 --- a/api/v1alpha1/groupversion_info.go +++ b/apis/autoscaling/v1alpha1/groupversion_info.go @@ -20,9 +20,12 @@ limitations under the License. package v1alpha1 import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" +) + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" vpa_api "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" ) diff --git a/vendor/github.com/gardener/hvpa-controller/api/v1alpha1/hvpa_types.go b/apis/autoscaling/v1alpha1/hvpa_types.go similarity index 99% rename from vendor/github.com/gardener/hvpa-controller/api/v1alpha1/hvpa_types.go rename to apis/autoscaling/v1alpha1/hvpa_types.go index 4a0f5887..282bff9a 100644 --- a/vendor/github.com/gardener/hvpa-controller/api/v1alpha1/hvpa_types.go +++ b/apis/autoscaling/v1alpha1/hvpa_types.go @@ -330,6 +330,7 @@ type HpaStatus struct { // +kubebuilder:object:root=true // +kubebuilder:subresource:status // +kubebuilder:subresource:scale:specpath=.spec.replicas,statuspath=.status.replicas,selectorpath=.status.targetSelector +// +kubebuilder:storageversion type Hvpa struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -349,3 +350,6 @@ type HvpaList struct { /*func init() { SchemeBuilder.Register(&Hvpa{}, &HvpaList{}) }*/ + +// Hub marks this version as the API conversion Hub +func (*Hvpa) Hub() {} diff --git a/apis/autoscaling/v1alpha1/hvpa_webhook.go b/apis/autoscaling/v1alpha1/hvpa_webhook.go new file mode 100644 index 00000000..62184093 --- /dev/null +++ b/apis/autoscaling/v1alpha1/hvpa_webhook.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha1 + +import ( + ctrl "sigs.k8s.io/controller-runtime" + logf "sigs.k8s.io/controller-runtime/pkg/log" +) + +// log is for logging in this package. +var hvpalog = logf.Log.WithName("hvpa-resource") + +func (r *Hvpa) SetupWebhookWithManager(mgr ctrl.Manager) error { + return ctrl.NewWebhookManagedBy(mgr). + For(r). + Complete() +} diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from api/v1alpha1/zz_generated.deepcopy.go rename to apis/autoscaling/v1alpha1/zz_generated.deepcopy.go diff --git a/apis/autoscaling/v1alpha2/groupversion_info.go b/apis/autoscaling/v1alpha2/groupversion_info.go new file mode 100644 index 00000000..69ed3e6b --- /dev/null +++ b/apis/autoscaling/v1alpha2/groupversion_info.go @@ -0,0 +1,36 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha2 contains API Schema definitions for the autoscaling v1alpha2 API group +// +kubebuilder:object:generate=true +// +groupName=autoscaling.k8s.io +package v1alpha2 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "autoscaling.k8s.io", Version: "v1alpha2"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/apis/autoscaling/v1alpha2/hvpa_conversion.go b/apis/autoscaling/v1alpha2/hvpa_conversion.go new file mode 100644 index 00000000..8478f86f --- /dev/null +++ b/apis/autoscaling/v1alpha2/hvpa_conversion.go @@ -0,0 +1,477 @@ +package v1alpha2 + +import ( + "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" + autoscalingv2 "k8s.io/api/autoscaling/v2" + autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" + v1 "k8s.io/api/core/v1" + "sigs.k8s.io/controller-runtime/pkg/conversion" +) + +// ConvertTo converts TO the Hub API version (v1alpha1) from this version (v1alpha2) +func (src *Hvpa) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1alpha1.Hvpa) + + // Convert ObjectMeta + dst.ObjectMeta = src.ObjectMeta + + // Convert the Spec + dst.Spec.Replicas = src.Spec.Replicas + dst.Spec.Vpa = v1alpha1.VpaSpec{ + Selector: src.Spec.Vpa.Selector, + Deploy: src.Spec.Vpa.Deploy, + ScaleUp: Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Vpa.ScaleUp), + ScaleDown: Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Vpa.ScaleDown), + Template: v1alpha1.VpaTemplate{ + ObjectMeta: src.Spec.Vpa.Template.ObjectMeta, + Spec: v1alpha1.VpaTemplateSpec(src.Spec.Vpa.Template.Spec), + }, + LimitsRequestsGapScaleParams: Convert_ScaleParams_To_v1alpha1_ScaleParams(src.Spec.Vpa.LimitsRequestsGapScaleParams), + } + dst.Spec.WeightBasedScalingIntervals = Convert_WeightBasedScalingIntervals_To_v1alpha1_WeightBasedScalingIntervals(src.Spec.WeightBasedScalingIntervals) + dst.Spec.TargetRef = Convert_v2_CrossVersionObjectReference_To_v2beta1_CrossVersionObjectReference(src.Spec.TargetRef) + dst.Spec.MaintenanceTimeWindow = Convert_MaintenanceWindow_To_v1alpha1_MaintenanceWindow(src.Spec.MaintenanceTimeWindow) + dst.Spec.Hpa.Selector = src.Spec.Hpa.Selector + dst.Spec.Hpa.Deploy = src.Spec.Hpa.Deploy + dst.Spec.Hpa.ScaleUp = Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Hpa.ScaleUp) + dst.Spec.Hpa.ScaleDown = Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Hpa.ScaleDown) + dst.Spec.Hpa.Template.ObjectMeta = src.Spec.Hpa.Template.ObjectMeta + dst.Spec.Hpa.Template.Spec.MinReplicas = src.Spec.Hpa.Template.Spec.MinReplicas + dst.Spec.Hpa.Template.Spec.MaxReplicas = src.Spec.Hpa.Template.Spec.MaxReplicas + for _, metric := range src.Spec.Hpa.Template.Spec.Metrics { + ms := autoscalingv2beta1.MetricSpec{ + Type: autoscalingv2beta1.MetricSourceType(metric.Type), + Object: Convert_autoscalingv2_ObjectMetricSource_To_autoscalingv2beta1_ObjectMetricSource(metric.Object), + Pods: Convert_autoscalingv2_PodsMetricSource_To_autoscalingv2beta1_PodsMetricSource(metric.Pods), + Resource: Convert_autoscalingv2_ResourceMetricSource_To_autoscalingv2beta1_ResourceMetricSource(metric.Resource), + ContainerResource: Convert_autoscalingv2_ContainerResourceMetricSource_To_autoscalingv2beta1_ContainerResourceMetricSource(metric.ContainerResource), + External: Convert_autoscalingv2_ExternalMetricSource_To_autoscalingv2beta1_ExternalMetricSource(metric.External), + } + dst.Spec.Hpa.Template.Spec.Metrics = append(dst.Spec.Hpa.Template.Spec.Metrics, ms) + } + + // Convert the Status + dst.Status.Replicas = src.Status.Replicas + dst.Status.TargetSelector = src.Status.TargetSelector + dst.Status.HpaScaleUpUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.HpaScaleUpUpdatePolicy) + dst.Status.HpaScaleDownUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.HpaScaleDownUpdatePolicy) + dst.Status.VpaScaleUpUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.VpaScaleUpUpdatePolicy) + dst.Status.VpaScaleDownUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.VpaScaleDownUpdatePolicy) + dst.Status.VpaWeight = src.Status.VpaWeight + dst.Status.HpaWeight = src.Status.HpaWeight + dst.Status.OverrideScaleUpStabilization = src.Status.OverrideScaleUpStabilization + for _, blockedScaling := range src.Status.LastBlockedScaling { + dst.Status.LastBlockedScaling = append(dst.Status.LastBlockedScaling, &v1alpha1.BlockedScaling{ + Reason: v1alpha1.BlockingReason(blockedScaling.Reason), + ScalingStatus: Convert_ScalingStatus_To_v1alpha1_ScalingStatus(blockedScaling.ScalingStatus), + }) + } + dst.Status.LastScaling = Convert_ScalingStatus_To_v1alpha1_ScalingStatus(src.Status.LastScaling) + dst.Status.LastError = Convert_LastError_to_v1alpha1_LastError(src.Status.LastError) + + return nil +} + +// ConvertFrom converts FROM the Hub API version (v1alpha1) to this API version (v1alpha2) +func (dst *Hvpa) ConvertFrom(srcRaw conversion.Hub) error { + src := srcRaw.(*v1alpha1.Hvpa) + + // Convert ObjectMeta + dst.ObjectMeta = src.ObjectMeta + + // Convert the Spec + dst.Spec.Replicas = src.Spec.Replicas + dst.Spec.Vpa = VpaSpec{ + Selector: src.Spec.Vpa.Selector, + Deploy: src.Spec.Vpa.Deploy, + ScaleUp: Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Vpa.ScaleUp), + ScaleDown: Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Vpa.ScaleDown), + Template: VpaTemplate{ + ObjectMeta: src.Spec.Vpa.Template.ObjectMeta, + Spec: VpaTemplateSpec(src.Spec.Vpa.Template.Spec), + }, + LimitsRequestsGapScaleParams: Convert_v1alpha1_ScaleParams_To_ScaleParams(src.Spec.Vpa.LimitsRequestsGapScaleParams), + } + dst.Spec.WeightBasedScalingIntervals = Convert_v1alpha1_WeightBasedScalingIntervals_To_WeightBasedScalingIntervals(src.Spec.WeightBasedScalingIntervals) + dst.Spec.TargetRef = Convert_v2beta1_CrossVersionObjectReference_To_v2_CrossVersionObjectReference(src.Spec.TargetRef) + dst.Spec.MaintenanceTimeWindow = Convert_v1alpha1_MaintenanceWindow_To_MaintenanceWindow(src.Spec.MaintenanceTimeWindow) + dst.Spec.Hpa.Selector = src.Spec.Hpa.Selector + dst.Spec.Hpa.Deploy = src.Spec.Hpa.Deploy + dst.Spec.Hpa.ScaleUp = Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Hpa.ScaleUp) + dst.Spec.Hpa.ScaleDown = Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Hpa.ScaleDown) + dst.Spec.Hpa.Template.ObjectMeta = src.Spec.Hpa.Template.ObjectMeta + dst.Spec.Hpa.Template.Spec.MinReplicas = src.Spec.Hpa.Template.Spec.MinReplicas + dst.Spec.Hpa.Template.Spec.MaxReplicas = src.Spec.Hpa.Template.Spec.MaxReplicas + for _, metric := range src.Spec.Hpa.Template.Spec.Metrics { + ms := autoscalingv2.MetricSpec{ + Type: autoscalingv2.MetricSourceType(metric.Type), + Object: Convert_autoscalingv2beta1_ObjectMetricSource_To_autoscalingv2_ObjectMetricSource(metric.Object), + Pods: Convert_autoscalingv2beta1_PodsMetricSource_To_autoscalingv2_PodsMetricSource(metric.Pods), + Resource: Convert_autoscalingv2beta1_ResourceMetricSource_To_autoscalingv2_ResourceMetricSource(metric.Resource), + ContainerResource: Convert_autoscalingv2beta1_ContainerResourceMetricSource_To_autoscalingv2_ContainerResourceMetricSource(metric.ContainerResource), + External: Convert_autoscalingv2beta1_ExternalMetricSource_To_autoscalingv2_ExternalMetricSource(metric.External), + } + dst.Spec.Hpa.Template.Spec.Metrics = append(dst.Spec.Hpa.Template.Spec.Metrics, ms) + } + + // Convert the Status + dst.Status.Replicas = src.Status.Replicas + dst.Status.TargetSelector = src.Status.TargetSelector + dst.Status.HpaScaleUpUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.HpaScaleUpUpdatePolicy) + dst.Status.HpaScaleDownUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.HpaScaleDownUpdatePolicy) + dst.Status.VpaScaleUpUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.VpaScaleUpUpdatePolicy) + dst.Status.VpaScaleDownUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.VpaScaleDownUpdatePolicy) + dst.Status.VpaWeight = src.Status.VpaWeight + dst.Status.HpaWeight = src.Status.HpaWeight + dst.Status.OverrideScaleUpStabilization = src.Status.OverrideScaleUpStabilization + for _, blockedScaling := range src.Status.LastBlockedScaling { + dst.Status.LastBlockedScaling = append(dst.Status.LastBlockedScaling, &BlockedScaling{ + Reason: BlockingReason(blockedScaling.Reason), + ScalingStatus: Convert_v1alpha1_ScalingStatus_To_ScalingStatus(blockedScaling.ScalingStatus), + }) + } + dst.Status.LastScaling = Convert_v1alpha1_ScalingStatus_To_ScalingStatus(src.Status.LastScaling) + dst.Status.LastError = Convert_v1alpha1_LastError_to_LastError(src.Status.LastError) + + return nil +} + +func Convert_v1alpha1_WeightBasedScalingIntervals_To_WeightBasedScalingIntervals(in []v1alpha1.WeightBasedScalingInterval) []WeightBasedScalingInterval { + if in == nil { + return nil + } + out := []WeightBasedScalingInterval{} + for _, weightBasedScalingInterval := range in { + out = append(out, WeightBasedScalingInterval(weightBasedScalingInterval)) + } + return out +} + +func Convert_WeightBasedScalingIntervals_To_v1alpha1_WeightBasedScalingIntervals(in []WeightBasedScalingInterval) []v1alpha1.WeightBasedScalingInterval { + if in == nil { + return nil + } + out := []v1alpha1.WeightBasedScalingInterval{} + for _, weightBasedScalingInterval := range in { + out = append(out, v1alpha1.WeightBasedScalingInterval(weightBasedScalingInterval)) + } + return out +} + +func Convert_v2beta1_CrossVersionObjectReference_To_v2_CrossVersionObjectReference(in *autoscalingv2beta1.CrossVersionObjectReference) *autoscalingv2.CrossVersionObjectReference { + if in == nil { + return nil + } + return &autoscalingv2.CrossVersionObjectReference{ + Kind: in.Kind, + Name: in.Name, + APIVersion: in.APIVersion, + } +} + +func Convert_v2_CrossVersionObjectReference_To_v2beta1_CrossVersionObjectReference(in *autoscalingv2.CrossVersionObjectReference) *autoscalingv2beta1.CrossVersionObjectReference { + if in == nil { + return nil + } + return &autoscalingv2beta1.CrossVersionObjectReference{ + Kind: in.Kind, + Name: in.Name, + APIVersion: in.APIVersion, + } +} + +func Convert_v1alpha1_MaintenanceWindow_To_MaintenanceWindow(in *v1alpha1.MaintenanceTimeWindow) *MaintenanceTimeWindow { + if in == nil { + return nil + } + mw := MaintenanceTimeWindow(*in) + return &mw +} + +func Convert_MaintenanceWindow_To_v1alpha1_MaintenanceWindow(in *MaintenanceTimeWindow) *v1alpha1.MaintenanceTimeWindow { + if in == nil { + return nil + } + mw := v1alpha1.MaintenanceTimeWindow(*in) + return &mw +} + +func Convert_v1alpha1_LastError_to_LastError(in *v1alpha1.LastError) *LastError { + if in == nil { + return nil + } + lastError := LastError(*in) + return &lastError +} + +func Convert_LastError_to_v1alpha1_LastError(in *LastError) *v1alpha1.LastError { + if in == nil { + return nil + } + lastError := v1alpha1.LastError(*in) + return &lastError +} + +func Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(in *v1alpha1.UpdatePolicy) *UpdatePolicy { + if in == nil { + return nil + } + up := UpdatePolicy(*in) + return &up +} + +func Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(in *UpdatePolicy) *v1alpha1.UpdatePolicy { + if in == nil { + return nil + } + up := v1alpha1.UpdatePolicy(*in) + return &up +} + +func Convert_v1alpha1_ScalingStatus_To_ScalingStatus(in v1alpha1.ScalingStatus) ScalingStatus { + return ScalingStatus{ + LastScaleTime: in.LastScaleTime, + HpaStatus: HpaStatus{ + CurrentReplicas: in.HpaStatus.CurrentReplicas, + DesiredReplicas: in.HpaStatus.DesiredReplicas, + }, + VpaStatus: in.VpaStatus, + } +} + +func Convert_ScalingStatus_To_v1alpha1_ScalingStatus(in ScalingStatus) v1alpha1.ScalingStatus { + return v1alpha1.ScalingStatus{ + LastScaleTime: in.LastScaleTime, + HpaStatus: v1alpha1.HpaStatus{ + CurrentReplicas: in.HpaStatus.CurrentReplicas, + DesiredReplicas: in.HpaStatus.DesiredReplicas, + }, + VpaStatus: in.VpaStatus, + } +} + +func Convert_v1alpha1_ScaleParams_To_ScaleParams(in v1alpha1.ScaleParams) ScaleParams { + return ScaleParams{ + CPU: ChangeParams(in.CPU), + Memory: ChangeParams(in.Memory), + Replicas: ChangeParams(in.Replicas), + } +} + +func Convert_ScaleParams_To_v1alpha1_ScaleParams(in ScaleParams) v1alpha1.ScaleParams { + return v1alpha1.ScaleParams{ + CPU: v1alpha1.ChangeParams(in.CPU), + Memory: v1alpha1.ChangeParams(in.Memory), + Replicas: v1alpha1.ChangeParams(in.Replicas), + } +} + +func Convert_v1alpha1_ScaleType_To_ScaleType(in v1alpha1.ScaleType) ScaleType { + return ScaleType{ + UpdatePolicy: UpdatePolicy(in.UpdatePolicy), + MinChange: Convert_v1alpha1_ScaleParams_To_ScaleParams(in.MinChange), + StabilizationDuration: in.StabilizationDuration, + } +} + +func Convert_ScaleType_To_v1alpha1_ScaleType(in ScaleType) v1alpha1.ScaleType { + return v1alpha1.ScaleType{ + UpdatePolicy: v1alpha1.UpdatePolicy(in.UpdatePolicy), + MinChange: Convert_ScaleParams_To_v1alpha1_ScaleParams(in.MinChange), + StabilizationDuration: in.StabilizationDuration, + } +} + +// Conversion methods taken from https://github.com/kubernetes/kubernetes/blob/v1.24.7/pkg/apis/autoscaling/v2beta1/conversion.go + +func Convert_autoscalingv2beta1_ResourceMetricSource_To_autoscalingv2_ResourceMetricSource(in *autoscalingv2beta1.ResourceMetricSource) *autoscalingv2.ResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ResourceMetricSource{} + out.Name = in.Name + utilization := in.TargetAverageUtilization + averageValue := in.TargetAverageValue + + var metricType autoscalingv2.MetricTargetType + if utilization == nil { + metricType = autoscalingv2.AverageValueMetricType + } else { + metricType = autoscalingv2.UtilizationMetricType + } + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + AverageValue: averageValue, + AverageUtilization: utilization, + } + return &out +} + +func Convert_autoscalingv2_ResourceMetricSource_To_autoscalingv2beta1_ResourceMetricSource(in *autoscalingv2.ResourceMetricSource) *autoscalingv2beta1.ResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ResourceMetricSource{} + out.Name = in.Name + out.TargetAverageUtilization = in.Target.AverageUtilization + out.TargetAverageValue = in.Target.AverageValue + return &out +} + +func Convert_autoscalingv2beta1_ObjectMetricSource_To_autoscalingv2_ObjectMetricSource(in *autoscalingv2beta1.ObjectMetricSource) *autoscalingv2.ObjectMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ObjectMetricSource{} + var metricType autoscalingv2.MetricTargetType + if in.AverageValue == nil { + metricType = autoscalingv2.ValueMetricType + } else { + metricType = autoscalingv2.AverageValueMetricType + } + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + Value: &in.TargetValue, + AverageValue: in.AverageValue, + } + out.DescribedObject = autoscalingv2.CrossVersionObjectReference{ + Kind: in.Target.Kind, + Name: in.Target.Name, + APIVersion: in.Target.APIVersion, + } + out.Metric = autoscalingv2.MetricIdentifier{ + Name: in.MetricName, + Selector: in.Selector, + } + return &out +} + +func Convert_autoscalingv2_ObjectMetricSource_To_autoscalingv2beta1_ObjectMetricSource(in *autoscalingv2.ObjectMetricSource) *autoscalingv2beta1.ObjectMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ObjectMetricSource{} + if in.Target.Value != nil { + out.TargetValue = *in.Target.Value + } + out.AverageValue = in.Target.AverageValue + + out.Target = autoscalingv2beta1.CrossVersionObjectReference{ + Kind: in.DescribedObject.Kind, + Name: in.DescribedObject.Name, + APIVersion: in.DescribedObject.APIVersion, + } + out.MetricName = in.Metric.Name + out.Selector = in.Metric.Selector + + return &out +} + +func Convert_autoscalingv2beta1_PodsMetricSource_To_autoscalingv2_PodsMetricSource(in *autoscalingv2beta1.PodsMetricSource) *autoscalingv2.PodsMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.PodsMetricSource{} + targetAverageValue := &in.TargetAverageValue + metricType := autoscalingv2.AverageValueMetricType + + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + AverageValue: targetAverageValue, + } + out.Metric = autoscalingv2.MetricIdentifier{ + Name: in.MetricName, + Selector: in.Selector, + } + return &out +} + +func Convert_autoscalingv2_PodsMetricSource_To_autoscalingv2beta1_PodsMetricSource(in *autoscalingv2.PodsMetricSource) *autoscalingv2beta1.PodsMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.PodsMetricSource{} + if in.Target.AverageValue != nil { + targetAverageValue := *in.Target.AverageValue + out.TargetAverageValue = targetAverageValue + } + + out.MetricName = in.Metric.Name + out.Selector = in.Metric.Selector + + return &out +} + +func Convert_autoscalingv2beta1_ContainerResourceMetricSource_To_autoscalingv2_ContainerResourceMetricSource(in *autoscalingv2beta1.ContainerResourceMetricSource) *autoscalingv2.ContainerResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ContainerResourceMetricSource{} + out.Name = in.Name + utilization := in.TargetAverageUtilization + averageValue := in.TargetAverageValue + + var metricType autoscalingv2.MetricTargetType + if utilization == nil { + metricType = autoscalingv2.AverageValueMetricType + } else { + metricType = autoscalingv2.UtilizationMetricType + } + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + AverageValue: averageValue, + AverageUtilization: utilization, + } + return &out +} + +func Convert_autoscalingv2_ContainerResourceMetricSource_To_autoscalingv2beta1_ContainerResourceMetricSource(in *autoscalingv2.ContainerResourceMetricSource) *autoscalingv2beta1.ContainerResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ContainerResourceMetricSource{} + out.Name = v1.ResourceName(in.Name) + out.TargetAverageUtilization = in.Target.AverageUtilization + out.TargetAverageValue = in.Target.AverageValue + return &out +} + +func Convert_autoscalingv2beta1_ExternalMetricSource_To_autoscalingv2_ExternalMetricSource(in *autoscalingv2beta1.ExternalMetricSource) *autoscalingv2.ExternalMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ExternalMetricSource{} + value := in.TargetValue + averageValue := in.TargetAverageValue + + var metricType autoscalingv2.MetricTargetType + if value == nil { + metricType = autoscalingv2.AverageValueMetricType + } else { + metricType = autoscalingv2.ValueMetricType + } + + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + Value: value, + AverageValue: averageValue, + } + + out.Metric = autoscalingv2.MetricIdentifier{ + Name: in.MetricName, + Selector: in.MetricSelector, + } + return &out +} + +func Convert_autoscalingv2_ExternalMetricSource_To_autoscalingv2beta1_ExternalMetricSource(in *autoscalingv2.ExternalMetricSource) *autoscalingv2beta1.ExternalMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ExternalMetricSource{} + out.MetricName = in.Metric.Name + out.TargetValue = in.Target.Value + out.TargetAverageValue = in.Target.AverageValue + out.MetricSelector = in.Metric.Selector + return &out +} diff --git a/apis/autoscaling/v1alpha2/hvpa_conversion_test.go b/apis/autoscaling/v1alpha2/hvpa_conversion_test.go new file mode 100644 index 00000000..69410d89 --- /dev/null +++ b/apis/autoscaling/v1alpha2/hvpa_conversion_test.go @@ -0,0 +1,431 @@ +package v1alpha2_test + +import ( + "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" + "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "github.com/onsi/gomega/format" + autoscalingv2 "k8s.io/api/autoscaling/v2" + autoscaling "k8s.io/api/autoscaling/v2beta1" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + vpa_api "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" +) + +var _ = Describe("HvpaConversion", func() { + name := "hvpa-10" + target := "scaling-target" + labelVal := "hpa-label" + updateMode := v1alpha1.UpdateModeAuto + stabilizationDur := "3m" + replica := int32(1) + util := int32(70) + + valMem := "100M" + valCPU := "100m" + percMem := int32(80) + percCPU := int32(80) + + statusReplicas := int32(7) + t := metav1.Now() + + minChange := v1alpha1.ScaleParams{ + CPU: v1alpha1.ChangeParams{ + Value: &valCPU, + Percentage: &percCPU, + }, + Memory: v1alpha1.ChangeParams{ + Value: &valMem, + Percentage: &percMem, + }, + } + + vpaRecommendation := vpa_api.RecommendedPodResources{ + ContainerRecommendations: []vpa_api.RecommendedContainerResources{{ + ContainerName: "some-container", + Target: v1.ResourceList{ + v1.ResourceMemory: resource.MustParse("340001k"), + v1.ResourceCPU: resource.MustParse("201m"), + }, + LowerBound: v1.ResourceList{ + v1.ResourceMemory: resource.MustParse("340002k"), + v1.ResourceCPU: resource.MustParse("202m"), + }, + UpperBound: v1.ResourceList{ + v1.ResourceMemory: resource.MustParse("340003k"), + v1.ResourceCPU: resource.MustParse("203m"), + }, + UncappedTarget: v1.ResourceList{ + v1.ResourceMemory: resource.MustParse("340004k"), + v1.ResourceCPU: resource.MustParse("204m"), + }, + }}, + } + + v1alpha1BlockedScaling := v1alpha1.BlockedScaling{ + Reason: v1alpha1.BlockingReasonMinChange, + ScalingStatus: v1alpha1.ScalingStatus{ + HpaStatus: v1alpha1.HpaStatus{ + CurrentReplicas: 11, + DesiredReplicas: 22, + }, + VpaStatus: vpa_api.VerticalPodAutoscalerStatus{ + Recommendation: &vpaRecommendation, + }, + }, + } + + v1alpha2BlockedScaling := v1alpha2.BlockedScaling{ + Reason: v1alpha2.BlockingReasonMinChange, + ScalingStatus: v1alpha2.ScalingStatus{ + HpaStatus: v1alpha2.HpaStatus{ + CurrentReplicas: 11, + DesiredReplicas: 22, + }, + VpaStatus: vpa_api.VerticalPodAutoscalerStatus{ + Recommendation: &vpaRecommendation, + }, + }, + } + + v1alpha1HVPA := v1alpha1.Hvpa{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: "default", + Annotations: map[string]string{ + "hpa-controller": "hvpa", + }, + }, + Spec: v1alpha1.HvpaSpec{ + TargetRef: &autoscaling.CrossVersionObjectReference{ + Kind: "Deployment", + Name: target, + APIVersion: "apps/v1", + }, + Hpa: v1alpha1.HpaSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "hpaKey": labelVal, + }, + }, + Deploy: true, + ScaleUp: v1alpha1.ScaleType{ + UpdatePolicy: v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + }, + ScaleDown: v1alpha1.ScaleType{ + UpdatePolicy: v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + }, + + Template: v1alpha1.HpaTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "hpaKey": labelVal, + }, + }, + Spec: v1alpha1.HpaTemplateSpec{ + MinReplicas: &replica, + MaxReplicas: 3, + Metrics: []autoscaling.MetricSpec{ + { + Type: autoscaling.ResourceMetricSourceType, + Resource: &autoscaling.ResourceMetricSource{ + Name: v1.ResourceCPU, + TargetAverageUtilization: &util, + }, + }, + }, + }, + }, + }, + Vpa: v1alpha1.VpaSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "vpaKey": labelVal, + }, + }, + Deploy: true, + ScaleUp: v1alpha1.ScaleType{ + UpdatePolicy: v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + MinChange: minChange, + }, + ScaleDown: v1alpha1.ScaleType{ + UpdatePolicy: v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + MinChange: minChange, + }, + Template: v1alpha1.VpaTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "vpaKey": labelVal, + }, + }, + }, + }, + WeightBasedScalingIntervals: []v1alpha1.WeightBasedScalingInterval{ + { + StartReplicaCount: 1, + LastReplicaCount: 2, + VpaWeight: 30, + }, + { + StartReplicaCount: 2, + LastReplicaCount: 3, + VpaWeight: 80, + }, + }, + MaintenanceTimeWindow: &v1alpha1.MaintenanceTimeWindow{ + Begin: "maintenance-begin", + End: "maintenance-end", + }, + }, + Status: v1alpha1.HvpaStatus{ + Replicas: &statusReplicas, + TargetSelector: &target, + HpaScaleUpUpdatePolicy: &v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + HpaScaleDownUpdatePolicy: &v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + VpaScaleUpUpdatePolicy: &v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + VpaScaleDownUpdatePolicy: &v1alpha1.UpdatePolicy{ + UpdateMode: &updateMode, + }, + HpaWeight: 33, + VpaWeight: 67, + OverrideScaleUpStabilization: true, + LastBlockedScaling: []*v1alpha1.BlockedScaling{&v1alpha1BlockedScaling}, + LastScaling: v1alpha1.ScalingStatus{ + LastScaleTime: &t, + HpaStatus: v1alpha1.HpaStatus{ + CurrentReplicas: 10, + DesiredReplicas: 12, + }, + VpaStatus: vpa_api.VerticalPodAutoscalerStatus{ + Recommendation: &vpaRecommendation, + Conditions: []vpa_api.VerticalPodAutoscalerCondition{{ + Status: "True", + Type: vpa_api.RecommendationProvided, + LastTransitionTime: t, + Reason: "vpa-condition-reason", + Message: "vpa-condition-message", + }}, + }, + }, + LastError: &v1alpha1.LastError{ + Description: "last-error", + LastUpdateTime: t, + LastOperation: "last-operation-before-error", + }, + }, + } + + v1alpha2HVPA := v1alpha2.Hvpa{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: "default", + Annotations: map[string]string{ + "hpa-controller": "hvpa", + }, + }, + Spec: v1alpha2.HvpaSpec{ + TargetRef: &autoscalingv2.CrossVersionObjectReference{ + Kind: "Deployment", + Name: target, + APIVersion: "apps/v1", + }, + Hpa: v1alpha2.HpaSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "hpaKey": labelVal, + }, + }, + Deploy: true, + ScaleUp: v1alpha2.ScaleType{ + UpdatePolicy: v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + }, + ScaleDown: v1alpha2.ScaleType{ + UpdatePolicy: v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + }, + + Template: v1alpha2.HpaTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "hpaKey": labelVal, + }, + }, + Spec: v1alpha2.HpaTemplateSpec{ + MinReplicas: &replica, + MaxReplicas: 3, + Metrics: []autoscalingv2.MetricSpec{ + { + Type: autoscalingv2.ResourceMetricSourceType, + Resource: &autoscalingv2.ResourceMetricSource{ + Name: v1.ResourceCPU, + Target: autoscalingv2.MetricTarget{ + Type: autoscalingv2.UtilizationMetricType, + AverageUtilization: &util, + }, + }, + }, + }, + }, + }, + }, + Vpa: v1alpha2.VpaSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "vpaKey": labelVal, + }, + }, + Deploy: true, + ScaleUp: v1alpha2.ScaleType{ + UpdatePolicy: v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + MinChange: v1alpha2.ScaleParams{ + CPU: v1alpha2.ChangeParams{ + Value: &valCPU, + Percentage: &percCPU, + }, + Memory: v1alpha2.ChangeParams{ + Value: &valMem, + Percentage: &percMem, + }, + }, + }, + ScaleDown: v1alpha2.ScaleType{ + UpdatePolicy: v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + StabilizationDuration: &stabilizationDur, + MinChange: v1alpha2.ScaleParams{ + CPU: v1alpha2.ChangeParams{ + Value: &valCPU, + Percentage: &percCPU, + }, + Memory: v1alpha2.ChangeParams{ + Value: &valMem, + Percentage: &percMem, + }, + }, + }, + Template: v1alpha2.VpaTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "vpaKey": labelVal, + }, + }, + }, + }, + WeightBasedScalingIntervals: []v1alpha2.WeightBasedScalingInterval{ + { + StartReplicaCount: 1, + LastReplicaCount: 2, + VpaWeight: 30, + }, + { + StartReplicaCount: 2, + LastReplicaCount: 3, + VpaWeight: 80, + }, + }, + MaintenanceTimeWindow: &v1alpha2.MaintenanceTimeWindow{ + Begin: "maintenance-begin", + End: "maintenance-end", + }, + }, + Status: v1alpha2.HvpaStatus{ + Replicas: &statusReplicas, + TargetSelector: &target, + HpaScaleUpUpdatePolicy: &v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + HpaScaleDownUpdatePolicy: &v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + VpaScaleUpUpdatePolicy: &v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + VpaScaleDownUpdatePolicy: &v1alpha2.UpdatePolicy{ + UpdateMode: &updateMode, + }, + HpaWeight: 33, + VpaWeight: 67, + OverrideScaleUpStabilization: true, + LastBlockedScaling: []*v1alpha2.BlockedScaling{&v1alpha2BlockedScaling}, + LastScaling: v1alpha2.ScalingStatus{ + LastScaleTime: &t, + HpaStatus: v1alpha2.HpaStatus{ + CurrentReplicas: 10, + DesiredReplicas: 12, + }, + VpaStatus: vpa_api.VerticalPodAutoscalerStatus{ + Recommendation: &vpaRecommendation, + Conditions: []vpa_api.VerticalPodAutoscalerCondition{{ + Status: "True", + Type: vpa_api.RecommendationProvided, + LastTransitionTime: t, + Reason: "vpa-condition-reason", + Message: "vpa-condition-message", + }}, + }, + }, + LastError: &v1alpha2.LastError{ + Description: "last-error", + LastUpdateTime: t, + LastOperation: "last-operation-before-error", + }, + }, + } + + format.MaxLength = 0 // diffs between HVPA object can be quite large, so make sure we see what's different + It("Should not error on empty conversion from v1alpha1 to v1alpha2", func() { + destination := v1alpha2.Hvpa{} + source := v1alpha1.Hvpa{} + Expect(destination.ConvertFrom(&source)).To(Succeed()) + Expect(destination).To(Equal(v1alpha2.Hvpa{})) + }) + + It("Should not error on empty conversion from v1alpha2 to v1alpha1", func() { + destination := v1alpha1.Hvpa{} + source := v1alpha2.Hvpa{} + Expect(source.ConvertTo(&destination)).To(Succeed()) + Expect(destination).To(Equal(v1alpha1.Hvpa{})) + }) + + It("Should convert from v1alpha1 to v1alpha2", func() { + destination := v1alpha2.Hvpa{} + Expect(destination.ConvertFrom(&v1alpha1HVPA)).To(Succeed()) + Expect(destination).To(Equal(v1alpha2HVPA)) + }) + + It("Should convert from v1alpha2 to v1alpha1", func() { + destination := v1alpha1.Hvpa{} + Expect(v1alpha2HVPA.ConvertTo(&destination)).To(Succeed()) + Expect(destination).To(Equal(v1alpha1HVPA)) + }) +}) diff --git a/apis/autoscaling/v1alpha2/hvpa_types.go b/apis/autoscaling/v1alpha2/hvpa_types.go new file mode 100644 index 00000000..1a478165 --- /dev/null +++ b/apis/autoscaling/v1alpha2/hvpa_types.go @@ -0,0 +1,348 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha2 + +import ( + autoscalingv2 "k8s.io/api/autoscaling/v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + vpa_api "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" +) + +// VpaTemplateSpec defines the spec for VPA +type VpaTemplateSpec struct { + // Controls how the autoscaler computes recommended resources. + // The resource policy may be used to set constraints on the recommendations + // for individual containers. If not specified, the autoscaler computes recommended + // resources for all containers in the pod, without additional constraints. + // +optional + ResourcePolicy *vpa_api.PodResourcePolicy `json:"resourcePolicy,omitempty" protobuf:"bytes,2,opt,name=resourcePolicy"` +} + +// UpdatePolicy describes the rules on how changes are applied. +type UpdatePolicy struct { + // Controls when autoscaler applies changes to the resources. + // The default is 'Auto'. + // +optional + UpdateMode *string `json:"updateMode,omitempty" protobuf:"bytes,1,opt,name=updateMode"` +} + +const ( + // UpdateModeOff means that autoscaler never changes resources. + UpdateModeOff string = "Off" + // UpdateModeAuto means that autoscaler can update resources during the lifetime of the resource. + UpdateModeAuto string = "Auto" + // UpdateModeMaintenanceWindow means that HPA/VPA will only act during maintenance window. + UpdateModeMaintenanceWindow string = "MaintenanceWindow" + + // UpdateModeDefault is the default update mode + UpdateModeDefault = UpdateModeAuto +) + +// MaintenanceTimeWindow contains information about the time window for maintenance operations. +type MaintenanceTimeWindow struct { + // Begin is the beginning of the time window in the format HHMMSS+ZONE, e.g. "220000+0100". + Begin string `json:"begin"` + // End is the end of the time window in the format HHMMSS+ZONE, e.g. "220000+0100". + End string `json:"end"` +} + +// HpaTemplateSpec defines the spec for HPA +type HpaTemplateSpec struct { + // minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. + // It defaults to 1 pod. + // +optional + MinReplicas *int32 `json:"minReplicas,omitempty" protobuf:"varint,1,opt,name=minReplicas"` + + // maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. + // It cannot be less that minReplicas. + MaxReplicas int32 `json:"maxReplicas" protobuf:"varint,2,opt,name=maxReplicas"` + + // metrics contains the specifications for which to use to calculate the + // desired replica count (the maximum replica count across all metrics will + // be used). The desired replica count is calculated multiplying the + // ratio between the target value and the current value by the current + // number of pods. Ergo, metrics used must decrease as the pod count is + // increased, and vice-versa. See the individual metric source types for + // more information about how each type of metric must respond. + // If not set, the default metric will be set to 80% average CPU utilization. + // +optional + Metrics []autoscalingv2.MetricSpec `json:"metrics,omitempty" protobuf:"bytes,3,rep,name=metrics"` +} + +// WeightBasedScalingInterval defines the interval of replica counts in which VpaWeight is applied to VPA scaling +type WeightBasedScalingInterval struct { + // VpaWeight defines the weight (in percentage) to be given to VPA's recommendationd for the interval of number of replicas provided + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=100 + VpaWeight int32 `json:"vpaWeight,omitempty"` + // StartReplicaCount is the number of replicas from which VpaWeight is applied to VPA scaling + // If this field is not provided, it will default to minReplicas of HPA + // +optional + StartReplicaCount int32 `json:"startReplicaCount,omitempty"` + // LastReplicaCount is the number of replicas till which VpaWeight is applied to VPA scaling + // If this field is not provided, it will default to maxReplicas of HPA + // +optional + LastReplicaCount int32 `json:"lastReplicaCount,omitempty"` +} + +// VpaSpec defines spec for VPA +type VpaSpec struct { + // Selector is a label query that should match VPA. + // Must match in order to be controlled. + // If empty, defaulted to labels on VPA template. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty"` + + // Deploy defines whether the VPA is deployed or not + Deploy bool `json:"deploy,omitempty"` + + // ScaleUp defines the parameters for scale up + ScaleUp ScaleType `json:"scaleUp,omitempty"` + + // ScaleDown defines the parameters for scale down + ScaleDown ScaleType `json:"scaleDown,omitempty"` + + // Template is the object that describes the VPA that will be created. + // +optional + Template VpaTemplate `json:"template,omitempty"` + + // LimitsRequestsGapScaleParams is the scaling thresholds for limits + LimitsRequestsGapScaleParams ScaleParams `json:"limitsRequestsGapScaleParams,omitempty"` +} + +// ScaleType defines parameters for scaling +type ScaleType struct { + // Describes the rules on when changes are applied. + // If not specified, all fields in the `UpdatePolicy` are set to their + // default values. + // +optional + UpdatePolicy UpdatePolicy `json:"updatePolicy,omitempty"` + + // MinChange is the minimum change in the resource on which HVPA acts + // HVPA uses minimum of the Value and Percentage value + MinChange ScaleParams `json:"minChange,omitempty"` + + // StabilizationDuration defines the minimum delay in minutes between 2 consecutive scale operations + // Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + StabilizationDuration *string `json:"stabilizationDuration,omitempty"` +} + +// ScaleParams defines the scaling parameters for the limits +type ScaleParams struct { + // Scale parameters for CPU + CPU ChangeParams `json:"cpu,omitempty"` + // Scale parameters for memory + Memory ChangeParams `json:"memory,omitempty"` + // Scale patameters for replicas + Replicas ChangeParams `json:"replicas,omitempty"` +} + +// VpaTemplate defines the template for VPA +type VpaTemplate struct { + // Metadata of the pods created from this template. + // +kubebuilder:validation:XPreserveUnknownFields + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec defines the behavior of a VPA. + // +optional + Spec VpaTemplateSpec `json:"spec,omitempty"` +} + +// HpaTemplate defines the template for HPA +type HpaTemplate struct { + // Metadata of the pods created from this template. + // +kubebuilder:validation:XPreserveUnknownFields + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec defines the behavior of a HPA. + // +optional + Spec HpaTemplateSpec `json:"spec,omitempty"` +} + +// HpaSpec defines spec for HPA +type HpaSpec struct { + // Selector is a label query that should match HPA. + // Must match in order to be controlled. + // If empty, defaulted to labels on HPA template. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty"` + + // Deploy defines whether the HPA is deployed or not + Deploy bool `json:"deploy,omitempty"` + + // ScaleUp defines the parameters for scale up + ScaleUp ScaleType `json:"scaleUp,omitempty"` + + // ScaleDown defines the parameters for scale down + ScaleDown ScaleType `json:"scaleDown,omitempty"` + + // Template is the object that describes the HPA that will be created. + // +optional + Template HpaTemplate `json:"template,omitempty"` +} + +// HvpaSpec defines the desired state of Hvpa +type HvpaSpec struct { + // Replicas is the number of replicas of target resource + Replicas *int32 `json:"replicas,omitempty"` + + // Hpa defines the spec of HPA + Hpa HpaSpec `json:"hpa,omitempty"` + + // Vpa defines the spec of VPA + Vpa VpaSpec `json:"vpa,omitempty"` + + // WeightBasedScalingIntervals defines the intervals of replica counts, and the weights for scaling a deployment vertically + // If there are overlapping intervals, then the vpaWeight will be taken from the first matching interval + WeightBasedScalingIntervals []WeightBasedScalingInterval `json:"weightBasedScalingIntervals,omitempty"` + + // TargetRef points to the controller managing the set of pods for the autoscaler to control + TargetRef *autoscalingv2.CrossVersionObjectReference `json:"targetRef"` + + // MaintenanceTimeWindow contains information about the time window for maintenance operations. + // +optional + MaintenanceTimeWindow *MaintenanceTimeWindow `json:"maintenanceTimeWindow,omitempty"` +} + +// ChangeParams defines the parameters for scaling +type ChangeParams struct { + // Value is the absolute value of the scaling + // +optional + Value *string `json:"value,omitempty"` + // Percentage is the percentage of currently allocated value to be used for scaling + // +optional + Percentage *int32 `json:"percentage,omitempty"` +} + +const ( + // VpaOnly - only vertical scaling + VpaOnly int32 = 100 + // HpaOnly - only horizontal scaling + HpaOnly int32 = 0 +) + +// LastError has detailed information of the error +type LastError struct { + // Description of the error + Description string `json:"description,omitempty"` + + // Time at which the error occurred + LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` + + // LastOperation is the type of operation for which error occurred + LastOperation string `json:"lastOperation,omitempty"` +} + +// HvpaStatus defines the observed state of Hvpa +type HvpaStatus struct { + // Replicas is the number of replicas of the target resource. + Replicas *int32 `json:"replicas,omitempty"` + // TargetSelector is the string form of the label selector of HPA. This is required for HPA to work with scale subresource. + TargetSelector *string `json:"targetSelector,omitempty"` + // Current HPA UpdatePolicy set in the spec + HpaScaleUpUpdatePolicy *UpdatePolicy `json:"hpaScaleUpUpdatePolicy,omitempty"` + // Current HPA UpdatePolicy set in the spec + HpaScaleDownUpdatePolicy *UpdatePolicy `json:"hpaScaleDownUpdatePolicy,omitempty"` + // Current VPA UpdatePolicy set in the spec + VpaScaleUpUpdatePolicy *UpdatePolicy `json:"vpaScaleUpUpdatePolicy,omitempty"` + // Current VPA UpdatePolicy set in the spec + VpaScaleDownUpdatePolicy *UpdatePolicy `json:"vpaScaleDownUpdatePolicy,omitempty"` + + HpaWeight int32 `json:"hpaWeight,omitempty"` + VpaWeight int32 `json:"vpaWeight,omitempty"` + + // Override scale up stabilization window + OverrideScaleUpStabilization bool `json:"overrideScaleUpStabilization,omitempty"` + + LastBlockedScaling []*BlockedScaling `json:"lastBlockedScaling,omitempty"` + LastScaling ScalingStatus `json:"lastScaling,omitempty"` + + // LastError has details of any errors that occurred + LastError *LastError `json:"lastError,omitempty"` +} + +// BlockingReason defines the reason for blocking. +type BlockingReason string + +const ( + // BlockingReasonStabilizationWindow - HVPA is in stabilization window + BlockingReasonStabilizationWindow BlockingReason = "StabilizationWindow" + // BlockingReasonMaintenanceWindow - Resource is in maintenance window + BlockingReasonMaintenanceWindow BlockingReason = "MaintenanceWindow" + // BlockingReasonUpdatePolicy - Update policy doesn't support scaling + BlockingReasonUpdatePolicy BlockingReason = "UpdatePolicy" + // BlockingReasonWeight - VpaWeight doesn't support scaling + BlockingReasonWeight BlockingReason = "Weight" + // BlockingReasonMinChange - Min change doesn't support scaling + BlockingReasonMinChange BlockingReason = "MinChange" +) + +// BlockingReasons lists all the blocking reasons +var BlockingReasons = [...]BlockingReason{ + BlockingReasonMaintenanceWindow, + BlockingReasonMinChange, + BlockingReasonStabilizationWindow, + BlockingReasonUpdatePolicy, + BlockingReasonWeight, +} + +// BlockedScaling defines the details for blocked scaling +type BlockedScaling struct { + Reason BlockingReason `json:"reason,omitempty"` + ScalingStatus `json:"scalingStatus,omitempty"` +} + +// ScalingStatus defines the status of scaling +type ScalingStatus struct { + LastScaleTime *metav1.Time `json:"lastScaleTime,omitempty"` + HpaStatus HpaStatus `json:"hpaStatus,omitempty" protobuf:"bytes,1,opt,name=hpaStatus"` + VpaStatus vpa_api.VerticalPodAutoscalerStatus `json:"vpaStatus,omitempty" protobuf:"bytes,2,opt,name=vpaStatus"` +} + +// HpaStatus defines the status of HPA +type HpaStatus struct { + CurrentReplicas int32 `json:"currentReplicas,omitempty"` + DesiredReplicas int32 `json:"desiredReplicas,omitempty"` +} + +// Hvpa is the Schema for the hvpas API +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:subresource:scale:specpath=.spec.replicas,statuspath=.status.replicas,selectorpath=.status.targetSelector +type Hvpa struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec HvpaSpec `json:"spec,omitempty"` + Status HvpaStatus `json:"status,omitempty"` +} + +// HvpaList contains a list of Hvpa +// +kubebuilder:object:root=true +type HvpaList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Hvpa `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Hvpa{}, &HvpaList{}) +} diff --git a/apis/autoscaling/v1alpha2/hvpa_webhook.go b/apis/autoscaling/v1alpha2/hvpa_webhook.go new file mode 100644 index 00000000..1a30a21c --- /dev/null +++ b/apis/autoscaling/v1alpha2/hvpa_webhook.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha2 + +import ( + ctrl "sigs.k8s.io/controller-runtime" + logf "sigs.k8s.io/controller-runtime/pkg/log" +) + +// log is for logging in this package. +var hvpalog = logf.Log.WithName("hvpa-resource") + +func (r *Hvpa) SetupWebhookWithManager(mgr ctrl.Manager) error { + return ctrl.NewWebhookManagedBy(mgr). + For(r). + Complete() +} diff --git a/apis/autoscaling/v1alpha2/v1alpha2_suite_test.go b/apis/autoscaling/v1alpha2/v1alpha2_suite_test.go new file mode 100644 index 00000000..ecd88b1c --- /dev/null +++ b/apis/autoscaling/v1alpha2/v1alpha2_suite_test.go @@ -0,0 +1,13 @@ +package v1alpha2_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestV1alpha2(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "V1alpha2 Suite") +} diff --git a/apis/autoscaling/v1alpha2/zz_generated.deepcopy.go b/apis/autoscaling/v1alpha2/zz_generated.deepcopy.go new file mode 100644 index 00000000..54442e32 --- /dev/null +++ b/apis/autoscaling/v1alpha2/zz_generated.deepcopy.go @@ -0,0 +1,498 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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. +*/ + +// Code generated by controller-gen. DO NOT EDIT. + +package v1alpha2 + +import ( + "k8s.io/api/autoscaling/v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BlockedScaling) DeepCopyInto(out *BlockedScaling) { + *out = *in + in.ScalingStatus.DeepCopyInto(&out.ScalingStatus) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BlockedScaling. +func (in *BlockedScaling) DeepCopy() *BlockedScaling { + if in == nil { + return nil + } + out := new(BlockedScaling) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ChangeParams) DeepCopyInto(out *ChangeParams) { + *out = *in + if in.Value != nil { + in, out := &in.Value, &out.Value + *out = new(string) + **out = **in + } + if in.Percentage != nil { + in, out := &in.Percentage, &out.Percentage + *out = new(int32) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChangeParams. +func (in *ChangeParams) DeepCopy() *ChangeParams { + if in == nil { + return nil + } + out := new(ChangeParams) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaSpec) DeepCopyInto(out *HpaSpec) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + in.ScaleUp.DeepCopyInto(&out.ScaleUp) + in.ScaleDown.DeepCopyInto(&out.ScaleDown) + in.Template.DeepCopyInto(&out.Template) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaSpec. +func (in *HpaSpec) DeepCopy() *HpaSpec { + if in == nil { + return nil + } + out := new(HpaSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaStatus) DeepCopyInto(out *HpaStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaStatus. +func (in *HpaStatus) DeepCopy() *HpaStatus { + if in == nil { + return nil + } + out := new(HpaStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaTemplate) DeepCopyInto(out *HpaTemplate) { + *out = *in + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaTemplate. +func (in *HpaTemplate) DeepCopy() *HpaTemplate { + if in == nil { + return nil + } + out := new(HpaTemplate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaTemplateSpec) DeepCopyInto(out *HpaTemplateSpec) { + *out = *in + if in.MinReplicas != nil { + in, out := &in.MinReplicas, &out.MinReplicas + *out = new(int32) + **out = **in + } + if in.Metrics != nil { + in, out := &in.Metrics, &out.Metrics + *out = make([]v2.MetricSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaTemplateSpec. +func (in *HpaTemplateSpec) DeepCopy() *HpaTemplateSpec { + if in == nil { + return nil + } + out := new(HpaTemplateSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Hvpa) DeepCopyInto(out *Hvpa) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Hvpa. +func (in *Hvpa) DeepCopy() *Hvpa { + if in == nil { + return nil + } + out := new(Hvpa) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Hvpa) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HvpaList) DeepCopyInto(out *HvpaList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Hvpa, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HvpaList. +func (in *HvpaList) DeepCopy() *HvpaList { + if in == nil { + return nil + } + out := new(HvpaList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *HvpaList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HvpaSpec) DeepCopyInto(out *HvpaSpec) { + *out = *in + if in.Replicas != nil { + in, out := &in.Replicas, &out.Replicas + *out = new(int32) + **out = **in + } + in.Hpa.DeepCopyInto(&out.Hpa) + in.Vpa.DeepCopyInto(&out.Vpa) + if in.WeightBasedScalingIntervals != nil { + in, out := &in.WeightBasedScalingIntervals, &out.WeightBasedScalingIntervals + *out = make([]WeightBasedScalingInterval, len(*in)) + copy(*out, *in) + } + if in.TargetRef != nil { + in, out := &in.TargetRef, &out.TargetRef + *out = new(v2.CrossVersionObjectReference) + **out = **in + } + if in.MaintenanceTimeWindow != nil { + in, out := &in.MaintenanceTimeWindow, &out.MaintenanceTimeWindow + *out = new(MaintenanceTimeWindow) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HvpaSpec. +func (in *HvpaSpec) DeepCopy() *HvpaSpec { + if in == nil { + return nil + } + out := new(HvpaSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HvpaStatus) DeepCopyInto(out *HvpaStatus) { + *out = *in + if in.Replicas != nil { + in, out := &in.Replicas, &out.Replicas + *out = new(int32) + **out = **in + } + if in.TargetSelector != nil { + in, out := &in.TargetSelector, &out.TargetSelector + *out = new(string) + **out = **in + } + if in.HpaScaleUpUpdatePolicy != nil { + in, out := &in.HpaScaleUpUpdatePolicy, &out.HpaScaleUpUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.HpaScaleDownUpdatePolicy != nil { + in, out := &in.HpaScaleDownUpdatePolicy, &out.HpaScaleDownUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.VpaScaleUpUpdatePolicy != nil { + in, out := &in.VpaScaleUpUpdatePolicy, &out.VpaScaleUpUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.VpaScaleDownUpdatePolicy != nil { + in, out := &in.VpaScaleDownUpdatePolicy, &out.VpaScaleDownUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.LastBlockedScaling != nil { + in, out := &in.LastBlockedScaling, &out.LastBlockedScaling + *out = make([]*BlockedScaling, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(BlockedScaling) + (*in).DeepCopyInto(*out) + } + } + } + in.LastScaling.DeepCopyInto(&out.LastScaling) + if in.LastError != nil { + in, out := &in.LastError, &out.LastError + *out = new(LastError) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HvpaStatus. +func (in *HvpaStatus) DeepCopy() *HvpaStatus { + if in == nil { + return nil + } + out := new(HvpaStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LastError) DeepCopyInto(out *LastError) { + *out = *in + in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LastError. +func (in *LastError) DeepCopy() *LastError { + if in == nil { + return nil + } + out := new(LastError) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MaintenanceTimeWindow) DeepCopyInto(out *MaintenanceTimeWindow) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MaintenanceTimeWindow. +func (in *MaintenanceTimeWindow) DeepCopy() *MaintenanceTimeWindow { + if in == nil { + return nil + } + out := new(MaintenanceTimeWindow) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScaleParams) DeepCopyInto(out *ScaleParams) { + *out = *in + in.CPU.DeepCopyInto(&out.CPU) + in.Memory.DeepCopyInto(&out.Memory) + in.Replicas.DeepCopyInto(&out.Replicas) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScaleParams. +func (in *ScaleParams) DeepCopy() *ScaleParams { + if in == nil { + return nil + } + out := new(ScaleParams) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScaleType) DeepCopyInto(out *ScaleType) { + *out = *in + in.UpdatePolicy.DeepCopyInto(&out.UpdatePolicy) + in.MinChange.DeepCopyInto(&out.MinChange) + if in.StabilizationDuration != nil { + in, out := &in.StabilizationDuration, &out.StabilizationDuration + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScaleType. +func (in *ScaleType) DeepCopy() *ScaleType { + if in == nil { + return nil + } + out := new(ScaleType) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScalingStatus) DeepCopyInto(out *ScalingStatus) { + *out = *in + if in.LastScaleTime != nil { + in, out := &in.LastScaleTime, &out.LastScaleTime + *out = (*in).DeepCopy() + } + out.HpaStatus = in.HpaStatus + in.VpaStatus.DeepCopyInto(&out.VpaStatus) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScalingStatus. +func (in *ScalingStatus) DeepCopy() *ScalingStatus { + if in == nil { + return nil + } + out := new(ScalingStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpdatePolicy) DeepCopyInto(out *UpdatePolicy) { + *out = *in + if in.UpdateMode != nil { + in, out := &in.UpdateMode, &out.UpdateMode + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdatePolicy. +func (in *UpdatePolicy) DeepCopy() *UpdatePolicy { + if in == nil { + return nil + } + out := new(UpdatePolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VpaSpec) DeepCopyInto(out *VpaSpec) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + in.ScaleUp.DeepCopyInto(&out.ScaleUp) + in.ScaleDown.DeepCopyInto(&out.ScaleDown) + in.Template.DeepCopyInto(&out.Template) + in.LimitsRequestsGapScaleParams.DeepCopyInto(&out.LimitsRequestsGapScaleParams) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VpaSpec. +func (in *VpaSpec) DeepCopy() *VpaSpec { + if in == nil { + return nil + } + out := new(VpaSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VpaTemplate) DeepCopyInto(out *VpaTemplate) { + *out = *in + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VpaTemplate. +func (in *VpaTemplate) DeepCopy() *VpaTemplate { + if in == nil { + return nil + } + out := new(VpaTemplate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VpaTemplateSpec) DeepCopyInto(out *VpaTemplateSpec) { + *out = *in + if in.ResourcePolicy != nil { + in, out := &in.ResourcePolicy, &out.ResourcePolicy + *out = new(v1.PodResourcePolicy) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VpaTemplateSpec. +func (in *VpaTemplateSpec) DeepCopy() *VpaTemplateSpec { + if in == nil { + return nil + } + out := new(VpaTemplateSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WeightBasedScalingInterval) DeepCopyInto(out *WeightBasedScalingInterval) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WeightBasedScalingInterval. +func (in *WeightBasedScalingInterval) DeepCopy() *WeightBasedScalingInterval { + if in == nil { + return nil + } + out := new(WeightBasedScalingInterval) + in.DeepCopyInto(out) + return out +} diff --git a/config/certmanager/certificate.yaml b/config/certmanager/certificate.yaml index 02bdc1bf..e923b4b3 100644 --- a/config/certmanager/certificate.yaml +++ b/config/certmanager/certificate.yaml @@ -1,24 +1,39 @@ # The following manifests contain a self-signed issuer CR and a certificate CR. # More document can be found at https://docs.cert-manager.io -apiVersion: certmanager.k8s.io/v1alpha1 +# WARNING: Targets CertManager v1.0. Check https://cert-manager.io/docs/installation/upgrading/ for breaking changes. +apiVersion: cert-manager.io/v1 kind: Issuer metadata: + labels: + app.kubernetes.io/name: issuer + app.kubernetes.io/instance: selfsigned-issuer + app.kubernetes.io/component: certificate + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize name: selfsigned-issuer namespace: system spec: selfSigned: {} --- -apiVersion: certmanager.k8s.io/v1alpha1 +apiVersion: cert-manager.io/v1 kind: Certificate metadata: + labels: + app.kubernetes.io/name: certificate + app.kubernetes.io/instance: serving-cert + app.kubernetes.io/component: certificate + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize name: serving-cert # this name should match the one appeared in kustomizeconfig.yaml namespace: system spec: # $(SERVICE_NAME) and $(SERVICE_NAMESPACE) will be substituted by kustomize - commonName: $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc dnsNames: + - $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc - $(SERVICE_NAME).$(SERVICE_NAMESPACE).svc.cluster.local issuerRef: kind: Issuer name: selfsigned-issuer - secretName: webhook-server-cert # this secret will not be prefixed, since it's not managed by kustomize + secretName: webhook-server-cert # this secret will not be prefixed, since it's not managed by kustomize \ No newline at end of file diff --git a/config/certmanager/kustomizeconfig.yaml b/config/certmanager/kustomizeconfig.yaml index 49e0b1e7..77d3dfe5 100644 --- a/config/certmanager/kustomizeconfig.yaml +++ b/config/certmanager/kustomizeconfig.yaml @@ -1,16 +1,16 @@ # This configuration is for teaching kustomize how to update name ref and var substitution nameReference: - kind: Issuer - group: certmanager.k8s.io + group: cert-manager.io fieldSpecs: - kind: Certificate - group: certmanager.k8s.io + group: cert-manager.io path: spec/issuerRef/name varReference: - kind: Certificate - group: certmanager.k8s.io + group: cert-manager.io path: spec/commonName - kind: Certificate - group: certmanager.k8s.io - path: spec/dnsNames + group: cert-manager.io + path: spec/dnsNames \ No newline at end of file diff --git a/config/crd/bases/autoscaling.k8s.io_hvpas.yaml b/config/crd/bases/autoscaling.k8s.io_hvpas.yaml index b525e9ed..d5f3cb7c 100644 --- a/config/crd/bases/autoscaling.k8s.io_hvpas.yaml +++ b/config/crd/bases/autoscaling.k8s.io_hvpas.yaml @@ -1339,3 +1339,1478 @@ spec: specReplicasPath: .spec.replicas statusReplicasPath: .status.replicas status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: Hvpa is the Schema for the hvpas API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: HvpaSpec defines the desired state of Hvpa + properties: + hpa: + description: Hpa defines the spec of HPA + properties: + deploy: + description: Deploy defines whether the HPA is deployed or not + type: boolean + scaleDown: + description: ScaleDown defines the parameters for scale down + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + scaleUp: + description: ScaleUp defines the parameters for scale up + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + selector: + description: 'Selector is a label query that should match HPA. + Must match in order to be controlled. If empty, defaulted to + labels on HPA template. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If + the operator is In or NotIn, the values array must + be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced + during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. A + single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field is "key", + the operator is "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + template: + description: Template is the object that describes the HPA that + will be created. + properties: + metadata: + description: Metadata of the pods created from this template. + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: Spec defines the behavior of a HPA. + properties: + maxReplicas: + description: maxReplicas is the upper limit for the number + of replicas to which the autoscaler can scale up. It + cannot be less that minReplicas. + format: int32 + type: integer + metrics: + description: metrics contains the specifications for which + to use to calculate the desired replica count (the maximum + replica count across all metrics will be used). The + desired replica count is calculated multiplying the + ratio between the target value and the current value + by the current number of pods. Ergo, metrics used must + decrease as the pod count is increased, and vice-versa. See + the individual metric source types for more information + about how each type of metric must respond. If not set, + the default metric will be set to 80% average CPU utilization. + items: + description: MetricSpec specifies how to scale based + on a single metric (only `type` and one other matching + field should be set at once). + properties: + containerResource: + description: containerResource refers to a resource + metric (such as those specified in requests and + limits) known to Kubernetes describing a single + container in each pod of the current scale target + (e.g. CPU or memory). Such metrics are built in + to Kubernetes, and have special scaling options + on top of those available to normal per-pod metrics + using the "pods" source. This is an alpha feature + and can be enabled by the HPAContainerMetrics + feature flag. + properties: + container: + description: container is the name of the container + in the pods of the scaling target + type: string + name: + description: name is the name of the resource + in question. + type: string + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - container + - name + - target + type: object + external: + description: external refers to a global metric + that is not associated with any Kubernetes object. + It allows autoscaling based on information coming + from components running outside of cluster (for + example length of queue in cloud messaging service, + or QPS from loadbalancer running outside of cluster). + properties: + metric: + description: metric identifies the target metric + by name and selector + properties: + name: + description: name is the name of the given + metric + type: string + selector: + description: selector is the string-encoded + form of a standard kubernetes label selector + for the given metric When set, it is passed + as an additional parameter to the metrics + server for more specific metrics scoping. + When unset, just the metricName will be + used to gather metrics. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + object: + description: object refers to a metric describing + a single kubernetes object (for example, hits-per-second + on an Ingress object). + properties: + describedObject: + description: describedObject specifies the descriptions + of a object,such as kind,name apiVersion + properties: + apiVersion: + description: API version of the referent + type: string + kind: + description: 'Kind of the referent; More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"' + type: string + name: + description: 'Name of the referent; More + info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + required: + - kind + - name + type: object + metric: + description: metric identifies the target metric + by name and selector + properties: + name: + description: name is the name of the given + metric + type: string + selector: + description: selector is the string-encoded + form of a standard kubernetes label selector + for the given metric When set, it is passed + as an additional parameter to the metrics + server for more specific metrics scoping. + When unset, just the metricName will be + used to gather metrics. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - describedObject + - metric + - target + type: object + pods: + description: pods refers to a metric describing + each pod in the current scale target (for example, + transactions-processed-per-second). The values + will be averaged together before being compared + to the target value. + properties: + metric: + description: metric identifies the target metric + by name and selector + properties: + name: + description: name is the name of the given + metric + type: string + selector: + description: selector is the string-encoded + form of a standard kubernetes label selector + for the given metric When set, it is passed + as an additional parameter to the metrics + server for more specific metrics scoping. + When unset, just the metricName will be + used to gather metrics. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + resource: + description: resource refers to a resource metric + (such as those specified in requests and limits) + known to Kubernetes describing each pod in the + current scale target (e.g. CPU or memory). Such + metrics are built in to Kubernetes, and have special + scaling options on top of those available to normal + per-pod metrics using the "pods" source. + properties: + name: + description: name is the name of the resource + in question. + type: string + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - name + - target + type: object + type: + description: 'type is the type of metric source. It + should be one of "ContainerResource", "External", + "Object", "Pods" or "Resource", each mapping to + a matching field in the object. Note: "ContainerResource" + type is available on when the feature-gate HPAContainerMetrics + is enabled' + type: string + required: + - type + type: object + type: array + minReplicas: + description: minReplicas is the lower limit for the number + of replicas to which the autoscaler can scale down. + It defaults to 1 pod. + format: int32 + type: integer + required: + - maxReplicas + type: object + type: object + type: object + maintenanceTimeWindow: + description: MaintenanceTimeWindow contains information about the + time window for maintenance operations. + properties: + begin: + description: Begin is the beginning of the time window in the + format HHMMSS+ZONE, e.g. "220000+0100". + type: string + end: + description: End is the end of the time window in the format HHMMSS+ZONE, + e.g. "220000+0100". + type: string + required: + - begin + - end + type: object + replicas: + description: Replicas is the number of replicas of target resource + format: int32 + type: integer + targetRef: + description: TargetRef points to the controller managing the set of + pods for the autoscaler to control + properties: + apiVersion: + description: API version of the referent + type: string + kind: + description: 'Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"' + type: string + name: + description: 'Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + required: + - kind + - name + type: object + vpa: + description: Vpa defines the spec of VPA + properties: + deploy: + description: Deploy defines whether the VPA is deployed or not + type: boolean + limitsRequestsGapScaleParams: + description: LimitsRequestsGapScaleParams is the scaling thresholds + for limits + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + scaleDown: + description: ScaleDown defines the parameters for scale down + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + scaleUp: + description: ScaleUp defines the parameters for scale up + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + selector: + description: 'Selector is a label query that should match VPA. + Must match in order to be controlled. If empty, defaulted to + labels on VPA template. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If + the operator is In or NotIn, the values array must + be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced + during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. A + single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field is "key", + the operator is "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + template: + description: Template is the object that describes the VPA that + will be created. + properties: + metadata: + description: Metadata of the pods created from this template. + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: Spec defines the behavior of a VPA. + properties: + resourcePolicy: + description: Controls how the autoscaler computes recommended + resources. The resource policy may be used to set constraints + on the recommendations for individual containers. If + not specified, the autoscaler computes recommended resources + for all containers in the pod, without additional constraints. + properties: + containerPolicies: + description: Per-container resource policies. + items: + description: ContainerResourcePolicy controls how + autoscaler computes the recommended resources + for a specific container. + properties: + containerName: + description: Name of the container or DefaultContainerResourcePolicy, + in which case the policy is used by the containers + that don't have their own policy specified. + type: string + controlledResources: + description: Specifies the type of recommendations + that will be computed (and possibly applied) + by VPA. If not specified, the default of [ResourceCPU, + ResourceMemory] will be used. + items: + description: ResourceName is the name identifying + various resources in a ResourceList. + type: string + type: array + controlledValues: + description: Specifies which resource values + should be controlled. The default is "RequestsAndLimits". + type: string + maxAllowed: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Specifies the maximum amount of + resources that will be recommended for the + container. The default is no maximum. + type: object + minAllowed: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Specifies the minimal amount of + resources that will be recommended for the + container. The default is no minimum. + type: object + mode: + description: Whether autoscaler is enabled for + the container. The default is "Auto". + type: string + type: object + type: array + type: object + type: object + type: object + type: object + weightBasedScalingIntervals: + description: WeightBasedScalingIntervals defines the intervals of + replica counts, and the weights for scaling a deployment vertically + If there are overlapping intervals, then the vpaWeight will be taken + from the first matching interval + items: + description: WeightBasedScalingInterval defines the interval of + replica counts in which VpaWeight is applied to VPA scaling + properties: + lastReplicaCount: + description: LastReplicaCount is the number of replicas till + which VpaWeight is applied to VPA scaling If this field is + not provided, it will default to maxReplicas of HPA + format: int32 + type: integer + startReplicaCount: + description: StartReplicaCount is the number of replicas from + which VpaWeight is applied to VPA scaling If this field is + not provided, it will default to minReplicas of HPA + format: int32 + type: integer + vpaWeight: + description: VpaWeight defines the weight (in percentage) to + be given to VPA's recommendationd for the interval of number + of replicas provided + format: int32 + maximum: 100 + minimum: 0 + type: integer + type: object + type: array + required: + - targetRef + type: object + status: + description: HvpaStatus defines the observed state of Hvpa + properties: + hpaScaleDownUpdatePolicy: + description: Current HPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + hpaScaleUpUpdatePolicy: + description: Current HPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + hpaWeight: + format: int32 + type: integer + lastBlockedScaling: + items: + description: BlockedScaling defines the details for blocked scaling + properties: + reason: + description: BlockingReason defines the reason for blocking. + type: string + scalingStatus: + description: ScalingStatus defines the status of scaling + properties: + hpaStatus: + description: HpaStatus defines the status of HPA + properties: + currentReplicas: + format: int32 + type: integer + desiredReplicas: + format: int32 + type: integer + type: object + lastScaleTime: + format: date-time + type: string + vpaStatus: + description: VerticalPodAutoscalerStatus describes the runtime + state of the autoscaler. + properties: + conditions: + description: Conditions is the set of conditions required + for this autoscaler to scale its target, and indicates + whether or not those conditions are met. + items: + description: VerticalPodAutoscalerCondition describes + the state of a VerticalPodAutoscaler at a certain + point. + properties: + lastTransitionTime: + description: lastTransitionTime is the last time + the condition transitioned from one status to + another + format: date-time + type: string + message: + description: message is a human-readable explanation + containing details about the transition + type: string + reason: + description: reason is the reason for the condition's + last transition. + type: string + status: + description: status is the status of the condition + (True, False, Unknown) + type: string + type: + description: type describes the current condition + type: string + required: + - status + - type + type: object + type: array + recommendation: + description: The most recently computed amount of resources + recommended by the autoscaler for the controlled pods. + properties: + containerRecommendations: + description: Resources recommended by the autoscaler + for each container. + items: + description: RecommendedContainerResources is + the recommendation of resources computed by + autoscaler for a specific container. Respects + the container resource policy if present in + the spec. In particular the recommendation is + not produced for containers with `ContainerScalingMode` + set to 'Off'. + properties: + containerName: + description: Name of the container. + type: string + lowerBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Minimum recommended amount of + resources. Observes ContainerResourcePolicy. + This amount is not guaranteed to be sufficient + for the application to operate in a stable + way, however running with less resources + is likely to have significant impact on + performance/availability. + type: object + target: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Recommended amount of resources. + Observes ContainerResourcePolicy. + type: object + uncappedTarget: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: The most recent recommended resources + target computed by the autoscaler for the + controlled pods, based only on actual resource + usage, not taking into account the ContainerResourcePolicy. + May differ from the Recommendation if the + actual resource usage causes the target + to violate the ContainerResourcePolicy (lower + than MinAllowed or higher that MaxAllowed). + Used only as status indication, will not + affect actual resource assignment. + type: object + upperBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Maximum recommended amount of + resources. Observes ContainerResourcePolicy. + Any resources allocated beyond this value + are likely wasted. This value may be larger + than the maximum amount of application is + actually capable of consuming. + type: object + required: + - target + type: object + type: array + type: object + type: object + type: object + type: object + type: array + lastError: + description: LastError has details of any errors that occurred + properties: + description: + description: Description of the error + type: string + lastOperation: + description: LastOperation is the type of operation for which + error occurred + type: string + lastUpdateTime: + description: Time at which the error occurred + format: date-time + type: string + type: object + lastScaling: + description: ScalingStatus defines the status of scaling + properties: + hpaStatus: + description: HpaStatus defines the status of HPA + properties: + currentReplicas: + format: int32 + type: integer + desiredReplicas: + format: int32 + type: integer + type: object + lastScaleTime: + format: date-time + type: string + vpaStatus: + description: VerticalPodAutoscalerStatus describes the runtime + state of the autoscaler. + properties: + conditions: + description: Conditions is the set of conditions required + for this autoscaler to scale its target, and indicates whether + or not those conditions are met. + items: + description: VerticalPodAutoscalerCondition describes the + state of a VerticalPodAutoscaler at a certain point. + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the + condition transitioned from one status to another + format: date-time + type: string + message: + description: message is a human-readable explanation + containing details about the transition + type: string + reason: + description: reason is the reason for the condition's + last transition. + type: string + status: + description: status is the status of the condition (True, + False, Unknown) + type: string + type: + description: type describes the current condition + type: string + required: + - status + - type + type: object + type: array + recommendation: + description: The most recently computed amount of resources + recommended by the autoscaler for the controlled pods. + properties: + containerRecommendations: + description: Resources recommended by the autoscaler for + each container. + items: + description: RecommendedContainerResources is the recommendation + of resources computed by autoscaler for a specific + container. Respects the container resource policy + if present in the spec. In particular the recommendation + is not produced for containers with `ContainerScalingMode` + set to 'Off'. + properties: + containerName: + description: Name of the container. + type: string + lowerBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Minimum recommended amount of resources. + Observes ContainerResourcePolicy. This amount + is not guaranteed to be sufficient for the application + to operate in a stable way, however running with + less resources is likely to have significant impact + on performance/availability. + type: object + target: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Recommended amount of resources. Observes + ContainerResourcePolicy. + type: object + uncappedTarget: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: The most recent recommended resources + target computed by the autoscaler for the controlled + pods, based only on actual resource usage, not + taking into account the ContainerResourcePolicy. + May differ from the Recommendation if the actual + resource usage causes the target to violate the + ContainerResourcePolicy (lower than MinAllowed + or higher that MaxAllowed). Used only as status + indication, will not affect actual resource assignment. + type: object + upperBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Maximum recommended amount of resources. + Observes ContainerResourcePolicy. Any resources + allocated beyond this value are likely wasted. + This value may be larger than the maximum amount + of application is actually capable of consuming. + type: object + required: + - target + type: object + type: array + type: object + type: object + type: object + overrideScaleUpStabilization: + description: Override scale up stabilization window + type: boolean + replicas: + description: Replicas is the number of replicas of the target resource. + format: int32 + type: integer + targetSelector: + description: TargetSelector is the string form of the label selector + of HPA. This is required for HPA to work with scale subresource. + type: string + vpaScaleDownUpdatePolicy: + description: Current VPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + vpaScaleUpUpdatePolicy: + description: Current VPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + vpaWeight: + format: int32 + type: integer + type: object + type: object + served: true + storage: false + subresources: + scale: + labelSelectorPath: .status.targetSelector + specReplicasPath: .spec.replicas + statusReplicasPath: .status.replicas + status: {} diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml index b4c8c9b2..6a1776e3 100644 --- a/config/crd/kustomization.yaml +++ b/config/crd/kustomization.yaml @@ -9,12 +9,12 @@ patches: - patches/approval_annotation_in_hvpas.yaml # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. # patches here are for enabling the conversion webhook for each CRD -#- patches/webhook_in_hvpas.yaml + - patches/webhook_in_hvpas.yaml # +kubebuilder:scaffold:crdkustomizewebhookpatch # [CERTMANAGER] To enable webhook, uncomment all the sections with [CERTMANAGER] prefix. # patches here are for enabling the CA injection for each CRD -#- patches/cainjection_in_hvpas.yaml + - patches/cainjection_in_hvpas.yaml # +kubebuilder:scaffold:crdkustomizecainjectionpatch # the following config is for teaching kustomize how to do kustomization for CRDs. diff --git a/config/crd/kustomizeconfig.yaml b/config/crd/kustomizeconfig.yaml index dd8a005b..535bd811 100644 --- a/config/crd/kustomizeconfig.yaml +++ b/config/crd/kustomizeconfig.yaml @@ -5,12 +5,12 @@ nameReference: fieldSpecs: - kind: CustomResourceDefinition group: apiextensions.k8s.io - path: spec/conversion/webhookClientConfig/service/name + path: spec/conversion/webhook/clientConfig/service/name namespace: - kind: CustomResourceDefinition group: apiextensions.k8s.io - path: spec/conversion/webhookClientConfig/service/namespace + path: spec/conversion/webhook/clientConfig/service/namespace create: false varReference: diff --git a/config/crd/output/crds.yaml b/config/crd/output/crds.yaml index 2001e76a..c0092c95 100644 --- a/config/crd/output/crds.yaml +++ b/config/crd/output/crds.yaml @@ -3,9 +3,21 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: unapproved, temporarily squatting + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) controller-gen.kubebuilder.io/version: v0.9.2 name: hvpas.autoscaling.k8s.io spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + name: webhook-service + namespace: system + path: /convert + conversionReviewVersions: + - v1 + - v1beta1 group: autoscaling.k8s.io names: kind: Hvpa @@ -1338,3 +1350,1478 @@ spec: specReplicasPath: .spec.replicas statusReplicasPath: .status.replicas status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: Hvpa is the Schema for the hvpas API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: HvpaSpec defines the desired state of Hvpa + properties: + hpa: + description: Hpa defines the spec of HPA + properties: + deploy: + description: Deploy defines whether the HPA is deployed or not + type: boolean + scaleDown: + description: ScaleDown defines the parameters for scale down + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + scaleUp: + description: ScaleUp defines the parameters for scale up + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + selector: + description: 'Selector is a label query that should match HPA. + Must match in order to be controlled. If empty, defaulted to + labels on HPA template. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If + the operator is In or NotIn, the values array must + be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced + during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. A + single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field is "key", + the operator is "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + template: + description: Template is the object that describes the HPA that + will be created. + properties: + metadata: + description: Metadata of the pods created from this template. + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: Spec defines the behavior of a HPA. + properties: + maxReplicas: + description: maxReplicas is the upper limit for the number + of replicas to which the autoscaler can scale up. It + cannot be less that minReplicas. + format: int32 + type: integer + metrics: + description: metrics contains the specifications for which + to use to calculate the desired replica count (the maximum + replica count across all metrics will be used). The + desired replica count is calculated multiplying the + ratio between the target value and the current value + by the current number of pods. Ergo, metrics used must + decrease as the pod count is increased, and vice-versa. See + the individual metric source types for more information + about how each type of metric must respond. If not set, + the default metric will be set to 80% average CPU utilization. + items: + description: MetricSpec specifies how to scale based + on a single metric (only `type` and one other matching + field should be set at once). + properties: + containerResource: + description: containerResource refers to a resource + metric (such as those specified in requests and + limits) known to Kubernetes describing a single + container in each pod of the current scale target + (e.g. CPU or memory). Such metrics are built in + to Kubernetes, and have special scaling options + on top of those available to normal per-pod metrics + using the "pods" source. This is an alpha feature + and can be enabled by the HPAContainerMetrics + feature flag. + properties: + container: + description: container is the name of the container + in the pods of the scaling target + type: string + name: + description: name is the name of the resource + in question. + type: string + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - container + - name + - target + type: object + external: + description: external refers to a global metric + that is not associated with any Kubernetes object. + It allows autoscaling based on information coming + from components running outside of cluster (for + example length of queue in cloud messaging service, + or QPS from loadbalancer running outside of cluster). + properties: + metric: + description: metric identifies the target metric + by name and selector + properties: + name: + description: name is the name of the given + metric + type: string + selector: + description: selector is the string-encoded + form of a standard kubernetes label selector + for the given metric When set, it is passed + as an additional parameter to the metrics + server for more specific metrics scoping. + When unset, just the metricName will be + used to gather metrics. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + object: + description: object refers to a metric describing + a single kubernetes object (for example, hits-per-second + on an Ingress object). + properties: + describedObject: + description: describedObject specifies the descriptions + of a object,such as kind,name apiVersion + properties: + apiVersion: + description: API version of the referent + type: string + kind: + description: 'Kind of the referent; More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"' + type: string + name: + description: 'Name of the referent; More + info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + required: + - kind + - name + type: object + metric: + description: metric identifies the target metric + by name and selector + properties: + name: + description: name is the name of the given + metric + type: string + selector: + description: selector is the string-encoded + form of a standard kubernetes label selector + for the given metric When set, it is passed + as an additional parameter to the metrics + server for more specific metrics scoping. + When unset, just the metricName will be + used to gather metrics. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - describedObject + - metric + - target + type: object + pods: + description: pods refers to a metric describing + each pod in the current scale target (for example, + transactions-processed-per-second). The values + will be averaged together before being compared + to the target value. + properties: + metric: + description: metric identifies the target metric + by name and selector + properties: + name: + description: name is the name of the given + metric + type: string + selector: + description: selector is the string-encoded + form of a standard kubernetes label selector + for the given metric When set, it is passed + as an additional parameter to the metrics + server for more specific metrics scoping. + When unset, just the metricName will be + used to gather metrics. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label + key that the selector applies + to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. + This array is replaced during + a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of + {key,value} pairs. A single {key,value} + in the matchLabels map is equivalent + to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are + ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + resource: + description: resource refers to a resource metric + (such as those specified in requests and limits) + known to Kubernetes describing each pod in the + current scale target (e.g. CPU or memory). Such + metrics are built in to Kubernetes, and have special + scaling options on top of those available to normal + per-pod metrics using the "pods" source. + properties: + name: + description: name is the name of the resource + in question. + type: string + target: + description: target specifies the target value + for the given metric + properties: + averageUtilization: + description: averageUtilization is the target + value of the average of the resource metric + across all relevant pods, represented + as a percentage of the requested value + of the resource for the pods. Currently + only valid for Resource metric source + type + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target + value of the average of the metric across + all relevant pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the + metric type is Utilization, Value, or + AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of + the metric (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - name + - target + type: object + type: + description: 'type is the type of metric source. It + should be one of "ContainerResource", "External", + "Object", "Pods" or "Resource", each mapping to + a matching field in the object. Note: "ContainerResource" + type is available on when the feature-gate HPAContainerMetrics + is enabled' + type: string + required: + - type + type: object + type: array + minReplicas: + description: minReplicas is the lower limit for the number + of replicas to which the autoscaler can scale down. + It defaults to 1 pod. + format: int32 + type: integer + required: + - maxReplicas + type: object + type: object + type: object + maintenanceTimeWindow: + description: MaintenanceTimeWindow contains information about the + time window for maintenance operations. + properties: + begin: + description: Begin is the beginning of the time window in the + format HHMMSS+ZONE, e.g. "220000+0100". + type: string + end: + description: End is the end of the time window in the format HHMMSS+ZONE, + e.g. "220000+0100". + type: string + required: + - begin + - end + type: object + replicas: + description: Replicas is the number of replicas of target resource + format: int32 + type: integer + targetRef: + description: TargetRef points to the controller managing the set of + pods for the autoscaler to control + properties: + apiVersion: + description: API version of the referent + type: string + kind: + description: 'Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"' + type: string + name: + description: 'Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names' + type: string + required: + - kind + - name + type: object + vpa: + description: Vpa defines the spec of VPA + properties: + deploy: + description: Deploy defines whether the VPA is deployed or not + type: boolean + limitsRequestsGapScaleParams: + description: LimitsRequestsGapScaleParams is the scaling thresholds + for limits + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + scaleDown: + description: ScaleDown defines the parameters for scale down + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + scaleUp: + description: ScaleUp defines the parameters for scale up + properties: + minChange: + description: MinChange is the minimum change in the resource + on which HVPA acts HVPA uses minimum of the Value and Percentage + value + properties: + cpu: + description: Scale parameters for CPU + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + memory: + description: Scale parameters for memory + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + replicas: + description: Scale patameters for replicas + properties: + percentage: + description: Percentage is the percentage of currently + allocated value to be used for scaling + format: int32 + type: integer + value: + description: Value is the absolute value of the scaling + type: string + type: object + type: object + stabilizationDuration: + description: StabilizationDuration defines the minimum delay + in minutes between 2 consecutive scale operations Valid + time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + type: string + updatePolicy: + description: Describes the rules on when changes are applied. + If not specified, all fields in the `UpdatePolicy` are set + to their default values. + properties: + updateMode: + description: Controls when autoscaler applies changes + to the resources. The default is 'Auto'. + type: string + type: object + type: object + selector: + description: 'Selector is a label query that should match VPA. + Must match in order to be controlled. If empty, defaulted to + labels on VPA template. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If + the operator is In or NotIn, the values array must + be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced + during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. A + single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field is "key", + the operator is "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + template: + description: Template is the object that describes the VPA that + will be created. + properties: + metadata: + description: Metadata of the pods created from this template. + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: Spec defines the behavior of a VPA. + properties: + resourcePolicy: + description: Controls how the autoscaler computes recommended + resources. The resource policy may be used to set constraints + on the recommendations for individual containers. If + not specified, the autoscaler computes recommended resources + for all containers in the pod, without additional constraints. + properties: + containerPolicies: + description: Per-container resource policies. + items: + description: ContainerResourcePolicy controls how + autoscaler computes the recommended resources + for a specific container. + properties: + containerName: + description: Name of the container or DefaultContainerResourcePolicy, + in which case the policy is used by the containers + that don't have their own policy specified. + type: string + controlledResources: + description: Specifies the type of recommendations + that will be computed (and possibly applied) + by VPA. If not specified, the default of [ResourceCPU, + ResourceMemory] will be used. + items: + description: ResourceName is the name identifying + various resources in a ResourceList. + type: string + type: array + controlledValues: + description: Specifies which resource values + should be controlled. The default is "RequestsAndLimits". + type: string + maxAllowed: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Specifies the maximum amount of + resources that will be recommended for the + container. The default is no maximum. + type: object + minAllowed: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Specifies the minimal amount of + resources that will be recommended for the + container. The default is no minimum. + type: object + mode: + description: Whether autoscaler is enabled for + the container. The default is "Auto". + type: string + type: object + type: array + type: object + type: object + type: object + type: object + weightBasedScalingIntervals: + description: WeightBasedScalingIntervals defines the intervals of + replica counts, and the weights for scaling a deployment vertically + If there are overlapping intervals, then the vpaWeight will be taken + from the first matching interval + items: + description: WeightBasedScalingInterval defines the interval of + replica counts in which VpaWeight is applied to VPA scaling + properties: + lastReplicaCount: + description: LastReplicaCount is the number of replicas till + which VpaWeight is applied to VPA scaling If this field is + not provided, it will default to maxReplicas of HPA + format: int32 + type: integer + startReplicaCount: + description: StartReplicaCount is the number of replicas from + which VpaWeight is applied to VPA scaling If this field is + not provided, it will default to minReplicas of HPA + format: int32 + type: integer + vpaWeight: + description: VpaWeight defines the weight (in percentage) to + be given to VPA's recommendationd for the interval of number + of replicas provided + format: int32 + maximum: 100 + minimum: 0 + type: integer + type: object + type: array + required: + - targetRef + type: object + status: + description: HvpaStatus defines the observed state of Hvpa + properties: + hpaScaleDownUpdatePolicy: + description: Current HPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + hpaScaleUpUpdatePolicy: + description: Current HPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + hpaWeight: + format: int32 + type: integer + lastBlockedScaling: + items: + description: BlockedScaling defines the details for blocked scaling + properties: + reason: + description: BlockingReason defines the reason for blocking. + type: string + scalingStatus: + description: ScalingStatus defines the status of scaling + properties: + hpaStatus: + description: HpaStatus defines the status of HPA + properties: + currentReplicas: + format: int32 + type: integer + desiredReplicas: + format: int32 + type: integer + type: object + lastScaleTime: + format: date-time + type: string + vpaStatus: + description: VerticalPodAutoscalerStatus describes the runtime + state of the autoscaler. + properties: + conditions: + description: Conditions is the set of conditions required + for this autoscaler to scale its target, and indicates + whether or not those conditions are met. + items: + description: VerticalPodAutoscalerCondition describes + the state of a VerticalPodAutoscaler at a certain + point. + properties: + lastTransitionTime: + description: lastTransitionTime is the last time + the condition transitioned from one status to + another + format: date-time + type: string + message: + description: message is a human-readable explanation + containing details about the transition + type: string + reason: + description: reason is the reason for the condition's + last transition. + type: string + status: + description: status is the status of the condition + (True, False, Unknown) + type: string + type: + description: type describes the current condition + type: string + required: + - status + - type + type: object + type: array + recommendation: + description: The most recently computed amount of resources + recommended by the autoscaler for the controlled pods. + properties: + containerRecommendations: + description: Resources recommended by the autoscaler + for each container. + items: + description: RecommendedContainerResources is + the recommendation of resources computed by + autoscaler for a specific container. Respects + the container resource policy if present in + the spec. In particular the recommendation is + not produced for containers with `ContainerScalingMode` + set to 'Off'. + properties: + containerName: + description: Name of the container. + type: string + lowerBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Minimum recommended amount of + resources. Observes ContainerResourcePolicy. + This amount is not guaranteed to be sufficient + for the application to operate in a stable + way, however running with less resources + is likely to have significant impact on + performance/availability. + type: object + target: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Recommended amount of resources. + Observes ContainerResourcePolicy. + type: object + uncappedTarget: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: The most recent recommended resources + target computed by the autoscaler for the + controlled pods, based only on actual resource + usage, not taking into account the ContainerResourcePolicy. + May differ from the Recommendation if the + actual resource usage causes the target + to violate the ContainerResourcePolicy (lower + than MinAllowed or higher that MaxAllowed). + Used only as status indication, will not + affect actual resource assignment. + type: object + upperBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Maximum recommended amount of + resources. Observes ContainerResourcePolicy. + Any resources allocated beyond this value + are likely wasted. This value may be larger + than the maximum amount of application is + actually capable of consuming. + type: object + required: + - target + type: object + type: array + type: object + type: object + type: object + type: object + type: array + lastError: + description: LastError has details of any errors that occurred + properties: + description: + description: Description of the error + type: string + lastOperation: + description: LastOperation is the type of operation for which + error occurred + type: string + lastUpdateTime: + description: Time at which the error occurred + format: date-time + type: string + type: object + lastScaling: + description: ScalingStatus defines the status of scaling + properties: + hpaStatus: + description: HpaStatus defines the status of HPA + properties: + currentReplicas: + format: int32 + type: integer + desiredReplicas: + format: int32 + type: integer + type: object + lastScaleTime: + format: date-time + type: string + vpaStatus: + description: VerticalPodAutoscalerStatus describes the runtime + state of the autoscaler. + properties: + conditions: + description: Conditions is the set of conditions required + for this autoscaler to scale its target, and indicates whether + or not those conditions are met. + items: + description: VerticalPodAutoscalerCondition describes the + state of a VerticalPodAutoscaler at a certain point. + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the + condition transitioned from one status to another + format: date-time + type: string + message: + description: message is a human-readable explanation + containing details about the transition + type: string + reason: + description: reason is the reason for the condition's + last transition. + type: string + status: + description: status is the status of the condition (True, + False, Unknown) + type: string + type: + description: type describes the current condition + type: string + required: + - status + - type + type: object + type: array + recommendation: + description: The most recently computed amount of resources + recommended by the autoscaler for the controlled pods. + properties: + containerRecommendations: + description: Resources recommended by the autoscaler for + each container. + items: + description: RecommendedContainerResources is the recommendation + of resources computed by autoscaler for a specific + container. Respects the container resource policy + if present in the spec. In particular the recommendation + is not produced for containers with `ContainerScalingMode` + set to 'Off'. + properties: + containerName: + description: Name of the container. + type: string + lowerBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Minimum recommended amount of resources. + Observes ContainerResourcePolicy. This amount + is not guaranteed to be sufficient for the application + to operate in a stable way, however running with + less resources is likely to have significant impact + on performance/availability. + type: object + target: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Recommended amount of resources. Observes + ContainerResourcePolicy. + type: object + uncappedTarget: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: The most recent recommended resources + target computed by the autoscaler for the controlled + pods, based only on actual resource usage, not + taking into account the ContainerResourcePolicy. + May differ from the Recommendation if the actual + resource usage causes the target to violate the + ContainerResourcePolicy (lower than MinAllowed + or higher that MaxAllowed). Used only as status + indication, will not affect actual resource assignment. + type: object + upperBound: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Maximum recommended amount of resources. + Observes ContainerResourcePolicy. Any resources + allocated beyond this value are likely wasted. + This value may be larger than the maximum amount + of application is actually capable of consuming. + type: object + required: + - target + type: object + type: array + type: object + type: object + type: object + overrideScaleUpStabilization: + description: Override scale up stabilization window + type: boolean + replicas: + description: Replicas is the number of replicas of the target resource. + format: int32 + type: integer + targetSelector: + description: TargetSelector is the string form of the label selector + of HPA. This is required for HPA to work with scale subresource. + type: string + vpaScaleDownUpdatePolicy: + description: Current VPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + vpaScaleUpUpdatePolicy: + description: Current VPA UpdatePolicy set in the spec + properties: + updateMode: + description: Controls when autoscaler applies changes to the resources. + The default is 'Auto'. + type: string + type: object + vpaWeight: + format: int32 + type: integer + type: object + type: object + served: true + storage: false + subresources: + scale: + labelSelectorPath: .status.targetSelector + specReplicasPath: .spec.replicas + statusReplicasPath: .status.replicas + status: {} diff --git a/config/crd/patches/cainjection_in_hvpas.yaml b/config/crd/patches/cainjection_in_hvpas.yaml index 8f01898d..f1905e2d 100644 --- a/config/crd/patches/cainjection_in_hvpas.yaml +++ b/config/crd/patches/cainjection_in_hvpas.yaml @@ -1,8 +1,8 @@ # The following patch adds a directive for certmanager to inject CA into the CRD # CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - certmanager.k8s.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) name: hvpas.autoscaling.k8s.io diff --git a/config/crd/patches/webhook_in_hvpas.yaml b/config/crd/patches/webhook_in_hvpas.yaml index 0149fec0..38582c1e 100644 --- a/config/crd/patches/webhook_in_hvpas.yaml +++ b/config/crd/patches/webhook_in_hvpas.yaml @@ -1,17 +1,18 @@ # The following patch enables conversion webhook for CRD # CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: hvpas.autoscaling.k8s.io spec: conversion: strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert + webhook: + clientConfig: + service: + namespace: system + name: webhook-service + path: /convert + conversionReviewVersions: + - v1 + - v1beta1 diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index 0066bf6d..9fe3faab 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -17,25 +17,25 @@ bases: - ../rbac - ../manager # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in crd/kustomization.yaml -#- ../webhook +- ../webhook # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. -#- ../certmanager +- ../certmanager patches: - manager_image_patch.yaml # Protect the /metrics endpoint by putting it behind auth. # Only one of manager_auth_proxy_patch.yaml and # manager_prometheus_metrics_patch.yaml should be enabled. -- manager_auth_proxy_patch.yaml +#- manager_auth_proxy_patch.yaml # If you want your controller-manager to expose the /metrics # endpoint w/o any authn/z, uncomment the following line and # comment manager_auth_proxy_patch.yaml. # Only one of manager_auth_proxy_patch.yaml and # manager_prometheus_metrics_patch.yaml should be enabled. -#- manager_prometheus_metrics_patch.yaml +- manager_prometheus_metrics_patch.yaml # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in crd/kustomization.yaml -#- manager_webhook_patch.yaml +- manager_webhook_patch.yaml # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. # Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. @@ -45,29 +45,29 @@ patches: # the following config is for teaching kustomize how to do var substitution vars: # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. -#- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR -# objref: -# kind: Certificate -# group: certmanager.k8s.io -# version: v1alpha1 -# name: serving-cert # this name should match the one in certificate.yaml -# fieldref: -# fieldpath: metadata.namespace -#- name: CERTIFICATE_NAME -# objref: -# kind: Certificate -# group: certmanager.k8s.io -# version: v1alpha1 -# name: serving-cert # this name should match the one in certificate.yaml -#- name: SERVICE_NAMESPACE # namespace of the service -# objref: -# kind: Service -# version: v1 -# name: webhook-service -# fieldref: -# fieldpath: metadata.namespace -#- name: SERVICE_NAME -# objref: -# kind: Service -# version: v1 -# name: webhook-service +- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR + objref: + kind: Certificate + group: cert-manager.io + version: v1 + name: serving-cert # this name should match the one in certificate.yaml + fieldref: + fieldpath: metadata.namespace +- name: CERTIFICATE_NAME + objref: + kind: Certificate + group: cert-manager.io + version: v1 + name: serving-cert # this name should match the one in certificate.yaml +- name: SERVICE_NAMESPACE # namespace of the service + objref: + kind: Service + version: v1 + name: webhook-service + fieldref: + fieldpath: metadata.namespace +- name: SERVICE_NAME + objref: + kind: Service + version: v1 + name: webhook-service diff --git a/config/default/manager_auth_proxy_patch.yaml b/config/default/manager_auth_proxy_patch.yaml index 229108b8..9789a74d 100644 --- a/config/default/manager_auth_proxy_patch.yaml +++ b/config/default/manager_auth_proxy_patch.yaml @@ -1,25 +1,54 @@ -# This patch inject a sidecar container which is a HTTP proxy for the controller manager, -# it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews. +# This patch inject a sidecar container which is a HTTP proxy for the +# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews. apiVersion: apps/v1 -kind: StatefulSet +kind: Deployment metadata: name: controller-manager namespace: system spec: template: spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: In + values: + - amd64 + - arm64 + - ppc64le + - s390x + - key: kubernetes.io/os + operator: In + values: + - linux containers: - name: kube-rbac-proxy - image: gcr.io/kubebuilder/kube-rbac-proxy:v0.4.0 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 args: - "--secure-listen-address=0.0.0.0:8443" - "--upstream=http://127.0.0.1:8080/" - "--logtostderr=true" - - "--v=10" + - "--v=0" ports: - containerPort: 8443 + protocol: TCP name: https + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi - name: manager args: - "--metrics-bind-address=127.0.0.1:8080" - - "--leader-elect" + - "--leader-elect" \ No newline at end of file diff --git a/config/default/manager_image_patch.yaml b/config/default/manager_image_patch.yaml index fcbf39dc..eb909570 100644 --- a/config/default/manager_image_patch.yaml +++ b/config/default/manager_image_patch.yaml @@ -1,5 +1,5 @@ apiVersion: apps/v1 -kind: StatefulSet +kind: Deployment metadata: name: controller-manager namespace: system diff --git a/config/default/manager_webhook_patch.yaml b/config/default/manager_webhook_patch.yaml index f2f7157b..738de350 100644 --- a/config/default/manager_webhook_patch.yaml +++ b/config/default/manager_webhook_patch.yaml @@ -9,7 +9,7 @@ spec: containers: - name: manager ports: - - containerPort: 443 + - containerPort: 9443 name: webhook-server protocol: TCP volumeMounts: diff --git a/config/default/webhookcainjection_patch.yaml b/config/default/webhookcainjection_patch.yaml index 5e3e077d..b457cd89 100644 --- a/config/default/webhookcainjection_patch.yaml +++ b/config/default/webhookcainjection_patch.yaml @@ -1,15 +1,29 @@ # This patch add annotation to admission webhook config and # the variables $(CERTIFICATE_NAMESPACE) and $(CERTIFICATE_NAME) will be substituted by kustomize. -apiVersion: admissionregistration.k8s.io/v1beta1 +apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: + labels: + app.kubernetes.io/name: mutatingwebhookconfiguration + app.kubernetes.io/instance: mutating-webhook-configuration + app.kubernetes.io/component: webhook + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize name: mutating-webhook-configuration annotations: - certmanager.k8s.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) --- -apiVersion: admissionregistration.k8s.io/v1beta1 +apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: + labels: + app.kubernetes.io/name: validatingwebhookconfiguration + app.kubernetes.io/instance: validating-webhook-configuration + app.kubernetes.io/component: webhook + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize name: validating-webhook-configuration annotations: - certmanager.k8s.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) + cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) \ No newline at end of file diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index b718bb4e..228ddd0f 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -3,81 +3,91 @@ kind: Namespace metadata: labels: control-plane: controller-manager - controller-tools.k8s.io: "1.0" + app.kubernetes.io/name: namespace + app.kubernetes.io/instance: system + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize name: system --- -apiVersion: v1 -kind: Service -metadata: - name: controller-manager-service - namespace: system - labels: - control-plane: controller-manager - controller-tools.k8s.io: "1.0" -spec: - selector: - control-plane: controller-manager - controller-tools.k8s.io: "1.0" - ports: - - port: 443 ---- apiVersion: apps/v1 -kind: StatefulSet +kind: Deployment metadata: name: controller-manager namespace: system labels: control-plane: controller-manager - controller-tools.k8s.io: "1.0" + app.kubernetes.io/name: deployment + app.kubernetes.io/instance: controller-manager + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize spec: selector: matchLabels: control-plane: controller-manager - controller-tools.k8s.io: "1.0" - serviceName: controller-manager-service + replicas: 1 template: metadata: + annotations: + kubectl.kubernetes.io/default-container: manager labels: control-plane: controller-manager - controller-tools.k8s.io: "1.0" spec: + # TODO(user): Uncomment the following code to configure the nodeAffinity expression + # according to the platforms which are supported by your solution. + # It is considered best practice to support multiple architectures. You can + # build your manager image using the makefile target docker-buildx. + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux + securityContext: +# runAsNonRoot: true + # TODO(user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault containers: - command: - /manager + args: + - --logtostderr=true + - --enable-detailed-metrics=true + - --metrics-bind-address=:9569 + - --v=2 image: controller:latest - imagePullPolicy: Always name: manager - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: SECRET_NAME - value: $(WEBHOOK_SECRET_NAME) + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + # TODO(user): Configure the resources accordingly based on the project requirements. + # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ resources: limits: - cpu: 100m - memory: 30Mi + cpu: 500m + memory: 128Mi requests: - cpu: 100m - memory: 20Mi - ports: - - containerPort: 9876 - name: webhook-server - protocol: TCP - volumeMounts: - - mountPath: /tmp/cert - name: cert - readOnly: true - terminationGracePeriodSeconds: 10 - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: webhook-server-secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: webhook-server-secret - namespace: system + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 \ No newline at end of file diff --git a/config/rbac/hvpa_editor_role.yaml b/config/rbac/hvpa_editor_role.yaml new file mode 100644 index 00000000..aad863ee --- /dev/null +++ b/config/rbac/hvpa_editor_role.yaml @@ -0,0 +1,24 @@ +# permissions for end users to edit hvpas. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: hvpa-editor-role +rules: +- apiGroups: + - autoscaling.k8s.io + resources: + - hvpas + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - autoscaling.k8s.io + resources: + - hvpas/status + verbs: + - get diff --git a/config/rbac/hvpa_viewer_role.yaml b/config/rbac/hvpa_viewer_role.yaml new file mode 100644 index 00000000..fdf5db06 --- /dev/null +++ b/config/rbac/hvpa_viewer_role.yaml @@ -0,0 +1,20 @@ +# permissions for end users to view hvpas. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: hvpa-viewer-role +rules: +- apiGroups: + - autoscaling.k8s.io + resources: + - hvpas + verbs: + - get + - list + - watch +- apiGroups: + - autoscaling.k8s.io + resources: + - hvpas/status + verbs: + - get diff --git a/config/rbac/kustomization.yaml b/config/rbac/kustomization.yaml index 817f1fe6..3fc7d520 100644 --- a/config/rbac/kustomization.yaml +++ b/config/rbac/kustomization.yaml @@ -1,4 +1,5 @@ resources: +- service_account.yaml - role.yaml - role_binding.yaml - leader_election_role.yaml diff --git a/config/rbac/leader_election_role.yaml b/config/rbac/leader_election_role.yaml index eaa79158..f38d0b23 100644 --- a/config/rbac/leader_election_role.yaml +++ b/config/rbac/leader_election_role.yaml @@ -2,6 +2,13 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: + labels: + app.kubernetes.io/name: role + app.kubernetes.io/instance: leader-election-role + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize name: leader-election-role rules: - apiGroups: @@ -17,16 +24,21 @@ rules: - patch - delete - apiGroups: - - "" + - coordination.k8s.io resources: - - configmaps/status + - leases verbs: - get + - list + - watch + - create - update - patch + - delete - apiGroups: - "" resources: - events verbs: - create + - patch \ No newline at end of file diff --git a/config/rbac/leader_election_role_binding.yaml b/config/rbac/leader_election_role_binding.yaml index eed16906..9bb9a675 100644 --- a/config/rbac/leader_election_role_binding.yaml +++ b/config/rbac/leader_election_role_binding.yaml @@ -1,6 +1,13 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: + labels: + app.kubernetes.io/name: rolebinding + app.kubernetes.io/instance: leader-election-rolebinding + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize name: leader-election-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io @@ -8,5 +15,5 @@ roleRef: name: leader-election-role subjects: - kind: ServiceAccount - name: default - namespace: system + name: controller-manager + namespace: system \ No newline at end of file diff --git a/config/rbac/role_binding.yaml b/config/rbac/role_binding.yaml index 8f265870..2070ede4 100644 --- a/config/rbac/role_binding.yaml +++ b/config/rbac/role_binding.yaml @@ -8,5 +8,5 @@ roleRef: name: manager-role subjects: - kind: ServiceAccount - name: default + name: controller-manager namespace: system diff --git a/config/rbac/service_account.yaml b/config/rbac/service_account.yaml new file mode 100644 index 00000000..d5746e1c --- /dev/null +++ b/config/rbac/service_account.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: serviceaccount + app.kubernetes.io/instance: controller-manager + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: project + app.kubernetes.io/part-of: project + app.kubernetes.io/managed-by: kustomize + name: controller-manager + namespace: system \ No newline at end of file diff --git a/config/samples/autoscaling_v1alpha2_hvpa.yaml b/config/samples/autoscaling_v1alpha2_hvpa.yaml new file mode 100644 index 00000000..04bf2fb1 --- /dev/null +++ b/config/samples/autoscaling_v1alpha2_hvpa.yaml @@ -0,0 +1,105 @@ +apiVersion: autoscaling.k8s.io/v1alpha2 +kind: Hvpa +metadata: + annotations: + "hpa-controller": "hvpa" + name: hvpa-sample + namespace: default +spec: + replicas: 1 + maintenanceTimeWindow: + begin: "220000-0000" + end: "230000-0000" + hpa: + selector: + matchLabels: + key1: value1 + deploy: true + scaleUp: + updatePolicy: + updateMode: "Auto" + stabilizationDuration: "3m" + scaleDown: + updatePolicy: + updateMode: "Auto" + stabilizationDuration: "3m" + template: + metadata: + labels: + key1: value1 + spec: + maxReplicas: 3 + minReplicas: 1 + metrics: + - resource: + name: memory + target: + type: Utilization + averageUtilization: 70 + type: Resource + - resource: + name: cpu + target: + type: Utilization + averageUtilization: 60 + type: Resource + vpa: + selector: + matchLabels: + key2: value2 + deploy: true + scaleUp: + updatePolicy: + updateMode: "Auto" + stabilizationDuration: "3m" + minChange: + cpu: + value: "3" + percentage: 80 + memory: + value: "3" + percentage: 80 + scaleDown: + updatePolicy: + updateMode: "MaintenanceWindow" + stabilizationDuration: "3m" + minChange: + cpu: + value: "3" + percentage: 80 + memory: + value: "3" + percentage: 80 + limitsRequestsGapScaleParams: + cpu: + percentage: 80 + value: "2" + memory: + percentage: 80 + value: 3G + template: + metadata: + labels: + key2: value2 + spec: + resourcePolicy: + containerPolicies: + - containerName: resource-consumer + maxAllowed: + memory: 3000Mi + minAllowed: + memory: 400Mi + weightBasedScalingIntervals: + - vpaWeight: 0 + startReplicaCount: 1 + lastReplicaCount: 2 + - vpaWeight: 50 + startReplicaCount: 3 + lastReplicaCount: 5 + - vpaWeight: 60 + startReplicaCount: 6 + lastReplicaCount: 7 + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: resource-consumer diff --git a/config/webhook/kustomization.yaml b/config/webhook/kustomization.yaml index 9cf26134..13b9c632 100644 --- a/config/webhook/kustomization.yaml +++ b/config/webhook/kustomization.yaml @@ -1,5 +1,5 @@ resources: -- manifests.yaml +#- manifests.yaml - service.yaml configurations: diff --git a/config/webhook/manifests.yaml b/config/webhook/manifests.yaml index 86b1ae1e..2f0d74e0 100644 --- a/config/webhook/manifests.yaml +++ b/config/webhook/manifests.yaml @@ -1,6 +1,6 @@ --- -apiVersion: admissionregistration.k8s.io/v1beta1 +apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: creationTimestamp: null @@ -26,7 +26,7 @@ webhooks: - hvpas --- -apiVersion: admissionregistration.k8s.io/v1beta1 +apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: creationTimestamp: null diff --git a/config/webhook/service.yaml b/config/webhook/service.yaml index b4861025..31e0f829 100644 --- a/config/webhook/service.yaml +++ b/config/webhook/service.yaml @@ -7,6 +7,6 @@ metadata: spec: ports: - port: 443 - targetPort: 443 + targetPort: 9443 selector: control-plane: controller-manager diff --git a/controllers/controller_ref_manager.go b/controllers/autoscaling/controller_ref_manager.go similarity index 99% rename from controllers/controller_ref_manager.go rename to controllers/autoscaling/controller_ref_manager.go index 66e944d8..4099eb29 100644 --- a/controllers/controller_ref_manager.go +++ b/controllers/autoscaling/controller_ref_manager.go @@ -27,7 +27,7 @@ import ( "fmt" "sync" - //"github.com/gardener/hvpa-controller/api/v1alpha1" + //"github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" autoscaling "k8s.io/api/autoscaling/v2beta1" "k8s.io/apimachinery/pkg/api/errors" diff --git a/controllers/hpa_util.go b/controllers/autoscaling/hpa_util.go similarity index 98% rename from controllers/hpa_util.go rename to controllers/autoscaling/hpa_util.go index d4ebac2d..1ed6e011 100644 --- a/controllers/hpa_util.go +++ b/controllers/autoscaling/hpa_util.go @@ -21,7 +21,7 @@ import ( "fmt" "reflect" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" autoscaling "k8s.io/api/autoscaling/v2beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" diff --git a/controllers/hpa_util_test.go b/controllers/autoscaling/hpa_util_test.go similarity index 97% rename from controllers/hpa_util_test.go rename to controllers/autoscaling/hpa_util_test.go index 124edf9f..8b01993d 100644 --- a/controllers/hpa_util_test.go +++ b/controllers/autoscaling/hpa_util_test.go @@ -20,7 +20,7 @@ import ( "context" "fmt" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" diff --git a/controllers/hvpa_controller.go b/controllers/autoscaling/hvpa_controller.go similarity index 99% rename from controllers/hvpa_controller.go rename to controllers/autoscaling/hvpa_controller.go index 7a21846f..170399c5 100644 --- a/controllers/hvpa_controller.go +++ b/controllers/autoscaling/hvpa_controller.go @@ -26,8 +26,8 @@ import ( "sync" "time" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" - validation "github.com/gardener/hvpa-controller/internal/api/validation" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" + validation "github.com/gardener/hvpa-controller/internal/apis/autoscaling/validation" "github.com/gardener/hvpa-controller/utils" appsv1 "k8s.io/api/apps/v1" autoscaling "k8s.io/api/autoscaling/v2beta1" diff --git a/controllers/hvpa_controller_test.go b/controllers/autoscaling/hvpa_controller_test.go similarity index 99% rename from controllers/hvpa_controller_test.go rename to controllers/autoscaling/hvpa_controller_test.go index cab19573..7a27b590 100644 --- a/controllers/hvpa_controller_test.go +++ b/controllers/autoscaling/hvpa_controller_test.go @@ -21,7 +21,7 @@ import ( "fmt" "time" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" "github.com/gardener/hvpa-controller/utils" . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/extensions/table" diff --git a/controllers/hvpa_metrics.go b/controllers/autoscaling/hvpa_metrics.go similarity index 99% rename from controllers/hvpa_metrics.go rename to controllers/autoscaling/hvpa_metrics.go index 67286c3f..f4a63f16 100644 --- a/controllers/hvpa_metrics.go +++ b/controllers/autoscaling/hvpa_metrics.go @@ -20,7 +20,7 @@ import ( "fmt" "math" - hvpav1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + hvpav1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" "github.com/prometheus/client_golang/prometheus" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" diff --git a/controllers/suite_test.go b/controllers/autoscaling/suite_test.go similarity index 97% rename from controllers/suite_test.go rename to controllers/autoscaling/suite_test.go index b49582fd..7d998a58 100644 --- a/controllers/suite_test.go +++ b/controllers/autoscaling/suite_test.go @@ -24,7 +24,7 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" appsv1 "k8s.io/api/apps/v1" autoscaling "k8s.io/api/autoscaling/v2beta1" v1 "k8s.io/api/core/v1" @@ -72,8 +72,8 @@ var _ = BeforeSuite(func() { By("bootstrapping test environment") testEnv = &envtest.Environment{ CRDDirectoryPaths: []string{ - filepath.Join("..", "config", "crd", "integration_test"), - filepath.Join("..", "config", "crd", "output"), + filepath.Join("..", "..", "config", "crd", "integration_test"), + filepath.Join("..", "..", "config", "crd", "output"), }, } diff --git a/controllers/vpa_util.go b/controllers/autoscaling/vpa_util.go similarity index 98% rename from controllers/vpa_util.go rename to controllers/autoscaling/vpa_util.go index 73edf4cd..705293e7 100644 --- a/controllers/vpa_util.go +++ b/controllers/autoscaling/vpa_util.go @@ -21,7 +21,7 @@ import ( "fmt" "reflect" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" autoscalingv1 "k8s.io/api/autoscaling/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" diff --git a/controllers/vpa_util_test.go b/controllers/autoscaling/vpa_util_test.go similarity index 97% rename from controllers/vpa_util_test.go rename to controllers/autoscaling/vpa_util_test.go index 23c19430..5ca495c7 100644 --- a/controllers/vpa_util_test.go +++ b/controllers/autoscaling/vpa_util_test.go @@ -20,7 +20,7 @@ import ( "context" "fmt" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" diff --git a/go.mod b/go.mod index 9e4ab404..25b4b73c 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/gardener/hvpa-controller go 1.18 require ( - github.com/gardener/hvpa-controller/api v0.0.0 + github.com/gardener/hvpa-controller/apis/autoscaling v0.0.0 github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.20.1 github.com/prometheus/client_golang v1.12.2 @@ -87,4 +87,4 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/gardener/hvpa-controller/api => ./api +replace github.com/gardener/hvpa-controller/apis/autoscaling => ./apis/autoscaling diff --git a/internal/api/v1alpha1/README.md b/internal/api/v1alpha1/README.md deleted file mode 100644 index ec5aaadb..00000000 --- a/internal/api/v1alpha1/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Internal API - -This package is created to avoid having extra dependencies in the api package. - -Go lang files are symlinked here to avoid coping: - -```console -ln -sr ./api/v1alpha1/groupversion_info.go ./internal/api/v1alpha1/groupversion_info.go -ln -sr ./api/v1alpha1/hvpa_types.go ./internal/api/v1alpha1/hvpa_types.go -ln -sr ./api/v1alpha1/zz_generated.deepcopy.go ./internal/api/v1alpha1/zz_generated.deepcopy.go -``` diff --git a/internal/api/v1alpha1/groupversion_info.go b/internal/api/v1alpha1/groupversion_info.go deleted file mode 120000 index 9d00ec4d..00000000 --- a/internal/api/v1alpha1/groupversion_info.go +++ /dev/null @@ -1 +0,0 @@ -../../../api/v1alpha1/groupversion_info.go \ No newline at end of file diff --git a/internal/api/v1alpha1/hvpa_types.go b/internal/api/v1alpha1/hvpa_types.go deleted file mode 120000 index 24c76e11..00000000 --- a/internal/api/v1alpha1/hvpa_types.go +++ /dev/null @@ -1 +0,0 @@ -../../../api/v1alpha1/hvpa_types.go \ No newline at end of file diff --git a/internal/api/v1alpha1/zz_generated.deepcopy.go b/internal/api/v1alpha1/zz_generated.deepcopy.go deleted file mode 120000 index df2fda76..00000000 --- a/internal/api/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1 +0,0 @@ -../../../api/v1alpha1/zz_generated.deepcopy.go \ No newline at end of file diff --git a/internal/apis/autoscaling/v1alpha1/README.md b/internal/apis/autoscaling/v1alpha1/README.md new file mode 100644 index 00000000..a855d98d --- /dev/null +++ b/internal/apis/autoscaling/v1alpha1/README.md @@ -0,0 +1,11 @@ +# Internal API + +This package is created to avoid having extra dependencies in the api package. + +Go lang files are symlinked here to avoid coping: + +```console +ln -sr ./apis/autoscaling/v1alpha1/groupversion_info.go ./internal/apis/autoscaling/v1alpha1/groupversion_info.go +ln -sr ./apis/autoscaling/v1alpha1/hvpa_types.go ./internal/apis/autoscaling/v1alpha1/hvpa_types.go +ln -sr ./apis/autoscaling/v1alpha1/zz_generated.deepcopy.go ./internal/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go +``` diff --git a/internal/apis/autoscaling/v1alpha1/groupversion_info.go b/internal/apis/autoscaling/v1alpha1/groupversion_info.go new file mode 120000 index 00000000..021a7529 --- /dev/null +++ b/internal/apis/autoscaling/v1alpha1/groupversion_info.go @@ -0,0 +1 @@ +../../../../apis/autoscaling/v1alpha1/groupversion_info.go \ No newline at end of file diff --git a/internal/apis/autoscaling/v1alpha1/hvpa_types.go b/internal/apis/autoscaling/v1alpha1/hvpa_types.go new file mode 120000 index 00000000..122abc3a --- /dev/null +++ b/internal/apis/autoscaling/v1alpha1/hvpa_types.go @@ -0,0 +1 @@ +../../../../apis/autoscaling/v1alpha1/hvpa_types.go \ No newline at end of file diff --git a/internal/api/v1alpha1/hvpa_types_test.go b/internal/apis/autoscaling/v1alpha1/hvpa_types_test.go similarity index 100% rename from internal/api/v1alpha1/hvpa_types_test.go rename to internal/apis/autoscaling/v1alpha1/hvpa_types_test.go diff --git a/internal/api/v1alpha1/hvpa_webhook.go b/internal/apis/autoscaling/v1alpha1/hvpa_webhook.go similarity index 100% rename from internal/api/v1alpha1/hvpa_webhook.go rename to internal/apis/autoscaling/v1alpha1/hvpa_webhook.go diff --git a/internal/api/v1alpha1/suite_test.go b/internal/apis/autoscaling/v1alpha1/suite_test.go similarity index 93% rename from internal/api/v1alpha1/suite_test.go rename to internal/apis/autoscaling/v1alpha1/suite_test.go index 87337023..21499279 100644 --- a/internal/api/v1alpha1/suite_test.go +++ b/internal/apis/autoscaling/v1alpha1/suite_test.go @@ -55,8 +55,8 @@ var _ = BeforeSuite(func(done Done) { By("bootstrapping test environment") testEnv = &envtest.Environment{ CRDDirectoryPaths: []string{ - filepath.Join("..", "..", "..", "config", "crd", "integration_test"), - filepath.Join("..", "..", "..", "config", "crd", "output"), + filepath.Join("..", "..", "..", "..", "config", "crd", "integration_test"), + filepath.Join("..", "..", "..", "..", "config", "crd", "output"), }, } diff --git a/internal/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go b/internal/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go new file mode 120000 index 00000000..5a7f2781 --- /dev/null +++ b/internal/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1 @@ +../../../../apis/autoscaling/v1alpha1/zz_generated.deepcopy.go \ No newline at end of file diff --git a/internal/api/validation/hvpa.go b/internal/apis/autoscaling/validation/hvpa.go similarity index 99% rename from internal/api/validation/hvpa.go rename to internal/apis/autoscaling/validation/hvpa.go index eb82708d..8d2a561b 100644 --- a/internal/api/validation/hvpa.go +++ b/internal/apis/autoscaling/validation/hvpa.go @@ -20,7 +20,7 @@ package validation import ( "time" - "github.com/gardener/hvpa-controller/api/v1alpha1" + "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" "github.com/gardener/hvpa-controller/utils" "k8s.io/apimachinery/pkg/api/resource" apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation" diff --git a/main.go b/main.go index d771f6d3..5aa0ea72 100644 --- a/main.go +++ b/main.go @@ -27,8 +27,9 @@ import ( klogv2 "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" - autoscalingv1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" - "github.com/gardener/hvpa-controller/controllers" + autoscalingv1alpha1 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" + autoscalingv1alpha2 "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2" + controllers "github.com/gardener/hvpa-controller/controllers/autoscaling" // +kubebuilder:scaffold:imports ) @@ -40,6 +41,7 @@ var ( func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(autoscalingv1alpha1.AddToScheme(scheme)) + utilruntime.Must(autoscalingv1alpha2.AddToScheme(scheme)) // +kubebuilder:scaffold:scheme } @@ -62,9 +64,11 @@ func main() { ctrl.SetLogger(klogv2.NewKlogr()) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Port: 9443, Scheme: scheme, MetricsBindAddress: metricsAddr, LeaderElection: enableLeaderElection, + LeaderElectionID: "hvpa-controller", }) if err != nil { setupLog.Error(err, "unable to start manager") @@ -80,13 +84,16 @@ func main() { os.Exit(1) } - // TODO: Enable webhooks - /* + if os.Getenv("ENABLE_WEBHOOKS") != "false" { if err = (&autoscalingv1alpha1.Hvpa{}).SetupWebhookWithManager(mgr); err != nil { setupLog.Error(err, "unable to create webhook", "webhook", "Hvpa") os.Exit(1) } - */ + if err = (&autoscalingv1alpha2.Hvpa{}).SetupWebhookWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create webhook", "webhook", "CronJob") + os.Exit(1) + } + } // +kubebuilder:scaffold:builder diff --git a/vendor/github.com/gardener/hvpa-controller/api/v1alpha1/groupversion_info.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/groupversion_info.go similarity index 99% rename from vendor/github.com/gardener/hvpa-controller/api/v1alpha1/groupversion_info.go rename to vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/groupversion_info.go index 96063838..430fdf96 100644 --- a/vendor/github.com/gardener/hvpa-controller/api/v1alpha1/groupversion_info.go +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/groupversion_info.go @@ -20,9 +20,12 @@ limitations under the License. package v1alpha1 import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" +) + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" vpa_api "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" ) diff --git a/api/v1alpha1/hvpa_types.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/hvpa_types.go similarity index 99% rename from api/v1alpha1/hvpa_types.go rename to vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/hvpa_types.go index 4a0f5887..282bff9a 100644 --- a/api/v1alpha1/hvpa_types.go +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/hvpa_types.go @@ -330,6 +330,7 @@ type HpaStatus struct { // +kubebuilder:object:root=true // +kubebuilder:subresource:status // +kubebuilder:subresource:scale:specpath=.spec.replicas,statuspath=.status.replicas,selectorpath=.status.targetSelector +// +kubebuilder:storageversion type Hvpa struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -349,3 +350,6 @@ type HvpaList struct { /*func init() { SchemeBuilder.Register(&Hvpa{}, &HvpaList{}) }*/ + +// Hub marks this version as the API conversion Hub +func (*Hvpa) Hub() {} diff --git a/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/hvpa_webhook.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/hvpa_webhook.go new file mode 100644 index 00000000..62184093 --- /dev/null +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/hvpa_webhook.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha1 + +import ( + ctrl "sigs.k8s.io/controller-runtime" + logf "sigs.k8s.io/controller-runtime/pkg/log" +) + +// log is for logging in this package. +var hvpalog = logf.Log.WithName("hvpa-resource") + +func (r *Hvpa) SetupWebhookWithManager(mgr ctrl.Manager) error { + return ctrl.NewWebhookManagedBy(mgr). + For(r). + Complete() +} diff --git a/vendor/github.com/gardener/hvpa-controller/api/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from vendor/github.com/gardener/hvpa-controller/api/v1alpha1/zz_generated.deepcopy.go rename to vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1/zz_generated.deepcopy.go diff --git a/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/groupversion_info.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/groupversion_info.go new file mode 100644 index 00000000..69ed3e6b --- /dev/null +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/groupversion_info.go @@ -0,0 +1,36 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha2 contains API Schema definitions for the autoscaling v1alpha2 API group +// +kubebuilder:object:generate=true +// +groupName=autoscaling.k8s.io +package v1alpha2 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "autoscaling.k8s.io", Version: "v1alpha2"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_conversion.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_conversion.go new file mode 100644 index 00000000..8478f86f --- /dev/null +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_conversion.go @@ -0,0 +1,477 @@ +package v1alpha2 + +import ( + "github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1" + autoscalingv2 "k8s.io/api/autoscaling/v2" + autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" + v1 "k8s.io/api/core/v1" + "sigs.k8s.io/controller-runtime/pkg/conversion" +) + +// ConvertTo converts TO the Hub API version (v1alpha1) from this version (v1alpha2) +func (src *Hvpa) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1alpha1.Hvpa) + + // Convert ObjectMeta + dst.ObjectMeta = src.ObjectMeta + + // Convert the Spec + dst.Spec.Replicas = src.Spec.Replicas + dst.Spec.Vpa = v1alpha1.VpaSpec{ + Selector: src.Spec.Vpa.Selector, + Deploy: src.Spec.Vpa.Deploy, + ScaleUp: Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Vpa.ScaleUp), + ScaleDown: Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Vpa.ScaleDown), + Template: v1alpha1.VpaTemplate{ + ObjectMeta: src.Spec.Vpa.Template.ObjectMeta, + Spec: v1alpha1.VpaTemplateSpec(src.Spec.Vpa.Template.Spec), + }, + LimitsRequestsGapScaleParams: Convert_ScaleParams_To_v1alpha1_ScaleParams(src.Spec.Vpa.LimitsRequestsGapScaleParams), + } + dst.Spec.WeightBasedScalingIntervals = Convert_WeightBasedScalingIntervals_To_v1alpha1_WeightBasedScalingIntervals(src.Spec.WeightBasedScalingIntervals) + dst.Spec.TargetRef = Convert_v2_CrossVersionObjectReference_To_v2beta1_CrossVersionObjectReference(src.Spec.TargetRef) + dst.Spec.MaintenanceTimeWindow = Convert_MaintenanceWindow_To_v1alpha1_MaintenanceWindow(src.Spec.MaintenanceTimeWindow) + dst.Spec.Hpa.Selector = src.Spec.Hpa.Selector + dst.Spec.Hpa.Deploy = src.Spec.Hpa.Deploy + dst.Spec.Hpa.ScaleUp = Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Hpa.ScaleUp) + dst.Spec.Hpa.ScaleDown = Convert_ScaleType_To_v1alpha1_ScaleType(src.Spec.Hpa.ScaleDown) + dst.Spec.Hpa.Template.ObjectMeta = src.Spec.Hpa.Template.ObjectMeta + dst.Spec.Hpa.Template.Spec.MinReplicas = src.Spec.Hpa.Template.Spec.MinReplicas + dst.Spec.Hpa.Template.Spec.MaxReplicas = src.Spec.Hpa.Template.Spec.MaxReplicas + for _, metric := range src.Spec.Hpa.Template.Spec.Metrics { + ms := autoscalingv2beta1.MetricSpec{ + Type: autoscalingv2beta1.MetricSourceType(metric.Type), + Object: Convert_autoscalingv2_ObjectMetricSource_To_autoscalingv2beta1_ObjectMetricSource(metric.Object), + Pods: Convert_autoscalingv2_PodsMetricSource_To_autoscalingv2beta1_PodsMetricSource(metric.Pods), + Resource: Convert_autoscalingv2_ResourceMetricSource_To_autoscalingv2beta1_ResourceMetricSource(metric.Resource), + ContainerResource: Convert_autoscalingv2_ContainerResourceMetricSource_To_autoscalingv2beta1_ContainerResourceMetricSource(metric.ContainerResource), + External: Convert_autoscalingv2_ExternalMetricSource_To_autoscalingv2beta1_ExternalMetricSource(metric.External), + } + dst.Spec.Hpa.Template.Spec.Metrics = append(dst.Spec.Hpa.Template.Spec.Metrics, ms) + } + + // Convert the Status + dst.Status.Replicas = src.Status.Replicas + dst.Status.TargetSelector = src.Status.TargetSelector + dst.Status.HpaScaleUpUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.HpaScaleUpUpdatePolicy) + dst.Status.HpaScaleDownUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.HpaScaleDownUpdatePolicy) + dst.Status.VpaScaleUpUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.VpaScaleUpUpdatePolicy) + dst.Status.VpaScaleDownUpdatePolicy = Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(src.Status.VpaScaleDownUpdatePolicy) + dst.Status.VpaWeight = src.Status.VpaWeight + dst.Status.HpaWeight = src.Status.HpaWeight + dst.Status.OverrideScaleUpStabilization = src.Status.OverrideScaleUpStabilization + for _, blockedScaling := range src.Status.LastBlockedScaling { + dst.Status.LastBlockedScaling = append(dst.Status.LastBlockedScaling, &v1alpha1.BlockedScaling{ + Reason: v1alpha1.BlockingReason(blockedScaling.Reason), + ScalingStatus: Convert_ScalingStatus_To_v1alpha1_ScalingStatus(blockedScaling.ScalingStatus), + }) + } + dst.Status.LastScaling = Convert_ScalingStatus_To_v1alpha1_ScalingStatus(src.Status.LastScaling) + dst.Status.LastError = Convert_LastError_to_v1alpha1_LastError(src.Status.LastError) + + return nil +} + +// ConvertFrom converts FROM the Hub API version (v1alpha1) to this API version (v1alpha2) +func (dst *Hvpa) ConvertFrom(srcRaw conversion.Hub) error { + src := srcRaw.(*v1alpha1.Hvpa) + + // Convert ObjectMeta + dst.ObjectMeta = src.ObjectMeta + + // Convert the Spec + dst.Spec.Replicas = src.Spec.Replicas + dst.Spec.Vpa = VpaSpec{ + Selector: src.Spec.Vpa.Selector, + Deploy: src.Spec.Vpa.Deploy, + ScaleUp: Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Vpa.ScaleUp), + ScaleDown: Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Vpa.ScaleDown), + Template: VpaTemplate{ + ObjectMeta: src.Spec.Vpa.Template.ObjectMeta, + Spec: VpaTemplateSpec(src.Spec.Vpa.Template.Spec), + }, + LimitsRequestsGapScaleParams: Convert_v1alpha1_ScaleParams_To_ScaleParams(src.Spec.Vpa.LimitsRequestsGapScaleParams), + } + dst.Spec.WeightBasedScalingIntervals = Convert_v1alpha1_WeightBasedScalingIntervals_To_WeightBasedScalingIntervals(src.Spec.WeightBasedScalingIntervals) + dst.Spec.TargetRef = Convert_v2beta1_CrossVersionObjectReference_To_v2_CrossVersionObjectReference(src.Spec.TargetRef) + dst.Spec.MaintenanceTimeWindow = Convert_v1alpha1_MaintenanceWindow_To_MaintenanceWindow(src.Spec.MaintenanceTimeWindow) + dst.Spec.Hpa.Selector = src.Spec.Hpa.Selector + dst.Spec.Hpa.Deploy = src.Spec.Hpa.Deploy + dst.Spec.Hpa.ScaleUp = Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Hpa.ScaleUp) + dst.Spec.Hpa.ScaleDown = Convert_v1alpha1_ScaleType_To_ScaleType(src.Spec.Hpa.ScaleDown) + dst.Spec.Hpa.Template.ObjectMeta = src.Spec.Hpa.Template.ObjectMeta + dst.Spec.Hpa.Template.Spec.MinReplicas = src.Spec.Hpa.Template.Spec.MinReplicas + dst.Spec.Hpa.Template.Spec.MaxReplicas = src.Spec.Hpa.Template.Spec.MaxReplicas + for _, metric := range src.Spec.Hpa.Template.Spec.Metrics { + ms := autoscalingv2.MetricSpec{ + Type: autoscalingv2.MetricSourceType(metric.Type), + Object: Convert_autoscalingv2beta1_ObjectMetricSource_To_autoscalingv2_ObjectMetricSource(metric.Object), + Pods: Convert_autoscalingv2beta1_PodsMetricSource_To_autoscalingv2_PodsMetricSource(metric.Pods), + Resource: Convert_autoscalingv2beta1_ResourceMetricSource_To_autoscalingv2_ResourceMetricSource(metric.Resource), + ContainerResource: Convert_autoscalingv2beta1_ContainerResourceMetricSource_To_autoscalingv2_ContainerResourceMetricSource(metric.ContainerResource), + External: Convert_autoscalingv2beta1_ExternalMetricSource_To_autoscalingv2_ExternalMetricSource(metric.External), + } + dst.Spec.Hpa.Template.Spec.Metrics = append(dst.Spec.Hpa.Template.Spec.Metrics, ms) + } + + // Convert the Status + dst.Status.Replicas = src.Status.Replicas + dst.Status.TargetSelector = src.Status.TargetSelector + dst.Status.HpaScaleUpUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.HpaScaleUpUpdatePolicy) + dst.Status.HpaScaleDownUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.HpaScaleDownUpdatePolicy) + dst.Status.VpaScaleUpUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.VpaScaleUpUpdatePolicy) + dst.Status.VpaScaleDownUpdatePolicy = Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(src.Status.VpaScaleDownUpdatePolicy) + dst.Status.VpaWeight = src.Status.VpaWeight + dst.Status.HpaWeight = src.Status.HpaWeight + dst.Status.OverrideScaleUpStabilization = src.Status.OverrideScaleUpStabilization + for _, blockedScaling := range src.Status.LastBlockedScaling { + dst.Status.LastBlockedScaling = append(dst.Status.LastBlockedScaling, &BlockedScaling{ + Reason: BlockingReason(blockedScaling.Reason), + ScalingStatus: Convert_v1alpha1_ScalingStatus_To_ScalingStatus(blockedScaling.ScalingStatus), + }) + } + dst.Status.LastScaling = Convert_v1alpha1_ScalingStatus_To_ScalingStatus(src.Status.LastScaling) + dst.Status.LastError = Convert_v1alpha1_LastError_to_LastError(src.Status.LastError) + + return nil +} + +func Convert_v1alpha1_WeightBasedScalingIntervals_To_WeightBasedScalingIntervals(in []v1alpha1.WeightBasedScalingInterval) []WeightBasedScalingInterval { + if in == nil { + return nil + } + out := []WeightBasedScalingInterval{} + for _, weightBasedScalingInterval := range in { + out = append(out, WeightBasedScalingInterval(weightBasedScalingInterval)) + } + return out +} + +func Convert_WeightBasedScalingIntervals_To_v1alpha1_WeightBasedScalingIntervals(in []WeightBasedScalingInterval) []v1alpha1.WeightBasedScalingInterval { + if in == nil { + return nil + } + out := []v1alpha1.WeightBasedScalingInterval{} + for _, weightBasedScalingInterval := range in { + out = append(out, v1alpha1.WeightBasedScalingInterval(weightBasedScalingInterval)) + } + return out +} + +func Convert_v2beta1_CrossVersionObjectReference_To_v2_CrossVersionObjectReference(in *autoscalingv2beta1.CrossVersionObjectReference) *autoscalingv2.CrossVersionObjectReference { + if in == nil { + return nil + } + return &autoscalingv2.CrossVersionObjectReference{ + Kind: in.Kind, + Name: in.Name, + APIVersion: in.APIVersion, + } +} + +func Convert_v2_CrossVersionObjectReference_To_v2beta1_CrossVersionObjectReference(in *autoscalingv2.CrossVersionObjectReference) *autoscalingv2beta1.CrossVersionObjectReference { + if in == nil { + return nil + } + return &autoscalingv2beta1.CrossVersionObjectReference{ + Kind: in.Kind, + Name: in.Name, + APIVersion: in.APIVersion, + } +} + +func Convert_v1alpha1_MaintenanceWindow_To_MaintenanceWindow(in *v1alpha1.MaintenanceTimeWindow) *MaintenanceTimeWindow { + if in == nil { + return nil + } + mw := MaintenanceTimeWindow(*in) + return &mw +} + +func Convert_MaintenanceWindow_To_v1alpha1_MaintenanceWindow(in *MaintenanceTimeWindow) *v1alpha1.MaintenanceTimeWindow { + if in == nil { + return nil + } + mw := v1alpha1.MaintenanceTimeWindow(*in) + return &mw +} + +func Convert_v1alpha1_LastError_to_LastError(in *v1alpha1.LastError) *LastError { + if in == nil { + return nil + } + lastError := LastError(*in) + return &lastError +} + +func Convert_LastError_to_v1alpha1_LastError(in *LastError) *v1alpha1.LastError { + if in == nil { + return nil + } + lastError := v1alpha1.LastError(*in) + return &lastError +} + +func Convert_v1alpha1_UpdatePolicy_To_UpdatePolicy(in *v1alpha1.UpdatePolicy) *UpdatePolicy { + if in == nil { + return nil + } + up := UpdatePolicy(*in) + return &up +} + +func Convert_UpdatePolicy_To_v1alpha1_UpdatePolicy(in *UpdatePolicy) *v1alpha1.UpdatePolicy { + if in == nil { + return nil + } + up := v1alpha1.UpdatePolicy(*in) + return &up +} + +func Convert_v1alpha1_ScalingStatus_To_ScalingStatus(in v1alpha1.ScalingStatus) ScalingStatus { + return ScalingStatus{ + LastScaleTime: in.LastScaleTime, + HpaStatus: HpaStatus{ + CurrentReplicas: in.HpaStatus.CurrentReplicas, + DesiredReplicas: in.HpaStatus.DesiredReplicas, + }, + VpaStatus: in.VpaStatus, + } +} + +func Convert_ScalingStatus_To_v1alpha1_ScalingStatus(in ScalingStatus) v1alpha1.ScalingStatus { + return v1alpha1.ScalingStatus{ + LastScaleTime: in.LastScaleTime, + HpaStatus: v1alpha1.HpaStatus{ + CurrentReplicas: in.HpaStatus.CurrentReplicas, + DesiredReplicas: in.HpaStatus.DesiredReplicas, + }, + VpaStatus: in.VpaStatus, + } +} + +func Convert_v1alpha1_ScaleParams_To_ScaleParams(in v1alpha1.ScaleParams) ScaleParams { + return ScaleParams{ + CPU: ChangeParams(in.CPU), + Memory: ChangeParams(in.Memory), + Replicas: ChangeParams(in.Replicas), + } +} + +func Convert_ScaleParams_To_v1alpha1_ScaleParams(in ScaleParams) v1alpha1.ScaleParams { + return v1alpha1.ScaleParams{ + CPU: v1alpha1.ChangeParams(in.CPU), + Memory: v1alpha1.ChangeParams(in.Memory), + Replicas: v1alpha1.ChangeParams(in.Replicas), + } +} + +func Convert_v1alpha1_ScaleType_To_ScaleType(in v1alpha1.ScaleType) ScaleType { + return ScaleType{ + UpdatePolicy: UpdatePolicy(in.UpdatePolicy), + MinChange: Convert_v1alpha1_ScaleParams_To_ScaleParams(in.MinChange), + StabilizationDuration: in.StabilizationDuration, + } +} + +func Convert_ScaleType_To_v1alpha1_ScaleType(in ScaleType) v1alpha1.ScaleType { + return v1alpha1.ScaleType{ + UpdatePolicy: v1alpha1.UpdatePolicy(in.UpdatePolicy), + MinChange: Convert_ScaleParams_To_v1alpha1_ScaleParams(in.MinChange), + StabilizationDuration: in.StabilizationDuration, + } +} + +// Conversion methods taken from https://github.com/kubernetes/kubernetes/blob/v1.24.7/pkg/apis/autoscaling/v2beta1/conversion.go + +func Convert_autoscalingv2beta1_ResourceMetricSource_To_autoscalingv2_ResourceMetricSource(in *autoscalingv2beta1.ResourceMetricSource) *autoscalingv2.ResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ResourceMetricSource{} + out.Name = in.Name + utilization := in.TargetAverageUtilization + averageValue := in.TargetAverageValue + + var metricType autoscalingv2.MetricTargetType + if utilization == nil { + metricType = autoscalingv2.AverageValueMetricType + } else { + metricType = autoscalingv2.UtilizationMetricType + } + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + AverageValue: averageValue, + AverageUtilization: utilization, + } + return &out +} + +func Convert_autoscalingv2_ResourceMetricSource_To_autoscalingv2beta1_ResourceMetricSource(in *autoscalingv2.ResourceMetricSource) *autoscalingv2beta1.ResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ResourceMetricSource{} + out.Name = in.Name + out.TargetAverageUtilization = in.Target.AverageUtilization + out.TargetAverageValue = in.Target.AverageValue + return &out +} + +func Convert_autoscalingv2beta1_ObjectMetricSource_To_autoscalingv2_ObjectMetricSource(in *autoscalingv2beta1.ObjectMetricSource) *autoscalingv2.ObjectMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ObjectMetricSource{} + var metricType autoscalingv2.MetricTargetType + if in.AverageValue == nil { + metricType = autoscalingv2.ValueMetricType + } else { + metricType = autoscalingv2.AverageValueMetricType + } + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + Value: &in.TargetValue, + AverageValue: in.AverageValue, + } + out.DescribedObject = autoscalingv2.CrossVersionObjectReference{ + Kind: in.Target.Kind, + Name: in.Target.Name, + APIVersion: in.Target.APIVersion, + } + out.Metric = autoscalingv2.MetricIdentifier{ + Name: in.MetricName, + Selector: in.Selector, + } + return &out +} + +func Convert_autoscalingv2_ObjectMetricSource_To_autoscalingv2beta1_ObjectMetricSource(in *autoscalingv2.ObjectMetricSource) *autoscalingv2beta1.ObjectMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ObjectMetricSource{} + if in.Target.Value != nil { + out.TargetValue = *in.Target.Value + } + out.AverageValue = in.Target.AverageValue + + out.Target = autoscalingv2beta1.CrossVersionObjectReference{ + Kind: in.DescribedObject.Kind, + Name: in.DescribedObject.Name, + APIVersion: in.DescribedObject.APIVersion, + } + out.MetricName = in.Metric.Name + out.Selector = in.Metric.Selector + + return &out +} + +func Convert_autoscalingv2beta1_PodsMetricSource_To_autoscalingv2_PodsMetricSource(in *autoscalingv2beta1.PodsMetricSource) *autoscalingv2.PodsMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.PodsMetricSource{} + targetAverageValue := &in.TargetAverageValue + metricType := autoscalingv2.AverageValueMetricType + + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + AverageValue: targetAverageValue, + } + out.Metric = autoscalingv2.MetricIdentifier{ + Name: in.MetricName, + Selector: in.Selector, + } + return &out +} + +func Convert_autoscalingv2_PodsMetricSource_To_autoscalingv2beta1_PodsMetricSource(in *autoscalingv2.PodsMetricSource) *autoscalingv2beta1.PodsMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.PodsMetricSource{} + if in.Target.AverageValue != nil { + targetAverageValue := *in.Target.AverageValue + out.TargetAverageValue = targetAverageValue + } + + out.MetricName = in.Metric.Name + out.Selector = in.Metric.Selector + + return &out +} + +func Convert_autoscalingv2beta1_ContainerResourceMetricSource_To_autoscalingv2_ContainerResourceMetricSource(in *autoscalingv2beta1.ContainerResourceMetricSource) *autoscalingv2.ContainerResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ContainerResourceMetricSource{} + out.Name = in.Name + utilization := in.TargetAverageUtilization + averageValue := in.TargetAverageValue + + var metricType autoscalingv2.MetricTargetType + if utilization == nil { + metricType = autoscalingv2.AverageValueMetricType + } else { + metricType = autoscalingv2.UtilizationMetricType + } + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + AverageValue: averageValue, + AverageUtilization: utilization, + } + return &out +} + +func Convert_autoscalingv2_ContainerResourceMetricSource_To_autoscalingv2beta1_ContainerResourceMetricSource(in *autoscalingv2.ContainerResourceMetricSource) *autoscalingv2beta1.ContainerResourceMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ContainerResourceMetricSource{} + out.Name = v1.ResourceName(in.Name) + out.TargetAverageUtilization = in.Target.AverageUtilization + out.TargetAverageValue = in.Target.AverageValue + return &out +} + +func Convert_autoscalingv2beta1_ExternalMetricSource_To_autoscalingv2_ExternalMetricSource(in *autoscalingv2beta1.ExternalMetricSource) *autoscalingv2.ExternalMetricSource { + if in == nil { + return nil + } + out := autoscalingv2.ExternalMetricSource{} + value := in.TargetValue + averageValue := in.TargetAverageValue + + var metricType autoscalingv2.MetricTargetType + if value == nil { + metricType = autoscalingv2.AverageValueMetricType + } else { + metricType = autoscalingv2.ValueMetricType + } + + out.Target = autoscalingv2.MetricTarget{ + Type: metricType, + Value: value, + AverageValue: averageValue, + } + + out.Metric = autoscalingv2.MetricIdentifier{ + Name: in.MetricName, + Selector: in.MetricSelector, + } + return &out +} + +func Convert_autoscalingv2_ExternalMetricSource_To_autoscalingv2beta1_ExternalMetricSource(in *autoscalingv2.ExternalMetricSource) *autoscalingv2beta1.ExternalMetricSource { + if in == nil { + return nil + } + out := autoscalingv2beta1.ExternalMetricSource{} + out.MetricName = in.Metric.Name + out.TargetValue = in.Target.Value + out.TargetAverageValue = in.Target.AverageValue + out.MetricSelector = in.Metric.Selector + return &out +} diff --git a/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_types.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_types.go new file mode 100644 index 00000000..1a478165 --- /dev/null +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_types.go @@ -0,0 +1,348 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha2 + +import ( + autoscalingv2 "k8s.io/api/autoscaling/v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + vpa_api "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" +) + +// VpaTemplateSpec defines the spec for VPA +type VpaTemplateSpec struct { + // Controls how the autoscaler computes recommended resources. + // The resource policy may be used to set constraints on the recommendations + // for individual containers. If not specified, the autoscaler computes recommended + // resources for all containers in the pod, without additional constraints. + // +optional + ResourcePolicy *vpa_api.PodResourcePolicy `json:"resourcePolicy,omitempty" protobuf:"bytes,2,opt,name=resourcePolicy"` +} + +// UpdatePolicy describes the rules on how changes are applied. +type UpdatePolicy struct { + // Controls when autoscaler applies changes to the resources. + // The default is 'Auto'. + // +optional + UpdateMode *string `json:"updateMode,omitempty" protobuf:"bytes,1,opt,name=updateMode"` +} + +const ( + // UpdateModeOff means that autoscaler never changes resources. + UpdateModeOff string = "Off" + // UpdateModeAuto means that autoscaler can update resources during the lifetime of the resource. + UpdateModeAuto string = "Auto" + // UpdateModeMaintenanceWindow means that HPA/VPA will only act during maintenance window. + UpdateModeMaintenanceWindow string = "MaintenanceWindow" + + // UpdateModeDefault is the default update mode + UpdateModeDefault = UpdateModeAuto +) + +// MaintenanceTimeWindow contains information about the time window for maintenance operations. +type MaintenanceTimeWindow struct { + // Begin is the beginning of the time window in the format HHMMSS+ZONE, e.g. "220000+0100". + Begin string `json:"begin"` + // End is the end of the time window in the format HHMMSS+ZONE, e.g. "220000+0100". + End string `json:"end"` +} + +// HpaTemplateSpec defines the spec for HPA +type HpaTemplateSpec struct { + // minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. + // It defaults to 1 pod. + // +optional + MinReplicas *int32 `json:"minReplicas,omitempty" protobuf:"varint,1,opt,name=minReplicas"` + + // maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. + // It cannot be less that minReplicas. + MaxReplicas int32 `json:"maxReplicas" protobuf:"varint,2,opt,name=maxReplicas"` + + // metrics contains the specifications for which to use to calculate the + // desired replica count (the maximum replica count across all metrics will + // be used). The desired replica count is calculated multiplying the + // ratio between the target value and the current value by the current + // number of pods. Ergo, metrics used must decrease as the pod count is + // increased, and vice-versa. See the individual metric source types for + // more information about how each type of metric must respond. + // If not set, the default metric will be set to 80% average CPU utilization. + // +optional + Metrics []autoscalingv2.MetricSpec `json:"metrics,omitempty" protobuf:"bytes,3,rep,name=metrics"` +} + +// WeightBasedScalingInterval defines the interval of replica counts in which VpaWeight is applied to VPA scaling +type WeightBasedScalingInterval struct { + // VpaWeight defines the weight (in percentage) to be given to VPA's recommendationd for the interval of number of replicas provided + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=100 + VpaWeight int32 `json:"vpaWeight,omitempty"` + // StartReplicaCount is the number of replicas from which VpaWeight is applied to VPA scaling + // If this field is not provided, it will default to minReplicas of HPA + // +optional + StartReplicaCount int32 `json:"startReplicaCount,omitempty"` + // LastReplicaCount is the number of replicas till which VpaWeight is applied to VPA scaling + // If this field is not provided, it will default to maxReplicas of HPA + // +optional + LastReplicaCount int32 `json:"lastReplicaCount,omitempty"` +} + +// VpaSpec defines spec for VPA +type VpaSpec struct { + // Selector is a label query that should match VPA. + // Must match in order to be controlled. + // If empty, defaulted to labels on VPA template. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty"` + + // Deploy defines whether the VPA is deployed or not + Deploy bool `json:"deploy,omitempty"` + + // ScaleUp defines the parameters for scale up + ScaleUp ScaleType `json:"scaleUp,omitempty"` + + // ScaleDown defines the parameters for scale down + ScaleDown ScaleType `json:"scaleDown,omitempty"` + + // Template is the object that describes the VPA that will be created. + // +optional + Template VpaTemplate `json:"template,omitempty"` + + // LimitsRequestsGapScaleParams is the scaling thresholds for limits + LimitsRequestsGapScaleParams ScaleParams `json:"limitsRequestsGapScaleParams,omitempty"` +} + +// ScaleType defines parameters for scaling +type ScaleType struct { + // Describes the rules on when changes are applied. + // If not specified, all fields in the `UpdatePolicy` are set to their + // default values. + // +optional + UpdatePolicy UpdatePolicy `json:"updatePolicy,omitempty"` + + // MinChange is the minimum change in the resource on which HVPA acts + // HVPA uses minimum of the Value and Percentage value + MinChange ScaleParams `json:"minChange,omitempty"` + + // StabilizationDuration defines the minimum delay in minutes between 2 consecutive scale operations + // Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + StabilizationDuration *string `json:"stabilizationDuration,omitempty"` +} + +// ScaleParams defines the scaling parameters for the limits +type ScaleParams struct { + // Scale parameters for CPU + CPU ChangeParams `json:"cpu,omitempty"` + // Scale parameters for memory + Memory ChangeParams `json:"memory,omitempty"` + // Scale patameters for replicas + Replicas ChangeParams `json:"replicas,omitempty"` +} + +// VpaTemplate defines the template for VPA +type VpaTemplate struct { + // Metadata of the pods created from this template. + // +kubebuilder:validation:XPreserveUnknownFields + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec defines the behavior of a VPA. + // +optional + Spec VpaTemplateSpec `json:"spec,omitempty"` +} + +// HpaTemplate defines the template for HPA +type HpaTemplate struct { + // Metadata of the pods created from this template. + // +kubebuilder:validation:XPreserveUnknownFields + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec defines the behavior of a HPA. + // +optional + Spec HpaTemplateSpec `json:"spec,omitempty"` +} + +// HpaSpec defines spec for HPA +type HpaSpec struct { + // Selector is a label query that should match HPA. + // Must match in order to be controlled. + // If empty, defaulted to labels on HPA template. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty"` + + // Deploy defines whether the HPA is deployed or not + Deploy bool `json:"deploy,omitempty"` + + // ScaleUp defines the parameters for scale up + ScaleUp ScaleType `json:"scaleUp,omitempty"` + + // ScaleDown defines the parameters for scale down + ScaleDown ScaleType `json:"scaleDown,omitempty"` + + // Template is the object that describes the HPA that will be created. + // +optional + Template HpaTemplate `json:"template,omitempty"` +} + +// HvpaSpec defines the desired state of Hvpa +type HvpaSpec struct { + // Replicas is the number of replicas of target resource + Replicas *int32 `json:"replicas,omitempty"` + + // Hpa defines the spec of HPA + Hpa HpaSpec `json:"hpa,omitempty"` + + // Vpa defines the spec of VPA + Vpa VpaSpec `json:"vpa,omitempty"` + + // WeightBasedScalingIntervals defines the intervals of replica counts, and the weights for scaling a deployment vertically + // If there are overlapping intervals, then the vpaWeight will be taken from the first matching interval + WeightBasedScalingIntervals []WeightBasedScalingInterval `json:"weightBasedScalingIntervals,omitempty"` + + // TargetRef points to the controller managing the set of pods for the autoscaler to control + TargetRef *autoscalingv2.CrossVersionObjectReference `json:"targetRef"` + + // MaintenanceTimeWindow contains information about the time window for maintenance operations. + // +optional + MaintenanceTimeWindow *MaintenanceTimeWindow `json:"maintenanceTimeWindow,omitempty"` +} + +// ChangeParams defines the parameters for scaling +type ChangeParams struct { + // Value is the absolute value of the scaling + // +optional + Value *string `json:"value,omitempty"` + // Percentage is the percentage of currently allocated value to be used for scaling + // +optional + Percentage *int32 `json:"percentage,omitempty"` +} + +const ( + // VpaOnly - only vertical scaling + VpaOnly int32 = 100 + // HpaOnly - only horizontal scaling + HpaOnly int32 = 0 +) + +// LastError has detailed information of the error +type LastError struct { + // Description of the error + Description string `json:"description,omitempty"` + + // Time at which the error occurred + LastUpdateTime metav1.Time `json:"lastUpdateTime,omitempty"` + + // LastOperation is the type of operation for which error occurred + LastOperation string `json:"lastOperation,omitempty"` +} + +// HvpaStatus defines the observed state of Hvpa +type HvpaStatus struct { + // Replicas is the number of replicas of the target resource. + Replicas *int32 `json:"replicas,omitempty"` + // TargetSelector is the string form of the label selector of HPA. This is required for HPA to work with scale subresource. + TargetSelector *string `json:"targetSelector,omitempty"` + // Current HPA UpdatePolicy set in the spec + HpaScaleUpUpdatePolicy *UpdatePolicy `json:"hpaScaleUpUpdatePolicy,omitempty"` + // Current HPA UpdatePolicy set in the spec + HpaScaleDownUpdatePolicy *UpdatePolicy `json:"hpaScaleDownUpdatePolicy,omitempty"` + // Current VPA UpdatePolicy set in the spec + VpaScaleUpUpdatePolicy *UpdatePolicy `json:"vpaScaleUpUpdatePolicy,omitempty"` + // Current VPA UpdatePolicy set in the spec + VpaScaleDownUpdatePolicy *UpdatePolicy `json:"vpaScaleDownUpdatePolicy,omitempty"` + + HpaWeight int32 `json:"hpaWeight,omitempty"` + VpaWeight int32 `json:"vpaWeight,omitempty"` + + // Override scale up stabilization window + OverrideScaleUpStabilization bool `json:"overrideScaleUpStabilization,omitempty"` + + LastBlockedScaling []*BlockedScaling `json:"lastBlockedScaling,omitempty"` + LastScaling ScalingStatus `json:"lastScaling,omitempty"` + + // LastError has details of any errors that occurred + LastError *LastError `json:"lastError,omitempty"` +} + +// BlockingReason defines the reason for blocking. +type BlockingReason string + +const ( + // BlockingReasonStabilizationWindow - HVPA is in stabilization window + BlockingReasonStabilizationWindow BlockingReason = "StabilizationWindow" + // BlockingReasonMaintenanceWindow - Resource is in maintenance window + BlockingReasonMaintenanceWindow BlockingReason = "MaintenanceWindow" + // BlockingReasonUpdatePolicy - Update policy doesn't support scaling + BlockingReasonUpdatePolicy BlockingReason = "UpdatePolicy" + // BlockingReasonWeight - VpaWeight doesn't support scaling + BlockingReasonWeight BlockingReason = "Weight" + // BlockingReasonMinChange - Min change doesn't support scaling + BlockingReasonMinChange BlockingReason = "MinChange" +) + +// BlockingReasons lists all the blocking reasons +var BlockingReasons = [...]BlockingReason{ + BlockingReasonMaintenanceWindow, + BlockingReasonMinChange, + BlockingReasonStabilizationWindow, + BlockingReasonUpdatePolicy, + BlockingReasonWeight, +} + +// BlockedScaling defines the details for blocked scaling +type BlockedScaling struct { + Reason BlockingReason `json:"reason,omitempty"` + ScalingStatus `json:"scalingStatus,omitempty"` +} + +// ScalingStatus defines the status of scaling +type ScalingStatus struct { + LastScaleTime *metav1.Time `json:"lastScaleTime,omitempty"` + HpaStatus HpaStatus `json:"hpaStatus,omitempty" protobuf:"bytes,1,opt,name=hpaStatus"` + VpaStatus vpa_api.VerticalPodAutoscalerStatus `json:"vpaStatus,omitempty" protobuf:"bytes,2,opt,name=vpaStatus"` +} + +// HpaStatus defines the status of HPA +type HpaStatus struct { + CurrentReplicas int32 `json:"currentReplicas,omitempty"` + DesiredReplicas int32 `json:"desiredReplicas,omitempty"` +} + +// Hvpa is the Schema for the hvpas API +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:subresource:scale:specpath=.spec.replicas,statuspath=.status.replicas,selectorpath=.status.targetSelector +type Hvpa struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec HvpaSpec `json:"spec,omitempty"` + Status HvpaStatus `json:"status,omitempty"` +} + +// HvpaList contains a list of Hvpa +// +kubebuilder:object:root=true +type HvpaList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Hvpa `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Hvpa{}, &HvpaList{}) +} diff --git a/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_webhook.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_webhook.go new file mode 100644 index 00000000..1a30a21c --- /dev/null +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/hvpa_webhook.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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 v1alpha2 + +import ( + ctrl "sigs.k8s.io/controller-runtime" + logf "sigs.k8s.io/controller-runtime/pkg/log" +) + +// log is for logging in this package. +var hvpalog = logf.Log.WithName("hvpa-resource") + +func (r *Hvpa) SetupWebhookWithManager(mgr ctrl.Manager) error { + return ctrl.NewWebhookManagedBy(mgr). + For(r). + Complete() +} diff --git a/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/zz_generated.deepcopy.go b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/zz_generated.deepcopy.go new file mode 100644 index 00000000..54442e32 --- /dev/null +++ b/vendor/github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2/zz_generated.deepcopy.go @@ -0,0 +1,498 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. + +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. +*/ + +// Code generated by controller-gen. DO NOT EDIT. + +package v1alpha2 + +import ( + "k8s.io/api/autoscaling/v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BlockedScaling) DeepCopyInto(out *BlockedScaling) { + *out = *in + in.ScalingStatus.DeepCopyInto(&out.ScalingStatus) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BlockedScaling. +func (in *BlockedScaling) DeepCopy() *BlockedScaling { + if in == nil { + return nil + } + out := new(BlockedScaling) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ChangeParams) DeepCopyInto(out *ChangeParams) { + *out = *in + if in.Value != nil { + in, out := &in.Value, &out.Value + *out = new(string) + **out = **in + } + if in.Percentage != nil { + in, out := &in.Percentage, &out.Percentage + *out = new(int32) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ChangeParams. +func (in *ChangeParams) DeepCopy() *ChangeParams { + if in == nil { + return nil + } + out := new(ChangeParams) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaSpec) DeepCopyInto(out *HpaSpec) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + in.ScaleUp.DeepCopyInto(&out.ScaleUp) + in.ScaleDown.DeepCopyInto(&out.ScaleDown) + in.Template.DeepCopyInto(&out.Template) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaSpec. +func (in *HpaSpec) DeepCopy() *HpaSpec { + if in == nil { + return nil + } + out := new(HpaSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaStatus) DeepCopyInto(out *HpaStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaStatus. +func (in *HpaStatus) DeepCopy() *HpaStatus { + if in == nil { + return nil + } + out := new(HpaStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaTemplate) DeepCopyInto(out *HpaTemplate) { + *out = *in + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaTemplate. +func (in *HpaTemplate) DeepCopy() *HpaTemplate { + if in == nil { + return nil + } + out := new(HpaTemplate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HpaTemplateSpec) DeepCopyInto(out *HpaTemplateSpec) { + *out = *in + if in.MinReplicas != nil { + in, out := &in.MinReplicas, &out.MinReplicas + *out = new(int32) + **out = **in + } + if in.Metrics != nil { + in, out := &in.Metrics, &out.Metrics + *out = make([]v2.MetricSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HpaTemplateSpec. +func (in *HpaTemplateSpec) DeepCopy() *HpaTemplateSpec { + if in == nil { + return nil + } + out := new(HpaTemplateSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Hvpa) DeepCopyInto(out *Hvpa) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Hvpa. +func (in *Hvpa) DeepCopy() *Hvpa { + if in == nil { + return nil + } + out := new(Hvpa) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Hvpa) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HvpaList) DeepCopyInto(out *HvpaList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Hvpa, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HvpaList. +func (in *HvpaList) DeepCopy() *HvpaList { + if in == nil { + return nil + } + out := new(HvpaList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *HvpaList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HvpaSpec) DeepCopyInto(out *HvpaSpec) { + *out = *in + if in.Replicas != nil { + in, out := &in.Replicas, &out.Replicas + *out = new(int32) + **out = **in + } + in.Hpa.DeepCopyInto(&out.Hpa) + in.Vpa.DeepCopyInto(&out.Vpa) + if in.WeightBasedScalingIntervals != nil { + in, out := &in.WeightBasedScalingIntervals, &out.WeightBasedScalingIntervals + *out = make([]WeightBasedScalingInterval, len(*in)) + copy(*out, *in) + } + if in.TargetRef != nil { + in, out := &in.TargetRef, &out.TargetRef + *out = new(v2.CrossVersionObjectReference) + **out = **in + } + if in.MaintenanceTimeWindow != nil { + in, out := &in.MaintenanceTimeWindow, &out.MaintenanceTimeWindow + *out = new(MaintenanceTimeWindow) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HvpaSpec. +func (in *HvpaSpec) DeepCopy() *HvpaSpec { + if in == nil { + return nil + } + out := new(HvpaSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HvpaStatus) DeepCopyInto(out *HvpaStatus) { + *out = *in + if in.Replicas != nil { + in, out := &in.Replicas, &out.Replicas + *out = new(int32) + **out = **in + } + if in.TargetSelector != nil { + in, out := &in.TargetSelector, &out.TargetSelector + *out = new(string) + **out = **in + } + if in.HpaScaleUpUpdatePolicy != nil { + in, out := &in.HpaScaleUpUpdatePolicy, &out.HpaScaleUpUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.HpaScaleDownUpdatePolicy != nil { + in, out := &in.HpaScaleDownUpdatePolicy, &out.HpaScaleDownUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.VpaScaleUpUpdatePolicy != nil { + in, out := &in.VpaScaleUpUpdatePolicy, &out.VpaScaleUpUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.VpaScaleDownUpdatePolicy != nil { + in, out := &in.VpaScaleDownUpdatePolicy, &out.VpaScaleDownUpdatePolicy + *out = new(UpdatePolicy) + (*in).DeepCopyInto(*out) + } + if in.LastBlockedScaling != nil { + in, out := &in.LastBlockedScaling, &out.LastBlockedScaling + *out = make([]*BlockedScaling, len(*in)) + for i := range *in { + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(BlockedScaling) + (*in).DeepCopyInto(*out) + } + } + } + in.LastScaling.DeepCopyInto(&out.LastScaling) + if in.LastError != nil { + in, out := &in.LastError, &out.LastError + *out = new(LastError) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HvpaStatus. +func (in *HvpaStatus) DeepCopy() *HvpaStatus { + if in == nil { + return nil + } + out := new(HvpaStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LastError) DeepCopyInto(out *LastError) { + *out = *in + in.LastUpdateTime.DeepCopyInto(&out.LastUpdateTime) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LastError. +func (in *LastError) DeepCopy() *LastError { + if in == nil { + return nil + } + out := new(LastError) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MaintenanceTimeWindow) DeepCopyInto(out *MaintenanceTimeWindow) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MaintenanceTimeWindow. +func (in *MaintenanceTimeWindow) DeepCopy() *MaintenanceTimeWindow { + if in == nil { + return nil + } + out := new(MaintenanceTimeWindow) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScaleParams) DeepCopyInto(out *ScaleParams) { + *out = *in + in.CPU.DeepCopyInto(&out.CPU) + in.Memory.DeepCopyInto(&out.Memory) + in.Replicas.DeepCopyInto(&out.Replicas) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScaleParams. +func (in *ScaleParams) DeepCopy() *ScaleParams { + if in == nil { + return nil + } + out := new(ScaleParams) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScaleType) DeepCopyInto(out *ScaleType) { + *out = *in + in.UpdatePolicy.DeepCopyInto(&out.UpdatePolicy) + in.MinChange.DeepCopyInto(&out.MinChange) + if in.StabilizationDuration != nil { + in, out := &in.StabilizationDuration, &out.StabilizationDuration + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScaleType. +func (in *ScaleType) DeepCopy() *ScaleType { + if in == nil { + return nil + } + out := new(ScaleType) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScalingStatus) DeepCopyInto(out *ScalingStatus) { + *out = *in + if in.LastScaleTime != nil { + in, out := &in.LastScaleTime, &out.LastScaleTime + *out = (*in).DeepCopy() + } + out.HpaStatus = in.HpaStatus + in.VpaStatus.DeepCopyInto(&out.VpaStatus) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScalingStatus. +func (in *ScalingStatus) DeepCopy() *ScalingStatus { + if in == nil { + return nil + } + out := new(ScalingStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpdatePolicy) DeepCopyInto(out *UpdatePolicy) { + *out = *in + if in.UpdateMode != nil { + in, out := &in.UpdateMode, &out.UpdateMode + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdatePolicy. +func (in *UpdatePolicy) DeepCopy() *UpdatePolicy { + if in == nil { + return nil + } + out := new(UpdatePolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VpaSpec) DeepCopyInto(out *VpaSpec) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + in.ScaleUp.DeepCopyInto(&out.ScaleUp) + in.ScaleDown.DeepCopyInto(&out.ScaleDown) + in.Template.DeepCopyInto(&out.Template) + in.LimitsRequestsGapScaleParams.DeepCopyInto(&out.LimitsRequestsGapScaleParams) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VpaSpec. +func (in *VpaSpec) DeepCopy() *VpaSpec { + if in == nil { + return nil + } + out := new(VpaSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VpaTemplate) DeepCopyInto(out *VpaTemplate) { + *out = *in + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VpaTemplate. +func (in *VpaTemplate) DeepCopy() *VpaTemplate { + if in == nil { + return nil + } + out := new(VpaTemplate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VpaTemplateSpec) DeepCopyInto(out *VpaTemplateSpec) { + *out = *in + if in.ResourcePolicy != nil { + in, out := &in.ResourcePolicy, &out.ResourcePolicy + *out = new(v1.PodResourcePolicy) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VpaTemplateSpec. +func (in *VpaTemplateSpec) DeepCopy() *VpaTemplateSpec { + if in == nil { + return nil + } + out := new(VpaTemplateSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WeightBasedScalingInterval) DeepCopyInto(out *WeightBasedScalingInterval) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WeightBasedScalingInterval. +func (in *WeightBasedScalingInterval) DeepCopy() *WeightBasedScalingInterval { + if in == nil { + return nil + } + out := new(WeightBasedScalingInterval) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 9a8ab437..bd4e6b6a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -29,9 +29,10 @@ github.com/fatih/color # github.com/fsnotify/fsnotify v1.5.4 ## explicit; go 1.16 github.com/fsnotify/fsnotify -# github.com/gardener/hvpa-controller/api v0.0.0 => ./api +# github.com/gardener/hvpa-controller/apis/autoscaling v0.0.0 => ./apis/autoscaling ## explicit; go 1.18 -github.com/gardener/hvpa-controller/api/v1alpha1 +github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha1 +github.com/gardener/hvpa-controller/apis/autoscaling/v1alpha2 # github.com/go-logr/logr v1.2.3 ## explicit; go 1.16 github.com/go-logr/logr @@ -710,4 +711,4 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.3.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# github.com/gardener/hvpa-controller/api => ./api +# github.com/gardener/hvpa-controller/apis/autoscaling => ./apis/autoscaling