diff --git a/go.mod b/go.mod index 5eb9fe322a..8588e38b25 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/go-logr/logr v1.0.0 github.com/google/go-containerregistry v0.6.1-0.20210922191434-34b7f00d7a60 github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20211004163346-9ae11fe20941 - github.com/googleapis/gnostic v0.5.4 + github.com/googleapis/gnostic v0.5.5 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/in-toto/in-toto-golang v0.3.3 github.com/jmespath/go-jmespath v0.4.0 @@ -40,19 +40,24 @@ require ( gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gotest.tools v2.2.0+incompatible - k8s.io/api v0.21.4 - k8s.io/apiextensions-apiserver v0.21.4 - k8s.io/apimachinery v0.21.4 - k8s.io/cli-runtime v0.21.1 - k8s.io/client-go v0.21.4 - k8s.io/klog/v2 v2.20.0 - k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 - sigs.k8s.io/controller-runtime v0.8.1 - sigs.k8s.io/kustomize/api v0.8.8 - sigs.k8s.io/kustomize/kyaml v0.10.17 + k8s.io/api v0.22.4 + k8s.io/apiextensions-apiserver v0.22.4 + k8s.io/apimachinery v0.22.4 + k8s.io/cli-runtime v0.22.4 + k8s.io/client-go v0.22.4 + k8s.io/klog/v2 v2.30.0 + k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 + sigs.k8s.io/controller-runtime v0.10.3 + sigs.k8s.io/kustomize/api v0.10.1 + sigs.k8s.io/kustomize/kyaml v0.13.0 sigs.k8s.io/yaml v1.3.0 ) +require ( + github.com/opencontainers/image-spec v1.0.2 // indirect + gopkg.in/inf.v0 v0.9.1 +) + replace ( github.com/apache/thrift => github.com/apache/thrift v0.14.0 github.com/buger/jsonparser => github.com/buger/jsonparser v1.1.1 diff --git a/go.sum b/go.sum index 28bda420fa..7c43eff2fb 100644 --- a/go.sum +++ b/go.sum @@ -103,6 +103,8 @@ github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1 github.com/Azure/go-amqp v0.13.4/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI= github.com/Azure/go-amqp v0.13.7/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -488,14 +490,15 @@ github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8 github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-docopt v0.0.0-20140912013429-f6dd2ebbb31e/go.mod h1:HyVoz1Mz5Co8TFO8EupIdlcpwShBmY98dkT2xeHkvEI= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -519,6 +522,7 @@ github.com/fullstorydev/grpcurl v1.8.2/go.mod h1:YvWNT3xRp2KIRuvCphFodG0fKkMXwax github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gardener/controller-manager-library v0.2.0 h1:MyxL0k10lwBf8TXkbnuN+oEOkHwCNhp3SKj+ad2w62s= github.com/gardener/controller-manager-library v0.2.0/go.mod h1:oCK7fW2VpsMhmUh5c6cOhsN8p9Tth1OM3rRtogDF11k= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -559,7 +563,7 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= +github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -603,7 +607,6 @@ github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= @@ -661,7 +664,6 @@ github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= @@ -710,7 +712,6 @@ github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= @@ -894,8 +895,8 @@ github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsC github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.4 h1:ynbQIWjLw7iv6HAFdixb30U7Uvcmx+f4KlLJpmhkTK0= -github.com/googleapis/gnostic v0.5.4/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= +github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= +github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -978,7 +979,6 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -1009,7 +1009,6 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/in-toto/in-toto-golang v0.2.1-0.20210627200632-886210ae2ab9/go.mod h1:Skbg04kmfB7IAnEIsspKPg/ny1eiFt/TgPr9SDCHusA= @@ -1146,7 +1145,6 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a h1:+J2gw7Bw77w/fbK7wnNJJDKmw1IbWft2Ul5BzrG1Qm8= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= @@ -1224,6 +1222,7 @@ github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= 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= @@ -1274,7 +1273,7 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -1285,8 +1284,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= @@ -1678,7 +1677,6 @@ go.etcd.io/etcd/v3 v3.5.0-alpha.0/go.mod h1:JZ79d3LV6NUfPjUxXrpiFAYcjhT+06qqw+i2 go.etcd.io/etcd/v3 v3.5.0/go.mod h1:FldM0/VzcxYWLvWx1sdA7ghKw7C3L2DvUTzGrcEtsC4= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= @@ -1704,6 +1702,7 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib v0.24.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= @@ -1738,10 +1737,8 @@ go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.16.1-0.20210329175301-c23abee72d19/go.mod h1:aMfIlz3TDBfB0BwTCKFU1XbEmj9zevr5S5LcBr85MXw= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= @@ -1911,6 +1908,7 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2074,6 +2072,7 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2208,7 +2207,6 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= @@ -2452,7 +2450,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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.7/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= @@ -2479,59 +2476,62 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= k8s.io/api v0.16.4/go.mod h1:AtzMnsR45tccQss5q8RnF+W8L81DH6XwXwo/joEx9u0= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.21.4 h1:WtDkzTAuI31WZKDPeIYpEUA+WeUfXAmA7gwj6nzFfbc= k8s.io/api v0.21.4/go.mod h1:fTVGP+M4D8+00FN2cMnJqk/eb/GH53bvmNs2SVTmpFk= +k8s.io/api v0.22.2/go.mod h1:y3ydYpLJAaDI+BbSe2xmGcqxiWHmWjkEeIbiwHvnPR8= +k8s.io/api v0.22.4 h1:UvyHW0ezB2oIgHAxlYoo6UJQObYXU7awuNarwoHEOjw= +k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk= k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= k8s.io/apiextensions-apiserver v0.16.4/go.mod h1:HYQwjujEkXmQNhap2C9YDdIVOSskGZ3et0Mvjcyjbto= -k8s.io/apiextensions-apiserver v0.20.1/go.mod h1:ntnrZV+6a3dB504qwC5PN/Yg9PBiDNt1EVqbW2kORVk= -k8s.io/apiextensions-apiserver v0.21.4 h1:HkajN/vmT/9HnFmUxvpXfSGkTCvH/ax4e3+j6mqWUDU= k8s.io/apiextensions-apiserver v0.21.4/go.mod h1:OoC8LhI9LnV+wKjZkXIBbLUwtnOGJiTRE33qctH5CIk= +k8s.io/apiextensions-apiserver v0.22.2/go.mod h1:2E0Ve/isxNl7tWLSUDgi6+cmwHi5fQRdwGVCxbC+KFA= +k8s.io/apiextensions-apiserver v0.22.4 h1:2iGpcVyw4MnAyyXVJU2Xg6ZsbIxAOfRHo0LF5A5J0RA= +k8s.io/apiextensions-apiserver v0.22.4/go.mod h1:kH9lxD8dbJ+k0ZizGET55lFgdGjO8t45fgZnCVdZEpw= k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= k8s.io/apimachinery v0.16.4/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.21.4 h1:KDq0lWZVslHkuE5I7iGAQHwpK0aDTlar1E7IWEc4CNw= k8s.io/apimachinery v0.21.4/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= +k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.4 h1:9uwcvPpukBw/Ri0EUmWz+49cnFtaoiyEhQTK+xOe7Ck= +k8s.io/apimachinery v0.22.4/go.mod h1:yU6oA6Gnax9RrxGzVvPFFJ+mpnW6PBSqp0sx0I0HHW0= k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= k8s.io/apiserver v0.16.4/go.mod h1:kbLJOak655g6W7C+muqu1F76u9wnEycfKMqbVaXIdAc= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= k8s.io/apiserver v0.21.4/go.mod h1:SErUuFBBPZUcD2nsUU8hItxoYheqyYr2o/pCINEPW8g= -k8s.io/cli-runtime v0.21.1 h1:Oj/iZxa7LLXrhzShaLNF4rFJEIEBTDHj0dJw4ra2vX4= -k8s.io/cli-runtime v0.21.1/go.mod h1:TI9Bvl8lQWZB2KqE91QLCp9AZE4l29zNFnj/x4IX4Fw= +k8s.io/apiserver v0.22.2/go.mod h1:vrpMmbyjWrgdyOvZTSpsusQq5iigKNWv9o9KlDAbBHI= +k8s.io/apiserver v0.22.4/go.mod h1:38WmcUZiiy41A7Aty8/VorWRa8vDGqoUzDf2XYlku0E= +k8s.io/cli-runtime v0.22.4 h1:uFSVSdW14JP53BCtMRsw1hB9ba21TBuUb5m7RvEsH0Y= +k8s.io/cli-runtime v0.22.4/go.mod h1:x35r0ERHXr/MrbR1C6MPJxQ3xKG6+hXi9m2xLzlMPZA= k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90/go.mod h1:J69/JveO6XESwVgG53q3Uz5OSfgsv4uxpScmmyYOOlk= k8s.io/client-go v0.16.4/go.mod h1:ZgxhFDxSnoKY0J0U2/Y1C8obKDdlhGPZwA7oHH863Ok= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.21.4 h1:tcwj167If+v+pIGrCjaPG7hFo6SqFPFCCgMJy+Vm8Jc= k8s.io/client-go v0.21.4/go.mod h1:t0/eMKyUAq/DoQ7vW8NVVA00/nomlwC+eInsS8PxSew= +k8s.io/client-go v0.22.2/go.mod h1:sAlhrkVDf50ZHx6z4K0S40wISNTarf1r800F+RlCF6U= +k8s.io/client-go v0.22.4 h1:aAQ1Wk+I3bjCNk35YWUqbaueqrIonkfDPJSPDDe8Kfg= +k8s.io/client-go v0.22.4/go.mod h1:Yzw4e5e7h1LNHA4uqnMVrpEpUs1hJOiuBsJKIlRCHDA= k8s.io/cloud-provider v0.21.0 h1:NSTS+czpv6LQAaIpY/VUghsT4oj62hYmQPErkDKTzKU= k8s.io/cloud-provider v0.21.0/go.mod h1:z17TQgu3JgUFjcgby8sj5X86YdVK5Pbt+jm/eYMZU9M= k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= k8s.io/code-generator v0.16.4/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/code-generator v0.21.4/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo= +k8s.io/code-generator v0.22.2/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= +k8s.io/code-generator v0.22.4/go.mod h1:qjYl54pQ/emhkT0UxbufbREYJMWsHNNV/jSVwhYZQGw= k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= k8s.io/component-base v0.16.4/go.mod h1:GYQ+4hlkEwdlpAp59Ztc4gYuFhdoZqiAJD1unYDJ3FM= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= -k8s.io/component-base v0.21.4 h1:Bc0AttSyhJFVXEIHz+VX+D11j/5z7SPPhl6whiXaRzs= k8s.io/component-base v0.21.4/go.mod h1:ZKG0eHVX+tUDcaoIGpU3Vtk4TIjMddN9uhEWDmW6Nyg= +k8s.io/component-base v0.22.2/go.mod h1:5Br2QhI9OTe79p+TzPe9JKNQYvEKbq9rTJDWllunGug= +k8s.io/component-base v0.22.4 h1:7qwLJnua2ppGNZrRGDQ0vhsFebI39VGbZ4zdR5ArViI= +k8s.io/component-base v0.22.4/go.mod h1:MrSaQy4a3tFVViff8TZL6JHYSewNCLshZCwHYM58v5A= k8s.io/controller-manager v0.21.0/go.mod h1:Ohy0GRNRKPVjB8C8G+dV+4aPn26m8HYUI6ejloUBvUA= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= k8s.io/csi-translation-lib v0.21.0/go.mod h1:edq+UMpgqEx3roTuGF/03uIuSOsI986jtu65+ytLlkA= @@ -2542,6 +2542,7 @@ k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210203185629-de9496dff47b/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/helm v2.11.0+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= @@ -2555,14 +2556,18 @@ k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKf k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= +k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/legacy-cloud-providers v0.21.0 h1:iWf5xaX9yvYT5mkz8UB96UtISQ5IkrWeuMPMhRp01ZY= k8s.io/legacy-cloud-providers v0.21.0/go.mod h1:bNxo7gDg+PGkBmT/MFZswLTWdSWK9kAlS1s8DJca5q4= k8s.io/metrics v0.16.4/go.mod h1:dckkfqvaASo+NrzEmp8ST8yCc9hGt7lx9ABAILyDHx8= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= knative.dev/hack v0.0.0-20210806075220-815cd312d65c/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI= @@ -2580,16 +2585,17 @@ pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= 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/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.8.1 h1:O0K2CJ2JavK8/Tf4LfcpAwRxOFBhv8DjyrbmE6Qw59s= -sigs.k8s.io/controller-runtime v0.8.1/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= +sigs.k8s.io/controller-runtime v0.10.3 h1:s5Ttmw/B4AuIbwrXD3sfBkXwnPMMWrqpVj4WRt1dano= +sigs.k8s.io/controller-runtime v0.10.3/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY= sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= -sigs.k8s.io/kustomize/api v0.8.8 h1:G2z6JPSSjtWWgMeWSoHdXqyftJNmMmyxXpwENGoOtGE= -sigs.k8s.io/kustomize/api v0.8.8/go.mod h1:He1zoK0nk43Pc6NlV085xDXDXTNprtcyKZVm3swsdNY= -sigs.k8s.io/kustomize/kyaml v0.10.17 h1:4zrV0ym5AYa0e512q7K3Wp1u7mzoWW0xR3UHJcGWGIg= -sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= +sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= +sigs.k8s.io/kustomize/api v0.10.1 h1:KgU7hfYoscuqag84kxtzKdEC3mKMb99DPI3a0eaV1d0= +sigs.k8s.io/kustomize/api v0.10.1/go.mod h1:2FigT1QN6xKdcnGS2Ppp1uIWrtWN28Ms8A3OZUZhwr8= +sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= +sigs.k8s.io/kustomize/kyaml v0.13.0 h1:9c+ETyNfSrVhxvphs+K2dzT3dh5oVPPEqPOE/cUpScY= +sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLCK30D47m4E= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/structured-merge-diff v1.0.1 h1:LOs1LZWMsz1xs77Phr/pkB4LFaavH7IVq/3+WTN9XTA= diff --git a/pkg/engine/jmespath/arithmetic.go b/pkg/engine/jmespath/arithmetic.go new file mode 100644 index 0000000000..8e3740ef4f --- /dev/null +++ b/pkg/engine/jmespath/arithmetic.go @@ -0,0 +1,426 @@ +package jmespath + +import ( + "fmt" + "math" + "reflect" + "time" + + "gopkg.in/inf.v0" + "k8s.io/apimachinery/pkg/api/resource" +) + +type Operand interface { + Add(interface{}) (interface{}, error) + Subtract(interface{}) (interface{}, error) + Multiply(interface{}) (interface{}, error) + Divide(interface{}) (interface{}, error) + Modulo(interface{}) (interface{}, error) +} + +type Quantity struct { + resource.Quantity +} + +type Duration struct { + time.Duration +} + +type Scalar struct { + float64 +} + +func ParseArithemticOperands(arguments []interface{}, operator string) (Operand, Operand, error) { + op := [2]Operand{nil, nil} + t := [2]int{0, 0} + + for i := 0; i < 2; i++ { + tmp, err := validateArg(divide, arguments, i, reflect.Float64) + if err == nil { + var sc Scalar + sc.float64 = tmp.Float() + op[i] = sc + } + + tmp, err = validateArg(divide, arguments, i, reflect.String) + if err == nil { + var q Quantity + q.Quantity, err = resource.ParseQuantity(tmp.String()) + if err == nil { + op[i] = q + t[i] = 1 + } else { + var d Duration + d.Duration, err = time.ParseDuration(tmp.String()) + if err == nil { + op[i] = d + t[i] = 2 + } + } + } + } + + if op[0] == nil || op[1] == nil || t[0]|t[1] == 3 { + return nil, nil, fmt.Errorf(genericError, operator, "invalid operands") + } + + return op[0], op[1], nil +} + +func (op1 Quantity) Add(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Quantity: + op1.Quantity.Add(v.Quantity) + return op1.String(), nil + case Scalar: + q, err := resource.ParseQuantity(fmt.Sprintf("%v", v.float64)) + if err != nil { + return nil, err + } + op1.Quantity.Add(q) + return op1.String(), nil + } + + return nil, nil +} + +func (op1 Duration) Add(op2 interface{}) (interface{}, error) { + var sum int64 + + switch v := op2.(type) { + case Duration: + sum = op1.Nanoseconds() + v.Nanoseconds() + case Scalar: + // Converting the duration to nanoseconds for more precision + sum = op1.Nanoseconds() + int64(v.float64*math.Pow10(9)) + } + + res, err := time.ParseDuration(fmt.Sprintf("%vns", sum)) + if err != nil { + return nil, err + } + + return res.String(), nil +} + +func (op1 Scalar) Add(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Scalar: + return op1.float64 + v.float64, nil + case Quantity: + return v.Add(op1) + case Duration: + return v.Add(op1) + } + + return nil, nil +} + +func (op1 Quantity) Subtract(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Quantity: + op1.Quantity.Sub(v.Quantity) + return op1.String(), nil + case Scalar: + q, err := resource.ParseQuantity(fmt.Sprintf("%v", v.float64)) + if err != nil { + return nil, err + } + op1.Quantity.Sub(q) + return op1.String(), nil + } + + return nil, nil +} + +func (op1 Duration) Subtract(op2 interface{}) (interface{}, error) { + var diff int64 + + switch v := op2.(type) { + case Duration: + diff = op1.Nanoseconds() - v.Nanoseconds() + case Scalar: + // Converting the duration to nanoseconds for more precision + diff = op1.Nanoseconds() - int64(v.float64*math.Pow10(9)) + } + + res, err := time.ParseDuration(fmt.Sprintf("%vns", diff)) + if err != nil { + return nil, err + } + + return res.String(), nil +} + +func (op1 Scalar) Subtract(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Scalar: + return op1.float64 - v.float64, nil + case Quantity: + v.Neg() + return v.Add(op1) + case Duration: + // Converting the duration to nanoseconds for more precision + diff := int64(op1.float64*math.Pow10(9)) - v.Nanoseconds() + res, err := time.ParseDuration(fmt.Sprintf("%vns", diff)) + if err != nil { + return nil, err + } + + return res.String(), nil + } + + return nil, nil +} + +func (op1 Quantity) Multiply(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Quantity: + var prod inf.Dec + prod.Mul(op1.Quantity.AsDec(), v.Quantity.AsDec()) + return resource.NewDecimalQuantity(prod, v.Quantity.Format).String(), nil + case Scalar: + q, err := resource.ParseQuantity(fmt.Sprintf("%v", v.float64)) + if err != nil { + return nil, err + } + var prod inf.Dec + prod.Mul(op1.Quantity.AsDec(), q.AsDec()) + return resource.NewDecimalQuantity(prod, op1.Quantity.Format).String(), nil + } + + return nil, nil +} + +func (op1 Duration) Multiply(op2 interface{}) (interface{}, error) { + var prod float64 + + switch v := op2.(type) { + case Duration: + prod = op1.Seconds() * v.Seconds() + case Scalar: + prod = op1.Seconds() * v.float64 + } + + res, err := time.ParseDuration(fmt.Sprintf("%.9fs", prod)) + if err != nil { + return nil, err + } + + return res.String(), nil +} + +func (op1 Scalar) Multiply(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Scalar: + return op1.float64 * v.float64, nil + case Quantity: + return v.Multiply(op1) + case Duration: + return v.Multiply(op1) + } + + return nil, nil +} + +func (op1 Quantity) Divide(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Quantity: + var quo inf.Dec + scale := inf.Scale(math.Max(float64(op1.AsDec().Scale()), float64(v.AsDec().Scale()))) + quo.QuoRound(op1.AsDec(), v.AsDec(), scale, inf.RoundDown) + return resource.NewDecimalQuantity(quo, v.Quantity.Format).String(), nil + case Scalar: + q, err := resource.ParseQuantity(fmt.Sprintf("%v", v.float64)) + if err != nil { + return nil, err + } + + var quo inf.Dec + scale := inf.Scale(math.Max(float64(op1.AsDec().Scale()), float64(q.AsDec().Scale()))) + quo.QuoRound(op1.AsDec(), q.AsDec(), scale, inf.RoundDown) + return resource.NewDecimalQuantity(quo, op1.Quantity.Format).String(), nil + } + + return nil, nil +} + +func (op1 Duration) Divide(op2 interface{}) (interface{}, error) { + var quo float64 + + switch v := op2.(type) { + case Duration: + if v.Seconds() == 0 { + return nil, fmt.Errorf(undefinedQuoError, divide) + } + + quo = op1.Seconds() / v.Seconds() + case Scalar: + if v.float64 == 0 { + return nil, fmt.Errorf(undefinedQuoError, divide) + } + + quo = op1.Seconds() / v.float64 + } + + res, err := time.ParseDuration(fmt.Sprintf("%.9fs", quo)) + if err != nil { + return nil, err + } + + return res.String(), nil +} + +func (op1 Scalar) Divide(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Scalar: + if v.float64 == 0 { + return nil, fmt.Errorf(zeroDivisionError, divide) + } + + return op1.float64 / v.float64, nil + case Quantity: + q, err := resource.ParseQuantity(fmt.Sprintf("%v", op1.float64)) + if err != nil { + return nil, err + } + + var quo inf.Dec + scale := inf.Scale(math.Max(float64(q.AsDec().Scale()), float64(v.AsDec().Scale()))) + quo.QuoRound(q.AsDec(), v.AsDec(), scale, inf.RoundDown) + + return resource.NewDecimalQuantity(quo, v.Format).String(), nil + case Duration: + var quo float64 + if op1.float64 == 0 { + return nil, fmt.Errorf(undefinedQuoError, divide) + } + + quo = op1.float64 / v.Seconds() + + res, err := time.ParseDuration(fmt.Sprintf("%.9fs", quo)) + if err != nil { + return nil, err + } + + return res.String(), nil + } + + return nil, nil +} + +func (op1 Quantity) Modulo(op2 interface{}) (interface{}, error) { + quo, err := op1.Divide(op2) + if err != nil { + return nil, err + } + + x, err := resource.ParseQuantity(quo.(string)) + if err != nil { + return nil, err + } + + mul, err := op2.(Operand).Multiply(Quantity{x}) + if err != nil { + return nil, err + } + + y, err := resource.ParseQuantity(mul.(string)) + if err != nil { + return nil, err + } + + return op1.Subtract(Quantity{y}) +} + +func (op1 Duration) Modulo(op2 interface{}) (interface{}, error) { + quo, err := op1.Divide(op2) + if err != nil { + return nil, err + } + + x, err := time.ParseDuration(quo.(string)) + if err != nil { + return nil, err + } + x = x.Truncate(time.Second) + + mul, err := op2.(Operand).Multiply(Duration{x}) + if err != nil { + return nil, err + } + y, err := time.ParseDuration(mul.(string)) + if err != nil { + return nil, err + } + + return op1.Subtract(Duration{y}) +} + +func (op1 Scalar) Modulo(op2 interface{}) (interface{}, error) { + switch v := op2.(type) { + case Scalar: + val1 := int64(op1.float64) + val2 := int64(v.float64) + + if op1.float64 != float64(val1) { + return nil, fmt.Errorf(nonIntModuloError, modulo) + } + + if v.float64 != float64(val2) { + return nil, fmt.Errorf(nonIntModuloError, modulo) + } + + if val2 == 0 { + return nil, fmt.Errorf(zeroDivisionError, modulo) + } + + return float64(val1 % val2), nil + case Quantity: + quo, err := op1.Divide(op2) + if err != nil { + return nil, err + } + + x, err := resource.ParseQuantity(quo.(string)) + if err != nil { + return nil, err + } + + mul, err := op2.(Operand).Multiply(Quantity{x}) + if err != nil { + return nil, err + } + + y, err := resource.ParseQuantity(mul.(string)) + if err != nil { + return nil, err + } + + return op1.Subtract(Quantity{y}) + case Duration: + quo, err := op1.Divide(op2) + if err != nil { + return nil, err + } + + x, err := time.ParseDuration(quo.(string)) + if err != nil { + return nil, err + } + x = x.Truncate(time.Second) + + mul, err := op2.(Operand).Multiply(Duration{x}) + if err != nil { + return nil, err + } + y, err := time.ParseDuration(mul.(string)) + if err != nil { + return nil, err + } + + return op1.Subtract(Duration{y}) + } + + return nil, nil +} diff --git a/pkg/engine/jmespath/functions.go b/pkg/engine/jmespath/functions.go index 2642d2df92..7c8c699de9 100644 --- a/pkg/engine/jmespath/functions.go +++ b/pkg/engine/jmespath/functions.go @@ -21,6 +21,7 @@ var ( JpNumber = gojmespath.JpNumber JpArray = gojmespath.JpArray JpArrayString = gojmespath.JpArrayString + JpAny = gojmespath.JpAny ) type ( @@ -58,6 +59,7 @@ const errorPrefix = "JMESPath function '%s': " const invalidArgumentTypeError = errorPrefix + "%d argument is expected of %s type" const genericError = errorPrefix + "%s" const zeroDivisionError = errorPrefix + "Zero divisor passed" +const undefinedQuoError = errorPrefix + "Undefined quotient" const nonIntModuloError = errorPrefix + "Non-integer argument(s) passed for modulo" func getFunctions() []*gojmespath.FunctionEntry { @@ -173,40 +175,40 @@ func getFunctions() []*gojmespath.FunctionEntry { { Name: add, Arguments: []ArgSpec{ - {Types: []JpType{JpNumber}}, - {Types: []JpType{JpNumber}}, + {Types: []JpType{JpAny}}, + {Types: []JpType{JpAny}}, }, Handler: jpAdd, }, { Name: subtract, Arguments: []ArgSpec{ - {Types: []JpType{JpNumber}}, - {Types: []JpType{JpNumber}}, + {Types: []JpType{JpAny}}, + {Types: []JpType{JpAny}}, }, Handler: jpSubtract, }, { Name: multiply, Arguments: []ArgSpec{ - {Types: []JpType{JpNumber}}, - {Types: []JpType{JpNumber}}, + {Types: []JpType{JpAny}}, + {Types: []JpType{JpAny}}, }, Handler: jpMultiply, }, { Name: divide, Arguments: []ArgSpec{ - {Types: []JpType{JpNumber}}, - {Types: []JpType{JpNumber}}, + {Types: []JpType{JpAny}}, + {Types: []JpType{JpAny}}, }, Handler: jpDivide, }, { Name: modulo, Arguments: []ArgSpec{ - {Types: []JpType{JpNumber}}, - {Types: []JpType{JpNumber}}, + {Types: []JpType{JpAny}}, + {Types: []JpType{JpAny}}, }, Handler: jpModulo, }, @@ -476,97 +478,48 @@ func jpLabelMatch(arguments []interface{}) (interface{}, error) { } func jpAdd(arguments []interface{}) (interface{}, error) { - var err error - op1, err := validateArg(divide, arguments, 0, reflect.Float64) + op1, op2, err := ParseArithemticOperands(arguments, add) if err != nil { return nil, err } - op2, err := validateArg(divide, arguments, 1, reflect.Float64) - if err != nil { - return nil, err - } - - return op1.Float() + op2.Float(), nil + return op1.Add(op2) } func jpSubtract(arguments []interface{}) (interface{}, error) { - var err error - op1, err := validateArg(divide, arguments, 0, reflect.Float64) + op1, op2, err := ParseArithemticOperands(arguments, subtract) if err != nil { return nil, err } - op2, err := validateArg(divide, arguments, 1, reflect.Float64) - if err != nil { - return nil, err - } - - return op1.Float() - op2.Float(), nil + return op1.Subtract(op2) } func jpMultiply(arguments []interface{}) (interface{}, error) { - var err error - op1, err := validateArg(divide, arguments, 0, reflect.Float64) + op1, op2, err := ParseArithemticOperands(arguments, multiply) if err != nil { return nil, err } - op2, err := validateArg(divide, arguments, 1, reflect.Float64) - if err != nil { - return nil, err - } - - return op1.Float() * op2.Float(), nil + return op1.Multiply(op2) } func jpDivide(arguments []interface{}) (interface{}, error) { - var err error - op1, err := validateArg(divide, arguments, 0, reflect.Float64) + op1, op2, err := ParseArithemticOperands(arguments, divide) if err != nil { return nil, err } - op2, err := validateArg(divide, arguments, 1, reflect.Float64) - if err != nil { - return nil, err - } - - if op2.Float() == 0 { - return nil, fmt.Errorf(zeroDivisionError, divide) - } - - return op1.Float() / op2.Float(), nil + return op1.Divide(op2) } func jpModulo(arguments []interface{}) (interface{}, error) { - var err error - op1, err := validateArg(divide, arguments, 0, reflect.Float64) + op1, op2, err := ParseArithemticOperands(arguments, modulo) if err != nil { return nil, err } - op2, err := validateArg(divide, arguments, 1, reflect.Float64) - if err != nil { - return nil, err - } - - val1 := int64(op1.Float()) - val2 := int64(op2.Float()) - - if op1.Float() != float64(val1) { - return nil, fmt.Errorf(nonIntModuloError, modulo) - } - - if op2.Float() != float64(val2) { - return nil, fmt.Errorf(nonIntModuloError, modulo) - } - - if val2 == 0 { - return nil, fmt.Errorf(zeroDivisionError, modulo) - } - - return val1 % val2, nil + return op1.Modulo(op2) } func jpBase64Decode(arguments []interface{}) (interface{}, error) { diff --git a/pkg/engine/jmespath/functions_test.go b/pkg/engine/jmespath/functions_test.go index 03d014501b..f984c22288 100644 --- a/pkg/engine/jmespath/functions_test.go +++ b/pkg/engine/jmespath/functions_test.go @@ -415,63 +415,395 @@ func Test_LabelMatch(t *testing.T) { } func Test_Add(t *testing.T) { - jp, err := New("add(`12`, `13`)") - assert.NilError(t, err) + testCases := []struct { + test string + expectedResult interface{} + err bool + retFloat bool + }{ + { + test: "add('12', '13s')", + err: true, + }, + { + test: "add('12Ki', '13s')", + err: true, + }, + { + test: "add('12s', '13')", + err: true, + }, + { + test: "add('12s', '13Ki')", + err: true, + }, + { + test: "add(`12`, `13`)", + expectedResult: 25.0, + retFloat: true, + }, + { + test: "add(`12`, '13s')", + expectedResult: `25s`, + }, + { + test: "add('12s', '13s')", + expectedResult: `25s`, + }, + { + test: "add(`12`, '-13s')", + expectedResult: `-1s`, + }, + { + test: "add(`12`, '13Ki')", + expectedResult: `13324`, + }, + { + test: "add('12Ki', '13Ki')", + expectedResult: `25Ki`, + }, + } - result, err := jp.Search("") - assert.NilError(t, err) + for i, tc := range testCases { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + jp, err := New(tc.test) + assert.NilError(t, err) - equal, ok := result.(float64) - assert.Assert(t, ok) - assert.Equal(t, equal, 25.0) + result, err := jp.Search("") + if !tc.err { + assert.NilError(t, err) + } else { + assert.Assert(t, err != nil) + return + } + + if tc.retFloat { + equal, ok := result.(float64) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(float64)) + } else { + equal, ok := result.(string) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(string)) + } + }) + } } func Test_Subtract(t *testing.T) { - jp, err := New("subtract(`12`, `7`)") - assert.NilError(t, err) + testCases := []struct { + test string + expectedResult interface{} + err bool + retFloat bool + }{ + { + test: "subtract('12', '13s')", + err: true, + }, + { + test: "subtract('12Ki', '13s')", + err: true, + }, + { + test: "subtract('12s', '13')", + err: true, + }, + { + test: "subtract('12s', '13Ki')", + err: true, + }, + { + test: "subtract(`12`, `13`)", + expectedResult: -1.0, + retFloat: true, + }, + { + test: "subtract(`12`, '13s')", + expectedResult: `-1s`, + }, + { + test: "subtract('12s', '13s')", + expectedResult: `-1s`, + }, + { + test: "subtract(`12`, '-13s')", + expectedResult: `25s`, + }, + { + test: "subtract(`12`, '13Ki')", + expectedResult: `-13300`, + }, + { + test: "subtract('12Ki', '13Ki')", + expectedResult: `-1Ki`, + }, + } - result, err := jp.Search("") - assert.NilError(t, err) + for i, tc := range testCases { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + jp, err := New(tc.test) + assert.NilError(t, err) - equal, ok := result.(float64) - assert.Assert(t, ok) - assert.Equal(t, equal, 5.0) + result, err := jp.Search("") + if !tc.err { + assert.NilError(t, err) + } else { + assert.Assert(t, err != nil) + return + } + + if tc.retFloat { + equal, ok := result.(float64) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(float64)) + } else { + equal, ok := result.(string) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(string)) + } + }) + } } func Test_Multiply(t *testing.T) { - jp, err := New("multiply(`3`, `2.5`)") - assert.NilError(t, err) + testCases := []struct { + test string + expectedResult interface{} + err bool + retFloat bool + }{ + { + test: "multiply('12', '13s')", + err: true, + }, + { + test: "multiply('12Ki', '13s')", + err: true, + }, + { + test: "multiply('12s', '13')", + err: true, + }, + { + test: "multiply('12s', '13Ki')", + err: true, + }, + { + test: "multiply(`12`, `13`)", + expectedResult: 156.0, + retFloat: true, + }, + { + test: "multiply(`12`, '13s')", + expectedResult: `2m36s`, + }, + { + test: "multiply('12s', '13s')", + expectedResult: `2m36s`, + }, + { + test: "multiply(`12`, '-13s')", + expectedResult: `-2m36s`, + }, + { + test: "multiply(`12`, '13Ki')", + expectedResult: `156Ki`, + }, + { + test: "multiply('12Ki', '13Ki')", + expectedResult: `156Mi`, + }, + } - result, err := jp.Search("") - assert.NilError(t, err) + for i, tc := range testCases { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + jp, err := New(tc.test) + assert.NilError(t, err) - equal, ok := result.(float64) - assert.Assert(t, ok) - assert.Equal(t, equal, 7.5) + result, err := jp.Search("") + if !tc.err { + assert.NilError(t, err) + } else { + assert.Assert(t, err != nil) + return + } + + if tc.retFloat { + equal, ok := result.(float64) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(float64)) + } else { + equal, ok := result.(string) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(string)) + } + }) + } } func Test_Divide(t *testing.T) { - jp, err := New("divide(`12`, `1.5`)") - assert.NilError(t, err) + testCases := []struct { + test string + expectedResult interface{} + err bool + retFloat bool + }{ + { + test: "divide('12', '13s')", + err: true, + }, + { + test: "divide('12Ki', '13s')", + err: true, + }, + { + test: "divide('12s', '13')", + err: true, + }, + { + test: "divide('12s', '13Ki')", + err: true, + }, + { + test: "divide('12s', `0`)", + err: true, + }, + { + test: "divide(`25`, `2`)", + expectedResult: 12.5, + retFloat: true, + }, + { + test: "divide(`12`, '2s')", + expectedResult: `6s`, + }, + { + test: "divide('25m0s', '2s')", + expectedResult: `12m30s`, + }, + { + test: "divide(`360`, '-2s')", + expectedResult: `-3m0s`, + }, + { + test: "divide(`13312`, '1Ki')", + expectedResult: `13`, + }, + { + test: "divide('26Gi', '13Ki')", + expectedResult: `2Mi`, + }, + { + test: "divide('500m', `2`)", + expectedResult: `250m`, + }, + } - result, err := jp.Search("") - assert.NilError(t, err) + for i, tc := range testCases { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + jp, err := New(tc.test) + assert.NilError(t, err) - equal, ok := result.(float64) - assert.Assert(t, ok) - assert.Equal(t, equal, 8.0) + result, err := jp.Search("") + if !tc.err { + assert.NilError(t, err) + } else { + assert.Assert(t, err != nil) + return + } + + if tc.retFloat { + equal, ok := result.(float64) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(float64)) + } else { + equal, ok := result.(string) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(string)) + } + }) + } } func Test_Modulo(t *testing.T) { - jp, err := New("modulo(`12`, `7`)") - assert.NilError(t, err) + testCases := []struct { + test string + expectedResult interface{} + err bool + retFloat bool + }{ + { + test: "modulo('12', '13s')", + err: true, + }, + { + test: "modulo('12Ki', '13s')", + err: true, + }, + { + test: "modulo('12s', '13')", + err: true, + }, + { + test: "modulo('12s', '13Ki')", + err: true, + }, + { + test: "modulo('12s', `0`)", + err: true, + }, + { + test: "modulo(`25`, `2`)", + expectedResult: 1.0, + retFloat: true, + }, + { + test: "modulo(`13`, '2s')", + expectedResult: `1s`, + }, + { + test: "modulo('25m13s', '32s')", + expectedResult: `9s`, + }, + { + test: "modulo(`371`, '-13s')", + expectedResult: `7s`, + }, + { + test: "modulo(`13312`, '513')", + expectedResult: `487`, + }, + { + test: "modulo('26Gi', '12Ki')", + expectedResult: `8Ki`, + }, + } - result, err := jp.Search("") - assert.NilError(t, err) + for i, tc := range testCases { + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + jp, err := New(tc.test) + assert.NilError(t, err) - equal, ok := result.(int64) - assert.Assert(t, ok) - assert.Equal(t, equal, int64(5)) + result, err := jp.Search("") + if !tc.err { + assert.NilError(t, err) + } else { + assert.Assert(t, err != nil) + return + } + + if tc.retFloat { + equal, ok := result.(float64) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(float64)) + } else { + equal, ok := result.(string) + assert.Assert(t, ok) + assert.Equal(t, equal, tc.expectedResult.(string)) + } + }) + } } func Test_Base64Decode(t *testing.T) {