mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-29 02:45:06 +00:00
JMESPath arithmetic function units (#2753)
* MAS arithmetic functions Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Adding Divide() and Modulo() Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Added tests Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Tidy go.mod Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Fix lift issues Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Set division scale to maximum of operands Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Precision for Add()/Subtract() Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Set duration precision Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> * Added comment for duration diff calculation Signed-off-by: Kumar Mallikarjuna <kumarmallikarjuna1@gmail.com> Co-authored-by: Bricktop <marcel.mueller1@rwth-aachen.de>
This commit is contained in:
parent
081dd97cc3
commit
a667a69812
5 changed files with 882 additions and 160 deletions
27
go.mod
27
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
|
||||
|
|
96
go.sum
96
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=
|
||||
|
|
426
pkg/engine/jmespath/arithmetic.go
Normal file
426
pkg/engine/jmespath/arithmetic.go
Normal file
|
@ -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
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue