Upgrade dependent version: github.com/open-policy-agent/opa (#5315)
Upgrade dependent version: github.com/open-policy-agent/opa v0.18.0 -> v0.45.0 Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io> Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io>
This commit is contained in:
25
LICENSES/vendor/github.com/agnivade/levenshtein/LICENSE
generated
vendored
Normal file
25
LICENSES/vendor/github.com/agnivade/levenshtein/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
= vendor/github.com/agnivade/levenshtein licensed under: =
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Agniva De Sarker
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
= vendor/github.com/agnivade/levenshtein/License.txt 911630ea868cb9d6ca549532110fd8fd
|
||||
26
LICENSES/vendor/github.com/oliveagle/jsonpath/LICENSE
generated
vendored
Normal file
26
LICENSES/vendor/github.com/oliveagle/jsonpath/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
= vendor/github.com/oliveagle/jsonpath licensed under: =
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 oliver
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
= vendor/github.com/oliveagle/jsonpath/LICENSE 78f894d17511bba21976873c9b4bffc3
|
||||
205
LICENSES/vendor/github.com/opensearch-project/opensearch-go/LICENSE
generated
vendored
Normal file
205
LICENSES/vendor/github.com/opensearch-project/opensearch-go/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,205 @@
|
||||
= vendor/github.com/opensearch-project/opensearch-go licensed under: =
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
= vendor/github.com/opensearch-project/opensearch-go/LICENSE.txt 86d3f3a95c324c9479bd8986968f4327
|
||||
2
LICENSES/vendor/github.com/opensearch-project/opensearch-go/v2/LICENSE
generated
vendored
2
LICENSES/vendor/github.com/opensearch-project/opensearch-go/v2/LICENSE
generated
vendored
@@ -202,4 +202,4 @@
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
= vendor/github.com/opensearch-project/opensearch-go/v2/LICENSE.txt 86d3f3a95c324c9479bd8986968f4327
|
||||
= vendor/github.com/opensearch-project/opensearch-go/LICENSE.txt 86d3f3a95c324c9479bd8986968f4327
|
||||
|
||||
24
LICENSES/vendor/github.com/tchap/go-patricia/v2/LICENSE
generated
vendored
Normal file
24
LICENSES/vendor/github.com/tchap/go-patricia/v2/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
= vendor/github.com/tchap/go-patricia/v2 licensed under: =
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 The AUTHORS
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
= vendor/github.com/tchap/go-patricia/v2/LICENSE 9949b99212edd6b1e24ce702376c3baf
|
||||
135
go.mod
135
go.mod
@@ -13,13 +13,13 @@ require (
|
||||
github.com/Masterminds/semver/v3 v3.1.1
|
||||
github.com/PuerkitoBio/goquery v1.5.0
|
||||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535
|
||||
github.com/aws/aws-sdk-go v1.42.27
|
||||
github.com/aws/aws-sdk-go v1.43.16
|
||||
github.com/beevik/etree v1.1.0
|
||||
github.com/containernetworking/cni v0.8.0
|
||||
github.com/coreos/go-oidc v2.1.0+incompatible
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
github.com/docker/distribution v2.7.1+incompatible
|
||||
github.com/docker/docker v20.10.7+incompatible
|
||||
github.com/docker/docker v20.10.17+incompatible
|
||||
github.com/elastic/go-elasticsearch/v5 v5.6.1
|
||||
github.com/elastic/go-elasticsearch/v6 v6.8.2
|
||||
github.com/elastic/go-elasticsearch/v7 v7.3.0
|
||||
@@ -28,17 +28,17 @@ require (
|
||||
github.com/evanphx/json-patch v4.11.0+incompatible
|
||||
github.com/fatih/structs v1.1.0
|
||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible
|
||||
github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/fsnotify/fsnotify v1.5.4
|
||||
github.com/ghodss/yaml v1.0.0
|
||||
github.com/go-ldap/ldap v3.0.3+incompatible
|
||||
github.com/go-logr/logr v0.4.0
|
||||
github.com/go-logr/logr v1.2.3
|
||||
github.com/go-openapi/loads v0.19.5
|
||||
github.com/go-openapi/spec v0.19.8
|
||||
github.com/go-openapi/strfmt v0.19.5
|
||||
github.com/go-openapi/validate v0.19.8
|
||||
github.com/go-redis/redis v6.15.2+incompatible
|
||||
github.com/golang/example v0.0.0-20170904185048-46695d81d1fa
|
||||
github.com/google/go-cmp v0.5.6
|
||||
github.com/google/go-cmp v0.5.7
|
||||
github.com/google/go-containerregistry v0.6.0
|
||||
github.com/google/gops v0.3.23
|
||||
github.com/google/uuid v1.1.2
|
||||
@@ -51,9 +51,10 @@ require (
|
||||
github.com/kubesphere/sonargo v0.0.2
|
||||
github.com/kubesphere/storageclass-accessor v0.2.2
|
||||
github.com/mitchellh/mapstructure v1.2.2
|
||||
github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852
|
||||
github.com/onsi/ginkgo v1.16.4
|
||||
github.com/onsi/gomega v1.15.0
|
||||
github.com/open-policy-agent/opa v0.18.0
|
||||
github.com/open-policy-agent/opa v0.45.0
|
||||
github.com/opencontainers/go-digest v1.0.0
|
||||
github.com/opensearch-project/opensearch-go v1.1.0
|
||||
github.com/opensearch-project/opensearch-go/v2 v2.0.0
|
||||
@@ -64,23 +65,23 @@ require (
|
||||
github.com/prometheus-community/prom-label-proxy v0.2.0
|
||||
github.com/prometheus-operator/prometheus-operator v0.42.2-0.20200928114327-fbd01683839a
|
||||
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.42.1
|
||||
github.com/prometheus/client_golang v1.11.0
|
||||
github.com/prometheus/client_golang v1.13.0
|
||||
github.com/prometheus/common v0.37.0
|
||||
github.com/prometheus/prometheus v1.8.2-0.20200907175821-8219b442c864
|
||||
github.com/sony/sonyflake v0.0.0-20181109022403-6d5bd6181009
|
||||
github.com/speps/go-hashids v2.0.0+incompatible
|
||||
github.com/spf13/cobra v1.2.1
|
||||
github.com/spf13/cobra v1.5.0
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/spf13/viper v1.8.1
|
||||
github.com/stretchr/testify v1.7.0
|
||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
|
||||
google.golang.org/grpc v1.30.0
|
||||
github.com/stretchr/testify v1.8.0
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
|
||||
google.golang.org/grpc v1.49.0
|
||||
gopkg.in/cas.v2 v2.2.0
|
||||
gopkg.in/square/go-jose.v2 v2.4.0
|
||||
gopkg.in/src-d/go-git.v4 v4.13.1
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
gotest.tools v2.2.0+incompatible
|
||||
helm.sh/helm/v3 v3.6.3
|
||||
istio.io/api v0.0.0-20201113182140-d4b7e3fc2b44
|
||||
@@ -111,7 +112,7 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
|
||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
|
||||
github.com/BurntSushi/toml v0.3.1 // indirect
|
||||
github.com/MakeNowJust/heredoc v0.0.0-20171113091838-e9091a26100e // indirect
|
||||
github.com/Masterminds/goutils v1.1.0 // indirect
|
||||
@@ -120,31 +121,32 @@ require (
|
||||
github.com/Microsoft/go-winio v0.5.0 // indirect
|
||||
github.com/Microsoft/hcsshim v0.8.7 // indirect
|
||||
github.com/NYTimes/gziphandler v1.1.1 // indirect
|
||||
github.com/OneOfOne/xxhash v1.2.7 // indirect
|
||||
github.com/OneOfOne/xxhash v1.2.8 // indirect
|
||||
github.com/PuerkitoBio/purell v1.1.1 // indirect
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d // indirect
|
||||
github.com/agnivade/levenshtein v1.1.1 // indirect
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
|
||||
github.com/andybalholm/cascadia v1.0.0 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/blang/semver v3.5.1+incompatible // indirect
|
||||
github.com/bshuster-repo/logrus-logstash-hook v0.4.1 // indirect
|
||||
github.com/bshuster-repo/logrus-logstash-hook v1.0.0 // indirect
|
||||
github.com/bugsnag/bugsnag-go v1.5.0 // indirect
|
||||
github.com/bugsnag/panicwrap v1.2.0 // indirect
|
||||
github.com/cespare/xxhash v1.1.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.1 // indirect
|
||||
github.com/containerd/containerd v1.5.2 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||
github.com/containerd/containerd v1.6.8 // indirect
|
||||
github.com/coreos/go-semver v0.3.0 // indirect
|
||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.2.2 // indirect
|
||||
github.com/deckarep/golang-set v1.7.1 // indirect
|
||||
github.com/deislabs/oras v0.11.1 // indirect
|
||||
github.com/docker/cli v20.10.7+incompatible // indirect
|
||||
github.com/docker/docker-credential-helpers v0.6.3 // indirect
|
||||
github.com/docker/cli v20.10.17+incompatible // indirect
|
||||
github.com/docker/docker-credential-helpers v0.6.4 // indirect
|
||||
github.com/docker/go-connections v0.4.0 // indirect
|
||||
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 // indirect
|
||||
github.com/docker/go-metrics v0.0.1 // indirect
|
||||
github.com/docker/go-units v0.4.0 // indirect
|
||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
|
||||
github.com/edsrzf/mmap-go v1.0.0 // indirect
|
||||
@@ -166,19 +168,19 @@ require (
|
||||
github.com/go-stack/stack v1.8.0 // indirect
|
||||
github.com/gobuffalo/flect v0.2.3 // indirect
|
||||
github.com/gobwas/glob v0.2.3 // indirect
|
||||
github.com/gofrs/uuid v3.2.0+incompatible // indirect
|
||||
github.com/gofrs/uuid v4.0.0+incompatible // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
||||
github.com/golang/protobuf v1.4.3 // indirect
|
||||
github.com/golang/snappy v0.0.1 // indirect
|
||||
github.com/golang/glog v1.0.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/btree v1.0.0 // indirect
|
||||
github.com/google/go-querystring v1.0.0 // indirect
|
||||
github.com/google/gofuzz v1.1.0 // indirect
|
||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
|
||||
github.com/googleapis/gnostic v0.5.5 // indirect
|
||||
github.com/gorilla/handlers v1.4.0 // indirect
|
||||
github.com/gorilla/mux v1.7.3 // indirect
|
||||
github.com/gorilla/handlers v1.5.1 // indirect
|
||||
github.com/gorilla/mux v1.8.0 // indirect
|
||||
github.com/gosimple/slug v1.1.1 // indirect
|
||||
github.com/gosuri/uitable v0.0.4 // indirect
|
||||
github.com/grafana-tools/sdk v0.0.0-20210625151406-43693eb2f02b // indirect
|
||||
@@ -189,7 +191,7 @@ require (
|
||||
github.com/imdario/mergo v0.3.12 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||
github.com/jmespath/go-jmespath v0.3.0 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/jmoiron/sqlx v1.3.1 // indirect
|
||||
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e // indirect
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||
@@ -201,14 +203,14 @@ require (
|
||||
github.com/mailru/easyjson v0.7.1 // indirect
|
||||
github.com/mattn/go-colorable v0.1.6 // indirect
|
||||
github.com/mattn/go-isatty v0.0.12 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.4 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
||||
github.com/mitchellh/copystructure v1.1.1 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
|
||||
github.com/mitchellh/reflectwalk v1.0.0 // indirect
|
||||
github.com/moby/spdystream v0.2.0 // indirect
|
||||
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect
|
||||
github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
|
||||
@@ -217,8 +219,7 @@ require (
|
||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
||||
github.com/nxadm/tail v1.4.4 // indirect
|
||||
github.com/oklog/ulid v1.3.1 // indirect
|
||||
github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 // indirect
|
||||
github.com/opencontainers/image-spec v1.0.1 // indirect
|
||||
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
|
||||
github.com/opencontainers/runc v0.1.1 // indirect
|
||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||
github.com/operator-framework/operator-lib v0.3.0 // indirect
|
||||
@@ -226,31 +227,33 @@ require (
|
||||
github.com/pelletier/go-buffruneio v0.2.0 // indirect
|
||||
github.com/pelletier/go-toml v1.7.0 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021 // indirect
|
||||
github.com/prometheus/alertmanager v0.21.0 // indirect
|
||||
github.com/prometheus/client_model v0.2.0 // indirect
|
||||
github.com/prometheus/procfs v0.6.0 // indirect
|
||||
github.com/prometheus/procfs v0.8.0 // indirect
|
||||
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be // indirect
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a // indirect
|
||||
github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect
|
||||
github.com/robfig/cron/v3 v3.0.1 // indirect
|
||||
github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351 // indirect
|
||||
github.com/russross/blackfriday v1.5.2 // indirect
|
||||
github.com/sergi/go-diff v1.1.0 // indirect
|
||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
||||
github.com/spf13/afero v1.2.2 // indirect
|
||||
github.com/spf13/cast v1.3.0 // indirect
|
||||
github.com/spf13/jwalterweatherman v1.0.0 // indirect
|
||||
github.com/src-d/gcfg v1.4.0 // indirect
|
||||
github.com/tchap/go-patricia/v2 v2.3.1 // indirect
|
||||
github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect
|
||||
github.com/uber/jaeger-lib v2.2.0+incompatible // indirect
|
||||
github.com/xanzy/ssh-agent v0.2.1 // indirect
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||
github.com/xenolf/lego v0.3.2-0.20160613233155-a9d8cec0e656 // indirect
|
||||
github.com/xlab/treeprint v1.1.0 // indirect
|
||||
github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b // indirect
|
||||
github.com/yashtewari/glob-intersection v0.1.0 // indirect
|
||||
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 // indirect
|
||||
github.com/yvasiyarov/gorelic v0.0.6 // indirect
|
||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f // indirect
|
||||
@@ -262,18 +265,18 @@ require (
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee // indirect
|
||||
go.uber.org/zap v1.19.0 // indirect
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
|
||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect
|
||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
|
||||
golang.org/x/tools v0.1.10 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a // indirect
|
||||
google.golang.org/protobuf v1.26.0-rc.1 // indirect
|
||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
|
||||
gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect
|
||||
gopkg.in/gorp.v1 v1.7.2 // indirect
|
||||
@@ -306,6 +309,7 @@ replace (
|
||||
github.com/Azure/azure-sdk-for-go => github.com/Azure/azure-sdk-for-go v41.3.0+incompatible
|
||||
github.com/Azure/azure-storage-blob-go => github.com/Azure/azure-storage-blob-go v0.8.0
|
||||
github.com/Azure/go-ansiterm => github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78
|
||||
github.com/Azure/go-autorest => github.com/Azure/go-autorest v14.2.0+incompatible
|
||||
github.com/Azure/go-autorest/autorest => github.com/Azure/go-autorest/autorest v0.10.0
|
||||
github.com/Azure/go-autorest/autorest/adal => github.com/Azure/go-autorest/autorest/adal v0.8.3
|
||||
github.com/Azure/go-autorest/autorest/date => github.com/Azure/go-autorest/autorest/date v0.2.0
|
||||
@@ -369,6 +373,7 @@ replace (
|
||||
github.com/beorn7/perks => github.com/beorn7/perks v1.0.1
|
||||
github.com/bgentry/speakeasy => github.com/bgentry/speakeasy v0.1.0
|
||||
github.com/bitly/go-hostpool => github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932
|
||||
github.com/bitly/go-simplejson => github.com/bitly/go-simplejson v0.5.0
|
||||
github.com/blang/semver => github.com/blang/semver v3.5.0+incompatible
|
||||
github.com/blang/semver/v4 => github.com/blang/semver/v4 v4.0.0
|
||||
github.com/bmizerany/assert => github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869
|
||||
@@ -378,11 +383,14 @@ replace (
|
||||
github.com/brancz/kube-rbac-proxy => github.com/brancz/kube-rbac-proxy v0.5.0
|
||||
github.com/bshuster-repo/logrus-logstash-hook => github.com/bshuster-repo/logrus-logstash-hook v0.4.1
|
||||
github.com/bugsnag/bugsnag-go => github.com/bugsnag/bugsnag-go v1.5.0
|
||||
github.com/bugsnag/osext => github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b
|
||||
github.com/bugsnag/panicwrap => github.com/bugsnag/panicwrap v1.2.0
|
||||
github.com/bytecodealliance/wasmtime-go => github.com/bytecodealliance/wasmtime-go v1.0.0
|
||||
github.com/c-bata/go-prompt => github.com/c-bata/go-prompt v0.2.2
|
||||
github.com/campoy/embedmd => github.com/campoy/embedmd v1.0.0
|
||||
github.com/casbin/casbin/v2 => github.com/casbin/casbin/v2 v2.1.2
|
||||
github.com/cenkalti/backoff => github.com/cenkalti/backoff v2.2.1+incompatible
|
||||
github.com/cenkalti/backoff/v4 => github.com/cenkalti/backoff/v4 v4.1.3
|
||||
github.com/census-instrumentation/opencensus-proto => github.com/census-instrumentation/opencensus-proto v0.2.1
|
||||
github.com/certifi/gocertifi => github.com/certifi/gocertifi v0.0.0-20180118203423-deb3ae2ef261
|
||||
github.com/cespare/xxhash => github.com/cespare/xxhash v1.1.0
|
||||
@@ -437,15 +445,22 @@ replace (
|
||||
github.com/deckarep/golang-set => github.com/deckarep/golang-set v1.7.1
|
||||
github.com/deislabs/oras => github.com/deislabs/oras v0.8.1
|
||||
github.com/denisenkom/go-mssqldb => github.com/denisenkom/go-mssqldb v0.0.0-20190204142019-df6d76eb9289
|
||||
github.com/denverdino/aliyungo => github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba
|
||||
github.com/dgraph-io/badger/v3 => github.com/dgraph-io/badger/v3 v3.2103.2
|
||||
github.com/dgraph-io/ristretto => github.com/dgraph-io/ristretto v0.1.0
|
||||
github.com/dgrijalva/jwt-go => github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||
github.com/dgryski/go-bitstream => github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8
|
||||
github.com/dgryski/go-farm => github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13
|
||||
github.com/dgryski/go-sip13 => github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b
|
||||
github.com/dhui/dktest => github.com/dhui/dktest v0.3.0
|
||||
github.com/distribution/distribution/v3 => github.com/distribution/distribution/v3 v3.0.0-20220526142353-ffbd94cbe269
|
||||
github.com/dnaeon/go-vcr => github.com/dnaeon/go-vcr v1.0.1
|
||||
github.com/docker/cli => github.com/docker/cli v0.0.0-20190506213505-d88565df0c2d
|
||||
github.com/docker/distribution => github.com/docker/distribution v2.7.1+incompatible
|
||||
github.com/docker/docker => github.com/docker/engine v1.4.2-0.20200203170920-46ec8731fbce
|
||||
github.com/docker/docker-credential-helpers => github.com/docker/docker-credential-helpers v0.6.1
|
||||
github.com/docker/go-connections => github.com/docker/go-connections v0.4.0
|
||||
github.com/docker/go-events => github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c
|
||||
github.com/docker/go-metrics => github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82
|
||||
github.com/docker/go-units => github.com/docker/go-units v0.4.0
|
||||
github.com/docker/libtrust => github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
|
||||
@@ -467,6 +482,7 @@ replace (
|
||||
github.com/ema/qdisc => github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043
|
||||
github.com/emicklei/go-restful => github.com/emicklei/go-restful v2.14.3+incompatible
|
||||
github.com/emicklei/go-restful-openapi => github.com/emicklei/go-restful-openapi v1.4.1
|
||||
github.com/emicklei/go-restful/v3 => github.com/emicklei/go-restful/v3 v3.8.0
|
||||
github.com/emirpasic/gods => github.com/emirpasic/gods v1.12.0
|
||||
github.com/envoyproxy/go-control-plane => github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473
|
||||
github.com/envoyproxy/protoc-gen-validate => github.com/envoyproxy/protoc-gen-validate v0.1.0
|
||||
@@ -483,6 +499,8 @@ replace (
|
||||
github.com/flynn/go-shlex => github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568
|
||||
github.com/fogleman/gg => github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90
|
||||
github.com/form3tech-oss/jwt-go => github.com/form3tech-oss/jwt-go v3.2.2+incompatible
|
||||
github.com/fortytw2/leaktest => github.com/fortytw2/leaktest v1.3.0
|
||||
github.com/foxcpp/go-mockdns => github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897
|
||||
github.com/franela/goblin => github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db
|
||||
github.com/franela/goreq => github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8
|
||||
github.com/fsnotify/fsnotify => github.com/fsnotify/fsnotify v1.4.9
|
||||
@@ -496,10 +514,13 @@ replace (
|
||||
github.com/glycerine/goconvey => github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31
|
||||
github.com/go-bindata/go-bindata/v3 => github.com/go-bindata/go-bindata/v3 v3.1.3
|
||||
github.com/go-errors/errors => github.com/go-errors/errors v1.0.1
|
||||
github.com/go-gorp/gorp/v3 => github.com/go-gorp/gorp/v3 v3.0.2
|
||||
github.com/go-ini/ini => github.com/go-ini/ini v1.67.0
|
||||
github.com/go-kit/kit => github.com/go-kit/kit v0.10.0
|
||||
github.com/go-ldap/ldap => github.com/go-ldap/ldap v3.0.3+incompatible
|
||||
github.com/go-logfmt/logfmt => github.com/go-logfmt/logfmt v0.5.0
|
||||
github.com/go-logr/logr => github.com/go-logr/logr v0.4.0
|
||||
github.com/go-logr/stdr => github.com/go-logr/stdr v1.2.2
|
||||
github.com/go-logr/zapr => github.com/go-logr/zapr v0.4.0
|
||||
github.com/go-ole/go-ole => github.com/go-ole/go-ole v1.2.6-0.20210915003542-8b1f7f90f6b1
|
||||
github.com/go-openapi/analysis => github.com/go-openapi/analysis v0.19.10
|
||||
@@ -543,6 +564,7 @@ replace (
|
||||
github.com/gogo/googleapis => github.com/gogo/googleapis v1.1.0
|
||||
github.com/gogo/protobuf => github.com/gogo/protobuf v1.3.2
|
||||
github.com/gogo/status => github.com/gogo/status v1.0.3
|
||||
github.com/golang-jwt/jwt/v4 => github.com/golang-jwt/jwt/v4 v4.2.0
|
||||
github.com/golang-migrate/migrate/v4 => github.com/golang-migrate/migrate/v4 v4.7.0
|
||||
github.com/golang/example => github.com/golang/example v0.0.0-20170904185048-46695d81d1fa
|
||||
github.com/golang/freetype => github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
||||
@@ -559,6 +581,7 @@ replace (
|
||||
github.com/google/btree => github.com/google/btree v1.0.0
|
||||
github.com/google/certificate-transparency-go => github.com/google/certificate-transparency-go v1.0.21
|
||||
github.com/google/flatbuffers => github.com/google/flatbuffers v1.11.0
|
||||
github.com/google/gnostic => github.com/google/gnostic v0.5.7-v3refs
|
||||
github.com/google/go-cmp => github.com/google/go-cmp v0.4.0
|
||||
github.com/google/go-containerregistry => github.com/google/go-containerregistry v0.6.0
|
||||
github.com/google/go-github => github.com/google/go-github v17.0.0+incompatible
|
||||
@@ -586,6 +609,7 @@ replace (
|
||||
github.com/grpc-ecosystem/go-grpc-middleware => github.com/grpc-ecosystem/go-grpc-middleware v1.1.0
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus => github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||
github.com/grpc-ecosystem/grpc-gateway => github.com/grpc-ecosystem/grpc-gateway v1.14.4
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 => github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0
|
||||
github.com/hailocab/go-hostpool => github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed
|
||||
github.com/hashicorp/consul/api => github.com/hashicorp/consul/api v1.4.0
|
||||
github.com/hashicorp/consul/sdk => github.com/hashicorp/consul/sdk v0.4.0
|
||||
@@ -634,6 +658,7 @@ replace (
|
||||
github.com/joeshaw/multierror => github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901
|
||||
github.com/joho/godotenv => github.com/joho/godotenv v1.3.0
|
||||
github.com/jonboulle/clockwork => github.com/jonboulle/clockwork v0.1.0
|
||||
github.com/josharian/intern => github.com/josharian/intern v1.0.0
|
||||
github.com/jpillora/backoff => github.com/jpillora/backoff v1.0.0
|
||||
github.com/jsimonetti/rtnetlink => github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4
|
||||
github.com/json-iterator/go => github.com/json-iterator/go v1.1.12
|
||||
@@ -712,8 +737,10 @@ replace (
|
||||
github.com/mitchellh/go-wordwrap => github.com/mitchellh/go-wordwrap v1.0.0
|
||||
github.com/mitchellh/hashstructure => github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452
|
||||
github.com/mitchellh/mapstructure => github.com/mitchellh/mapstructure v1.2.2
|
||||
github.com/mitchellh/osext => github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f
|
||||
github.com/mitchellh/reflectwalk => github.com/mitchellh/reflectwalk v1.0.0
|
||||
github.com/mna/pigeon => github.com/mna/pigeon v0.0.0-20180808201053-bb0192cfc2ae
|
||||
github.com/moby/locker => github.com/moby/locker v1.0.1
|
||||
github.com/moby/spdystream => github.com/moby/spdystream v0.2.0
|
||||
github.com/moby/term => github.com/moby/term v0.0.0-20201216013528-df9cb8a40635
|
||||
github.com/modern-go/concurrent => github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
|
||||
@@ -742,13 +769,15 @@ replace (
|
||||
github.com/oklog/run => github.com/oklog/run v1.1.0
|
||||
github.com/oklog/ulid => github.com/oklog/ulid v1.3.1
|
||||
github.com/olekukonko/tablewriter => github.com/olekukonko/tablewriter v0.0.1
|
||||
github.com/oliveagle/jsonpath => github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852
|
||||
github.com/onsi/ginkgo => github.com/onsi/ginkgo v1.14.0
|
||||
github.com/onsi/gomega => github.com/onsi/gomega v1.10.1
|
||||
github.com/op/go-logging => github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
|
||||
github.com/open-policy-agent/opa => github.com/open-policy-agent/opa v0.18.0
|
||||
github.com/open-policy-agent/opa => github.com/open-policy-agent/opa v0.45.0
|
||||
github.com/opencontainers/go-digest => github.com/opencontainers/go-digest v1.0.0
|
||||
github.com/opencontainers/image-spec => github.com/opencontainers/image-spec v1.0.1
|
||||
github.com/opencontainers/runc => github.com/opencontainers/runc v0.1.1
|
||||
github.com/opensearch-project/opensearch-go => github.com/opensearch-project/opensearch-go v1.1.0
|
||||
github.com/opensearch-project/opensearch-go/v2 => github.com/opensearch-project/opensearch-go/v2 v2.0.0
|
||||
github.com/opentracing-contrib/go-grpc => github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02
|
||||
github.com/opentracing-contrib/go-observer => github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492
|
||||
@@ -777,6 +806,7 @@ replace (
|
||||
github.com/pkg/term => github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5
|
||||
github.com/pmezard/go-difflib => github.com/pmezard/go-difflib v1.0.0
|
||||
github.com/posener/complete => github.com/posener/complete v1.1.1
|
||||
github.com/poy/onpar => github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1
|
||||
github.com/pquerna/cachecontrol => github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021
|
||||
github.com/pquerna/ffjson => github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9
|
||||
github.com/projectcalico/go-json => github.com/projectcalico/go-json v0.0.0-20161128004156-6219dc7339ba
|
||||
@@ -837,10 +867,12 @@ replace (
|
||||
github.com/spf13/pflag => github.com/spf13/pflag v1.0.5
|
||||
github.com/spf13/viper => github.com/spf13/viper v1.4.0
|
||||
github.com/src-d/gcfg => github.com/src-d/gcfg v1.4.0
|
||||
github.com/stoewer/go-strcase => github.com/stoewer/go-strcase v1.2.0
|
||||
github.com/streadway/amqp => github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271
|
||||
github.com/streadway/handy => github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a
|
||||
github.com/stretchr/objx => github.com/stretchr/objx v0.2.0
|
||||
github.com/stretchr/testify => github.com/stretchr/testify v1.4.0
|
||||
github.com/tchap/go-patricia/v2 => github.com/tchap/go-patricia/v2 v2.3.1
|
||||
github.com/thanos-io/thanos => github.com/thanos-io/thanos v0.13.1-0.20200910143741-e0b7f7b32e9c
|
||||
github.com/tidwall/pretty => github.com/tidwall/pretty v1.0.0
|
||||
github.com/tinylib/msgp => github.com/tinylib/msgp v1.1.0
|
||||
@@ -889,6 +921,15 @@ replace (
|
||||
go.etcd.io/etcd => go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489
|
||||
go.mongodb.org/mongo-driver => go.mongodb.org/mongo-driver v1.3.2
|
||||
go.opencensus.io => go.opencensus.io v0.22.3
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp => go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0
|
||||
go.opentelemetry.io/otel => go.opentelemetry.io/otel v1.7.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry => go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace => go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0
|
||||
go.opentelemetry.io/otel/metric => go.opentelemetry.io/otel/metric v0.30.0
|
||||
go.opentelemetry.io/otel/sdk => go.opentelemetry.io/otel/sdk v1.7.0
|
||||
go.opentelemetry.io/otel/trace => go.opentelemetry.io/otel/trace v1.7.0
|
||||
go.opentelemetry.io/proto/otlp => go.opentelemetry.io/proto/otlp v0.16.0
|
||||
go.starlark.net => go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5
|
||||
go.uber.org/atomic => go.uber.org/atomic v1.6.0
|
||||
go.uber.org/automaxprocs => go.uber.org/automaxprocs v1.2.0
|
||||
@@ -916,6 +957,7 @@ replace (
|
||||
gonum.org/v1/plot => gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b
|
||||
google.golang.org/api => google.golang.org/api v0.22.0
|
||||
google.golang.org/appengine => google.golang.org/appengine v1.6.6
|
||||
google.golang.org/cloud => google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8
|
||||
google.golang.org/genproto => google.golang.org/genproto v0.0.0-20200420144010-e5e8543f8aeb
|
||||
google.golang.org/grpc => google.golang.org/grpc v1.27.1
|
||||
google.golang.org/protobuf => google.golang.org/protobuf v1.23.0
|
||||
@@ -976,6 +1018,8 @@ replace (
|
||||
kubesphere.io/api => ./staging/src/kubesphere.io/api
|
||||
kubesphere.io/client-go => ./staging/src/kubesphere.io/client-go
|
||||
kubesphere.io/monitoring-dashboard => kubesphere.io/monitoring-dashboard v0.2.2
|
||||
kubesphere.io/utils => ./staging/src/kubesphere.io/utils
|
||||
oras.land/oras-go => oras.land/oras-go v1.2.0
|
||||
rsc.io/binaryregexp => rsc.io/binaryregexp v0.2.0
|
||||
rsc.io/goversion => rsc.io/goversion v1.2.0
|
||||
rsc.io/letsencrypt => rsc.io/letsencrypt v0.0.1
|
||||
@@ -986,6 +1030,7 @@ replace (
|
||||
sigs.k8s.io/application => sigs.k8s.io/application v0.8.4-0.20201016185654-c8e2959e57a0
|
||||
sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.9.8-0.20211019125639-aa2b3e68a52d
|
||||
sigs.k8s.io/controller-tools => sigs.k8s.io/controller-tools v0.6.2
|
||||
sigs.k8s.io/json => sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2
|
||||
sigs.k8s.io/kind => sigs.k8s.io/kind v0.8.1
|
||||
sigs.k8s.io/kubebuilder/v3 => sigs.k8s.io/kubebuilder/v3 v3.0.0-alpha.0.0.20210716121009-fde793f20067
|
||||
sigs.k8s.io/kubefed => sigs.k8s.io/kubefed v0.8.1
|
||||
|
||||
15
go.sum
15
go.sum
@@ -62,6 +62,7 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx
|
||||
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
|
||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ=
|
||||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
|
||||
@@ -114,6 +115,7 @@ github.com/bugsnag/bugsnag-go v1.5.0 h1:tP8hiPv1pGGW3LA6LKy5lW6WG+y9J2xWUdPd3WC4
|
||||
github.com/bugsnag/bugsnag-go v1.5.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
||||
github.com/bugsnag/panicwrap v1.2.0 h1:OzrKrRvXis8qEvOkfcxNcYbOd2O7xXS2nnKMEMABFQA=
|
||||
github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||
github.com/bytecodealliance/wasmtime-go v1.0.0 h1:9u9gqaUiaJeN5IoD1L7egD8atOnTGyJcNp8BhkL9cUU=
|
||||
github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
|
||||
github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8=
|
||||
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
|
||||
@@ -191,6 +193,8 @@ github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14y
|
||||
github.com/deislabs/oras v0.8.1 h1:If674KraJVpujYR00rzdi0QAmW4BxzMJPVAZJKuhQ0c=
|
||||
github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As=
|
||||
github.com/denisenkom/go-mssqldb v0.0.0-20190204142019-df6d76eb9289/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc=
|
||||
github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8=
|
||||
github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
|
||||
@@ -260,6 +264,8 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk=
|
||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
|
||||
github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897 h1:E52jfcE64UG42SwLmrW0QByONfGynWuzBvm86BoB9z8=
|
||||
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
|
||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
@@ -380,6 +386,7 @@ github.com/google/addlicense v0.0.0-20200906110928-a0294312aa76/go.mod h1:EMjYTR
|
||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
|
||||
github.com/google/flatbuffers v1.11.0 h1:O7CEyB8Cb3/DmtxODGtLHcEvpr81Jm5qLg/hsHnxA2A=
|
||||
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
@@ -598,7 +605,6 @@ github.com/mitchellh/mapstructure v1.2.2 h1:dxe5oCinTXiTIcfgmZecdCzPmAJKd46KsCWc
|
||||
github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
|
||||
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
github.com/mna/pigeon v0.0.0-20180808201053-bb0192cfc2ae/go.mod h1:Iym28+kJVnC1hfQvv5MUtI6AiFFzvQjHcvI4RFTG/04=
|
||||
github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
|
||||
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
|
||||
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk=
|
||||
@@ -645,8 +651,8 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k
|
||||
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/open-policy-agent/opa v0.18.0 h1:EC81mO3/517Kq5brJHydqKE5MLzJ+4cdJvUQKxLzHy8=
|
||||
github.com/open-policy-agent/opa v0.18.0/go.mod h1:6pC1cMYDI92i9EY/GoA2m+HcZlcCrh3jbfny5F7JVTA=
|
||||
github.com/open-policy-agent/opa v0.45.0 h1:P5nuhVRtR+e58fk3CMMbiqr6ZFyWQPNOC3otsorGsFs=
|
||||
github.com/open-policy-agent/opa v0.45.0/go.mod h1:/OnsYljNEWJ6DXeFOOnoGn8CvwZGMUS4iRqzYdJvmBI=
|
||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
|
||||
@@ -794,6 +800,8 @@ github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes=
|
||||
github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k=
|
||||
github.com/thanos-io/thanos v0.13.1-0.20200910143741-e0b7f7b32e9c/go.mod h1:1IzeMKiS+pvxbG2M6ZJyi8ZHaAQKXNjDbP2gjhPbSXE=
|
||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||
@@ -860,6 +868,7 @@ go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1Zt
|
||||
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
|
||||
go.mongodb.org/mongo-driver v1.3.2 h1:IYppNjEV/C+/3VPbhHVxQ4t04eVW0cLp0/pNdW++6Ug=
|
||||
go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
|
||||
go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
// This is a generated file. Do not edit directly.
|
||||
|
||||
module kubesphere.io/api
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/go-logr/logr v0.4.0
|
||||
github.com/go-logr/logr v1.2.3
|
||||
github.com/go-openapi/spec v0.19.8
|
||||
github.com/onsi/gomega v1.15.0
|
||||
github.com/projectcalico/libcalico-go v1.7.2-0.20191014160346-2382c6cdd056
|
||||
github.com/prometheus/common v0.37.0
|
||||
github.com/prometheus/prometheus v1.8.2-0.20200907175821-8219b442c864
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5
|
||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
istio.io/api v0.0.0-20201113182140-d4b7e3fc2b44
|
||||
k8s.io/api v0.22.1
|
||||
k8s.io/apiextensions-apiserver v0.21.4
|
||||
@@ -23,26 +25,27 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/OneOfOne/xxhash v1.2.8 // indirect
|
||||
github.com/PuerkitoBio/purell v1.1.1 // indirect
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash v1.1.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/edsrzf/mmap-go v1.0.0 // indirect
|
||||
github.com/emicklei/go-restful v2.14.3+incompatible // indirect
|
||||
github.com/evanphx/json-patch v4.11.0+incompatible // indirect
|
||||
github.com/fsnotify/fsnotify v1.4.9 // indirect
|
||||
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||
github.com/go-kit/kit v0.10.0 // indirect
|
||||
github.com/go-logfmt/logfmt v0.5.0 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.19.3 // indirect
|
||||
github.com/go-openapi/jsonreference v0.19.3 // indirect
|
||||
github.com/go-openapi/swag v0.19.9 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
||||
github.com/golang/protobuf v1.4.3 // indirect
|
||||
github.com/golang/snappy v0.0.1 // indirect
|
||||
github.com/google/go-cmp v0.5.6 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/go-cmp v0.5.7 // indirect
|
||||
github.com/google/gofuzz v1.1.0 // indirect
|
||||
github.com/google/uuid v1.1.2 // indirect
|
||||
github.com/googleapis/gnostic v0.5.5 // indirect
|
||||
@@ -59,29 +62,30 @@ require (
|
||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/prometheus/client_golang v1.11.0 // indirect
|
||||
github.com/prometheus/client_golang v1.13.0 // indirect
|
||||
github.com/prometheus/client_model v0.2.0 // indirect
|
||||
github.com/prometheus/procfs v0.6.0 // indirect
|
||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||
github.com/prometheus/procfs v0.8.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/stretchr/testify v1.7.0 // indirect
|
||||
github.com/stretchr/testify v1.8.0 // indirect
|
||||
github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect
|
||||
github.com/uber/jaeger-lib v2.2.0+incompatible // indirect
|
||||
go.uber.org/atomic v1.6.0 // indirect
|
||||
go.uber.org/goleak v1.1.10 // indirect
|
||||
go.uber.org/goleak v1.1.12 // indirect
|
||||
go.uber.org/multierr v1.4.0 // indirect
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 // indirect
|
||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
|
||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
|
||||
golang.org/x/tools v0.1.10 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/protobuf v1.26.0-rc.1 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
istio.io/gogo-genproto v0.0.0-20201113182723-5b8563d8a012 // indirect
|
||||
@@ -93,40 +97,57 @@ require (
|
||||
)
|
||||
|
||||
replace (
|
||||
cloud.google.com/go => cloud.google.com/go v0.56.0
|
||||
github.com/Azure/go-autorest/autorest => github.com/Azure/go-autorest/autorest v0.10.0
|
||||
github.com/Azure/go-autorest/autorest/adal => github.com/Azure/go-autorest/autorest/adal v0.8.3
|
||||
github.com/asaskevich/govalidator => github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496
|
||||
github.com/OneOfOne/xxhash => github.com/OneOfOne/xxhash v1.2.7
|
||||
github.com/blang/semver => github.com/blang/semver v3.5.0+incompatible
|
||||
github.com/cespare/xxhash/v2 => github.com/cespare/xxhash/v2 v2.1.1
|
||||
github.com/creack/pty => github.com/creack/pty v1.1.7
|
||||
github.com/evanphx/json-patch => github.com/evanphx/json-patch v4.9.0+incompatible
|
||||
github.com/fatih/color => github.com/fatih/color v1.9.0
|
||||
github.com/fsnotify/fsnotify => github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/go-logr/logr => github.com/go-logr/logr v0.4.0
|
||||
github.com/go-openapi/spec => github.com/go-openapi/spec v0.19.7
|
||||
github.com/golang/groupcache => github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
|
||||
github.com/golang/protobuf => github.com/golang/protobuf v1.4.2
|
||||
github.com/golang/snappy => github.com/golang/snappy v0.0.1
|
||||
github.com/google/go-cmp => github.com/google/go-cmp v0.4.0
|
||||
github.com/google/pprof => github.com/google/pprof v0.0.0-20200417002340-c6e0a841f49a
|
||||
github.com/google/uuid => github.com/google/uuid v1.1.1
|
||||
github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.4.1
|
||||
github.com/gorilla/websocket => github.com/gorilla/websocket v1.4.1
|
||||
github.com/imdario/mergo => github.com/imdario/mergo v0.3.9
|
||||
github.com/kisielk/errcheck => github.com/kisielk/errcheck v1.2.0
|
||||
github.com/kr/text => github.com/kr/text v0.1.0
|
||||
github.com/lib/pq => github.com/lib/pq v1.2.0
|
||||
github.com/mattn/go-runewidth => github.com/mattn/go-runewidth v0.0.4
|
||||
github.com/matttproud/golang_protobuf_extensions => github.com/matttproud/golang_protobuf_extensions v1.0.1
|
||||
github.com/olekukonko/tablewriter => github.com/olekukonko/tablewriter v0.0.1
|
||||
github.com/onsi/ginkgo => github.com/onsi/ginkgo v1.14.0
|
||||
github.com/onsi/gomega => github.com/onsi/gomega v1.10.1
|
||||
github.com/opentracing/opentracing-go => github.com/opentracing/opentracing-go v1.1.0
|
||||
github.com/prometheus/client_golang => github.com/prometheus/client_golang v1.11.0
|
||||
github.com/prometheus/common => github.com/prometheus/common v0.10.0
|
||||
github.com/prometheus/procfs => github.com/prometheus/procfs v0.1.3
|
||||
github.com/prometheus/prometheus => github.com/prometheus/prometheus v1.8.2-0.20200507164740-ecee9c8abfd1
|
||||
github.com/rogpeppe/fastuuid => github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af
|
||||
github.com/satori/go.uuid => github.com/satori/go.uuid v1.2.0
|
||||
github.com/sirupsen/logrus => github.com/sirupsen/logrus v1.4.2
|
||||
github.com/spaolacci/murmur3 => github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72
|
||||
github.com/spf13/cobra => github.com/spf13/cobra v1.2.1
|
||||
github.com/spf13/viper => github.com/spf13/viper v1.4.0
|
||||
github.com/stretchr/testify => github.com/stretchr/testify v1.4.0
|
||||
github.com/uber/jaeger-client-go => github.com/uber/jaeger-client-go v2.23.0+incompatible
|
||||
github.com/urfave/cli => github.com/urfave/cli v1.20.0
|
||||
go.etcd.io/bbolt => go.etcd.io/bbolt v1.3.3
|
||||
go.uber.org/goleak => go.uber.org/goleak v1.1.0
|
||||
go.uber.org/multierr => go.uber.org/multierr v1.3.0
|
||||
go.uber.org/zap => go.uber.org/zap v1.13.0
|
||||
golang.org/x/crypto => golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e
|
||||
golang.org/x/exp => golang.org/x/exp v0.0.0-20190121172915-509febef88a4
|
||||
golang.org/x/lint => golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f
|
||||
golang.org/x/net => golang.org/x/net v0.0.0-20210525063256-abc453219eb5
|
||||
golang.org/x/oauth2 => golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a
|
||||
golang.org/x/sync => golang.org/x/sync v0.0.0-20190423024810-112230192c58
|
||||
golang.org/x/sys => golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d
|
||||
golang.org/x/term => golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||
golang.org/x/text => golang.org/x/text v0.3.0
|
||||
golang.org/x/time => golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
||||
@@ -134,7 +155,6 @@ replace (
|
||||
golang.org/x/xerrors => golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
|
||||
gomodules.xyz/jsonpatch/v2 => gomodules.xyz/jsonpatch/v2 v2.0.1
|
||||
gonum.org/v1/netlib => gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0
|
||||
google.golang.org/api => google.golang.org/api v0.22.0
|
||||
google.golang.org/appengine => google.golang.org/appengine v1.6.6
|
||||
google.golang.org/genproto => google.golang.org/genproto v0.0.0-20200420144010-e5e8543f8aeb
|
||||
google.golang.org/grpc => google.golang.org/grpc v1.27.1
|
||||
|
||||
@@ -9,7 +9,7 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy
|
||||
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||
collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
|
||||
github.com/Azure/azure-sdk-for-go v45.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||
github.com/Azure/azure-sdk-for-go v41.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
||||
github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
|
||||
github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
|
||||
@@ -24,11 +24,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
|
||||
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/OneOfOne/xxhash v1.2.7 h1:fzrmmkskv067ZQbd9wERNGuxckWw67dyzoMG62p7LMo=
|
||||
github.com/OneOfOne/xxhash v1.2.7/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
|
||||
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||
@@ -42,31 +41,25 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
|
||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/alessio/shellescape v1.2.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
|
||||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
|
||||
github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
|
||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
|
||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
|
||||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
|
||||
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
||||
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
|
||||
github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
|
||||
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
@@ -75,8 +68,8 @@ github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+Wji
|
||||
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
||||
github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
|
||||
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
|
||||
github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
@@ -91,7 +84,6 @@ github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||
github.com/coreos/etcd v3.3.8+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
@@ -99,12 +91,9 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc
|
||||
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
|
||||
@@ -115,12 +104,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
||||
github.com/dgrijalva/jwt-go v3.0.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/digitalocean/godo v1.42.1/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU=
|
||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v17.12.0-ce-rc1.0.20200706150819-a40b877fbb9e+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
||||
@@ -146,7 +130,6 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL
|
||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
|
||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
@@ -155,15 +138,12 @@ github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0
|
||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
||||
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo=
|
||||
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||
github.com/go-logr/logr v0.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.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM=
|
||||
@@ -203,15 +183,8 @@ github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6
|
||||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
|
||||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
|
||||
github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo=
|
||||
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
|
||||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
||||
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
|
||||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
|
||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
||||
github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
|
||||
github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
|
||||
github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
|
||||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
|
||||
github.com/go-openapi/spec v0.19.7 h1:0xWSeMd35y5avQAThZR2PkEuqSosoS5t6gDH4L8n11M=
|
||||
github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
|
||||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
|
||||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
|
||||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
|
||||
@@ -243,11 +216,7 @@ github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQ
|
||||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
|
||||
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
|
||||
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
|
||||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
|
||||
github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
|
||||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
|
||||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
|
||||
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
|
||||
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
|
||||
@@ -256,17 +225,16 @@ github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxs
|
||||
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/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=
|
||||
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
|
||||
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
|
||||
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
|
||||
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
|
||||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
@@ -274,10 +242,6 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
@@ -285,7 +249,6 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU
|
||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/addlicense v0.0.0-20200906110928-a0294312aa76/go.mod h1:EMjYTRimagHs1FwlIqKyX3wAM0u3rA+McvlIIWmSamA=
|
||||
@@ -295,7 +258,6 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
|
||||
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
|
||||
@@ -308,10 +270,9 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
|
||||
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
|
||||
github.com/gophercloud/gophercloud v0.12.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss=
|
||||
github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||
@@ -321,11 +282,9 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.6/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw=
|
||||
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
||||
github.com/hashicorp/consul/api v1.6.0/go.mod h1:1NSuaUUkFaJzMasbfq/11wKYWSR67Xn6r2DXKhuDNFg=
|
||||
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
github.com/hashicorp/consul/sdk v0.6.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0=
|
||||
github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU=
|
||||
github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
@@ -335,9 +294,7 @@ github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh
|
||||
github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
|
||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||
github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A=
|
||||
@@ -354,18 +311,16 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
|
||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||
github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
|
||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
||||
github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
|
||||
github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
|
||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||
github.com/hashicorp/serf v0.9.3/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
|
||||
github.com/hetznercloud/hcloud-go v1.21.1/go.mod h1:xng8lbDUg+xM1dgc0yGHX5EeqbwIq7UYlMWMTx3SQVg=
|
||||
github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU=
|
||||
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
|
||||
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY=
|
||||
github.com/influxdata/influxdb v1.8.2/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ=
|
||||
github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ=
|
||||
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
|
||||
github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo=
|
||||
github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
|
||||
@@ -374,10 +329,10 @@ github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bS
|
||||
github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
|
||||
github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
|
||||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
@@ -391,6 +346,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X
|
||||
github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
|
||||
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
|
||||
@@ -400,7 +356,6 @@ github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dv
|
||||
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
|
||||
@@ -416,9 +371,9 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
||||
github.com/leodido/go-urn v0.0.0-20181204092800-a67a23e1c1af/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
@@ -442,18 +397,13 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
|
||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
|
||||
github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||
@@ -473,7 +423,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
|
||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
|
||||
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
@@ -501,18 +450,12 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k
|
||||
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU=
|
||||
github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
|
||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
|
||||
@@ -539,7 +482,6 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||
github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
|
||||
github.com/projectcalico/go-json v0.0.0-20161128004156-6219dc7339ba h1:aaF2byUCZhzszHsfPEr2M3qcU4ibtD/yk/il2R7T1PU=
|
||||
@@ -550,50 +492,33 @@ github.com/projectcalico/go-yaml-wrapper v0.0.0-20161127220527-598e54215bee h1:y
|
||||
github.com/projectcalico/go-yaml-wrapper v0.0.0-20161127220527-598e54215bee/go.mod h1:UgC0aTQ2KMDxlX3lU/stndk7DMUBJqzN40yFiILHgxc=
|
||||
github.com/projectcalico/libcalico-go v1.7.2-0.20191014160346-2382c6cdd056 h1:qs29Hus4cY8XlsmMLUsSAHT0metSTyqu2Tnpuwy5dkM=
|
||||
github.com/projectcalico/libcalico-go v1.7.2-0.20191014160346-2382c6cdd056/go.mod h1:tUt8rirmysRy7TR1S80XDriwBK1z2igwwX79lnUrSf4=
|
||||
github.com/prometheus/alertmanager v0.21.0/go.mod h1:h7tJ81NA0VLWvWEayi1QltevFkLF3KxmC/malTcT8Go=
|
||||
github.com/prometheus/client_golang v0.0.0-20171005112915-5cec1d0429b0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
|
||||
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
||||
github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg=
|
||||
github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
|
||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
|
||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||
github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
|
||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/prometheus v1.8.2-0.20200907175821-8219b442c864 h1:I+w5IWHKbWPKAWbzsgVEeiih0YJGH+hvDjVHMY06YoM=
|
||||
github.com/prometheus/prometheus v1.8.2-0.20200907175821-8219b442c864/go.mod h1:Td6hjwdXDmVt5CI9T03Sw+yBNxLBq/Yx3ZtmtP8zlCA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/prometheus/prometheus v1.8.2-0.20200507164740-ecee9c8abfd1 h1:Oh/bmW9DXCbMeAZbxMmt2wuY6Q4cD0IIbR6vJP3kdHg=
|
||||
github.com/prometheus/prometheus v1.8.2-0.20200507164740-ecee9c8abfd1/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
|
||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20200724154423-2164a8ac840e/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||
github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
|
||||
github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
|
||||
@@ -601,7 +526,6 @@ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAm
|
||||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
|
||||
github.com/shurcooL/vfsgen v0.0.0-20200627165143-92b8a710ab6c/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
|
||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
@@ -613,9 +537,7 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
|
||||
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
@@ -628,7 +550,6 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3
|
||||
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
@@ -638,21 +559,19 @@ github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDW
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U=
|
||||
github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||
github.com/uber/jaeger-client-go v2.23.0+incompatible h1:o2g11IUBdEsSZVzF3k7+bahLmxRP/dbOoW4zQ30UlKE=
|
||||
github.com/uber/jaeger-client-go v2.23.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||
github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw=
|
||||
github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||
github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
|
||||
github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
||||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
|
||||
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
|
||||
github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||
@@ -662,10 +581,6 @@ go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL
|
||||
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.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
|
||||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
@@ -680,21 +595,7 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEa
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f h1:hX65Cu3JDlGH3uEdK7I99Ii+9kjD6mvnnpfLdEAH0x4=
|
||||
@@ -702,93 +603,12 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA=
|
||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I=
|
||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||
@@ -841,7 +661,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.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=
|
||||
@@ -849,7 +668,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
|
||||
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
|
||||
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
||||
@@ -13,27 +13,30 @@ require (
|
||||
|
||||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/go-logr/logr v0.4.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||
github.com/go-logr/logr v1.2.3 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/protobuf v1.4.3 // indirect
|
||||
github.com/google/go-cmp v0.5.6 // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/google/go-cmp v0.5.7 // indirect
|
||||
github.com/google/gofuzz v1.1.0 // indirect
|
||||
github.com/googleapis/gnostic v0.5.5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/stretchr/testify v1.7.0 // indirect
|
||||
github.com/stretchr/testify v1.8.0 // indirect
|
||||
go.uber.org/atomic v1.6.0 // indirect
|
||||
go.uber.org/multierr v1.4.0 // indirect
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect
|
||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d // indirect
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
|
||||
golang.org/x/tools v0.1.10 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/protobuf v1.26.0-rc.1 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
k8s.io/api v0.22.1 // indirect
|
||||
@@ -53,6 +56,9 @@ replace (
|
||||
github.com/creack/pty => github.com/creack/pty v1.1.7
|
||||
github.com/evanphx/json-patch => github.com/evanphx/json-patch v4.9.0+incompatible
|
||||
github.com/fatih/color => github.com/fatih/color v1.9.0
|
||||
github.com/fsnotify/fsnotify => github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/go-logr/logr => github.com/go-logr/logr v0.4.0
|
||||
github.com/go-openapi/spec => github.com/go-openapi/spec v0.19.7
|
||||
github.com/golang/protobuf => github.com/golang/protobuf v1.4.2
|
||||
github.com/google/go-cmp => github.com/google/go-cmp v0.4.0
|
||||
github.com/google/pprof => github.com/google/pprof v0.0.0-20200417002340-c6e0a841f49a
|
||||
@@ -62,6 +68,7 @@ replace (
|
||||
github.com/imdario/mergo => github.com/imdario/mergo v0.3.9
|
||||
github.com/kisielk/errcheck => github.com/kisielk/errcheck v1.2.0
|
||||
github.com/kr/text => github.com/kr/text v0.1.0
|
||||
github.com/mattn/go-runewidth => github.com/mattn/go-runewidth v0.0.4
|
||||
github.com/matttproud/golang_protobuf_extensions => github.com/matttproud/golang_protobuf_extensions v1.0.1
|
||||
github.com/olekukonko/tablewriter => github.com/olekukonko/tablewriter v0.0.1
|
||||
github.com/onsi/ginkgo => github.com/onsi/ginkgo v1.14.0
|
||||
@@ -69,16 +76,20 @@ replace (
|
||||
github.com/prometheus/common => github.com/prometheus/common v0.10.0
|
||||
github.com/prometheus/procfs => github.com/prometheus/procfs v0.1.3
|
||||
github.com/sirupsen/logrus => github.com/sirupsen/logrus v1.4.2
|
||||
github.com/spf13/cobra => github.com/spf13/cobra v1.2.1
|
||||
github.com/spf13/viper => github.com/spf13/viper v1.4.0
|
||||
github.com/stretchr/testify => github.com/stretchr/testify v1.4.0
|
||||
go.etcd.io/bbolt => go.etcd.io/bbolt v1.3.3
|
||||
go.uber.org/goleak => go.uber.org/goleak v1.1.0
|
||||
go.uber.org/multierr => go.uber.org/multierr v1.3.0
|
||||
go.uber.org/zap => go.uber.org/zap v1.13.0
|
||||
golang.org/x/crypto => golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e
|
||||
golang.org/x/exp => golang.org/x/exp v0.0.0-20190121172915-509febef88a4
|
||||
golang.org/x/lint => golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f
|
||||
golang.org/x/net => golang.org/x/net v0.0.0-20210525063256-abc453219eb5
|
||||
golang.org/x/oauth2 => golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a
|
||||
golang.org/x/sync => golang.org/x/sync v0.0.0-20190423024810-112230192c58
|
||||
golang.org/x/sys => golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d
|
||||
golang.org/x/term => golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||
golang.org/x/text => golang.org/x/text v0.3.0
|
||||
golang.org/x/time => golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
||||
|
||||
@@ -18,22 +18,16 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
@@ -53,7 +47,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
@@ -64,13 +57,10 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-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=
|
||||
@@ -80,22 +70,15 @@ github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDB
|
||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
|
||||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
|
||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
|
||||
github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
|
||||
github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
|
||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||
github.com/go-resty/resty/v2 v2.5.0 h1:WFb5bD49/85PO7WgAjZ+/TJQ+Ty1XOcWEfD1zIFCM1c=
|
||||
github.com/go-resty/resty/v2 v2.5.0/go.mod h1:B88+xCTEwvfD94NOuE6GS1wMlnoKNY8eEiNizfNwOwA=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
@@ -121,7 +104,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
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.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
@@ -145,7 +127,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
||||
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
|
||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
@@ -157,9 +138,8 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
|
||||
github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc=
|
||||
@@ -177,7 +157,6 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||
github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
|
||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||
@@ -185,36 +164,26 @@ github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
|
||||
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
@@ -224,7 +193,6 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
@@ -235,9 +203,6 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
@@ -251,71 +216,18 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEa
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f h1:hX65Cu3JDlGH3uEdK7I99Ii+9kjD6mvnnpfLdEAH0x4=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA=
|
||||
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d h1:/m5NbqQelATgoSPVC2Z23sR4kVNokFwDDyWh/3rGY+I=
|
||||
golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||
@@ -352,7 +264,6 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
|
||||
@@ -1,137 +1,273 @@
|
||||
// This is a generated file. Do not edit directly.
|
||||
|
||||
module kubesphere.io/utils
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
helm.sh/helm/v3 v3.9.4
|
||||
k8s.io/api v0.24.6
|
||||
k8s.io/apimachinery v0.24.6
|
||||
k8s.io/cli-runtime v0.24.6
|
||||
k8s.io/client-go v0.24.6
|
||||
helm.sh/helm/v3 v3.6.3
|
||||
k8s.io/api v0.22.1
|
||||
k8s.io/apimachinery v0.22.1
|
||||
k8s.io/cli-runtime v0.21.2
|
||||
k8s.io/client-go v12.0.0+incompatible
|
||||
k8s.io/klog v1.0.0
|
||||
k8s.io/utils v0.0.0-20220922133306-665eaaec4324
|
||||
sigs.k8s.io/kustomize/api v0.12.1
|
||||
k8s.io/utils v0.0.0-20210802155522-efc7438f0176
|
||||
sigs.k8s.io/kustomize/api v0.8.8
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
|
||||
github.com/BurntSushi/toml v1.0.0 // indirect
|
||||
github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect
|
||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
||||
github.com/BurntSushi/toml v0.3.1 // indirect
|
||||
github.com/MakeNowJust/heredoc v0.0.0-20171113091838-e9091a26100e // indirect
|
||||
github.com/Masterminds/goutils v1.1.0 // indirect
|
||||
github.com/Masterminds/semver/v3 v3.1.1 // indirect
|
||||
github.com/Masterminds/sprig/v3 v3.2.2 // indirect
|
||||
github.com/Masterminds/squirrel v1.5.3 // indirect
|
||||
github.com/Masterminds/squirrel v1.5.0 // indirect
|
||||
github.com/Microsoft/go-winio v0.5.0 // indirect
|
||||
github.com/Microsoft/hcsshim v0.8.7 // indirect
|
||||
github.com/PuerkitoBio/purell v1.1.1 // indirect
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
||||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bshuster-repo/logrus-logstash-hook v1.0.0 // indirect
|
||||
github.com/bugsnag/bugsnag-go v1.5.0 // indirect
|
||||
github.com/bugsnag/panicwrap v1.2.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect
|
||||
github.com/containerd/containerd v1.6.6 // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
|
||||
github.com/containerd/containerd v1.6.8 // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.2.2 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/deislabs/oras v0.11.1 // indirect
|
||||
github.com/docker/cli v20.10.17+incompatible // indirect
|
||||
github.com/docker/distribution v2.8.1+incompatible // indirect
|
||||
github.com/docker/distribution v2.7.1+incompatible // indirect
|
||||
github.com/docker/docker v20.10.17+incompatible // indirect
|
||||
github.com/docker/docker-credential-helpers v0.6.4 // indirect
|
||||
github.com/docker/go-connections v0.4.0 // indirect
|
||||
github.com/docker/go-metrics v0.0.1 // indirect
|
||||
github.com/docker/go-units v0.4.0 // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.8.0 // indirect
|
||||
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
|
||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
|
||||
github.com/elazarl/goproxy v0.0.0-20200315184450-1f3cb6622dad // indirect
|
||||
github.com/evanphx/json-patch v4.11.0+incompatible // indirect
|
||||
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
|
||||
github.com/fatih/color v1.13.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.5.1 // indirect
|
||||
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||
github.com/garyburd/redigo v1.6.0 // indirect
|
||||
github.com/go-errors/errors v1.0.1 // indirect
|
||||
github.com/go-gorp/gorp/v3 v3.0.2 // indirect
|
||||
github.com/go-logr/logr v1.2.2 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||
github.com/go-openapi/jsonreference v0.19.5 // indirect
|
||||
github.com/go-openapi/swag v0.19.14 // indirect
|
||||
github.com/go-logr/logr v1.2.3 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.19.3 // indirect
|
||||
github.com/go-openapi/jsonreference v0.19.3 // indirect
|
||||
github.com/go-openapi/spec v0.19.8 // indirect
|
||||
github.com/go-openapi/swag v0.19.9 // indirect
|
||||
github.com/gobuffalo/genny v0.1.1 // indirect
|
||||
github.com/gobuffalo/gogen v0.1.1 // indirect
|
||||
github.com/gobuffalo/packd v0.1.0 // indirect
|
||||
github.com/gobwas/glob v0.2.3 // indirect
|
||||
github.com/gofrs/uuid v4.0.0+incompatible // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
github.com/google/btree v1.0.1 // indirect
|
||||
github.com/google/gnostic v0.5.7-v3refs // indirect
|
||||
github.com/google/go-cmp v0.5.6 // indirect
|
||||
github.com/google/gofuzz v1.2.0 // indirect
|
||||
github.com/google/btree v1.0.0 // indirect
|
||||
github.com/google/go-cmp v0.5.7 // indirect
|
||||
github.com/google/gofuzz v1.1.0 // indirect
|
||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
|
||||
github.com/google/uuid v1.2.0 // indirect
|
||||
github.com/google/uuid v1.1.2 // indirect
|
||||
github.com/googleapis/gnostic v0.5.5 // indirect
|
||||
github.com/gorilla/handlers v1.5.1 // indirect
|
||||
github.com/gorilla/mux v1.8.0 // indirect
|
||||
github.com/gosuri/uitable v0.0.4 // indirect
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
|
||||
github.com/huandu/xstrings v1.3.2 // indirect
|
||||
github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f // indirect
|
||||
github.com/hashicorp/golang-lru v0.5.4 // indirect
|
||||
github.com/huandu/xstrings v1.2.0 // indirect
|
||||
github.com/imdario/mergo v0.3.12 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/jmoiron/sqlx v1.3.5 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/jmoiron/sqlx v1.3.1 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/compress v1.13.6 // indirect
|
||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
||||
github.com/karrick/godirwalk v1.10.3 // indirect
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
|
||||
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
|
||||
github.com/lib/pq v1.10.6 // indirect
|
||||
github.com/lib/pq v1.10.0 // indirect
|
||||
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
|
||||
github.com/mailru/easyjson v0.7.6 // indirect
|
||||
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||
github.com/mailru/easyjson v0.7.1 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
||||
github.com/miekg/dns v1.1.43 // indirect
|
||||
github.com/mitchellh/copystructure v1.1.1 // indirect
|
||||
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
|
||||
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
||||
github.com/moby/locker v1.0.1 // indirect
|
||||
github.com/mitchellh/reflectwalk v1.0.0 // indirect
|
||||
github.com/moby/spdystream v0.2.0 // indirect
|
||||
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
|
||||
github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
|
||||
github.com/morikuni/aec v1.0.0 // indirect
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/onsi/ginkgo v1.16.5 // indirect
|
||||
github.com/onsi/ginkgo v1.16.4 // indirect
|
||||
github.com/onsi/gomega v1.15.0 // indirect
|
||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
|
||||
github.com/opencontainers/runc v0.1.1 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/prometheus/client_golang v1.12.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/prometheus/client_golang v1.13.0 // indirect
|
||||
github.com/prometheus/client_model v0.2.0 // indirect
|
||||
github.com/prometheus/common v0.32.1 // indirect
|
||||
github.com/prometheus/procfs v0.7.3 // indirect
|
||||
github.com/rubenv/sql-migrate v1.1.1 // indirect
|
||||
github.com/prometheus/common v0.37.0 // indirect
|
||||
github.com/prometheus/procfs v0.8.0 // indirect
|
||||
github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351 // indirect
|
||||
github.com/russross/blackfriday v1.5.2 // indirect
|
||||
github.com/shopspring/decimal v1.2.0 // indirect
|
||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||
github.com/spf13/cast v1.4.1 // indirect
|
||||
github.com/spf13/cobra v1.4.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
||||
github.com/spf13/cast v1.3.0 // indirect
|
||||
github.com/spf13/cobra v1.5.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
|
||||
github.com/stretchr/testify v1.8.0 // indirect
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||
github.com/xenolf/lego v0.3.2-0.20160613233155-a9d8cec0e656 // indirect
|
||||
github.com/xlab/treeprint v1.1.0 // indirect
|
||||
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 // indirect
|
||||
github.com/yvasiyarov/gorelic v0.0.6 // indirect
|
||||
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
|
||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
|
||||
golang.org/x/tools v0.1.10 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 // indirect
|
||||
google.golang.org/grpc v1.43.0 // indirect
|
||||
google.golang.org/protobuf v1.28.0 // indirect
|
||||
google.golang.org/grpc v1.49.0 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||
gopkg.in/gorp.v1 v1.7.2 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/square/go-jose.v1 v1.1.2 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
k8s.io/apiextensions-apiserver v0.24.2 // indirect
|
||||
k8s.io/apiserver v0.24.2 // indirect
|
||||
k8s.io/component-base v0.24.2 // indirect
|
||||
k8s.io/klog/v2 v2.80.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8 // indirect
|
||||
k8s.io/kubectl v0.24.2 // indirect
|
||||
oras.land/oras-go v1.2.0 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
|
||||
sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
|
||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||
gotest.tools v2.2.0+incompatible // indirect
|
||||
k8s.io/apiextensions-apiserver v0.21.4 // indirect
|
||||
k8s.io/apiserver v0.21.2 // indirect
|
||||
k8s.io/component-base v0.21.4 // indirect
|
||||
k8s.io/klog/v2 v2.9.0 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect
|
||||
k8s.io/kubectl v0.21.2 // indirect
|
||||
rsc.io/letsencrypt v0.0.1 // indirect
|
||||
sigs.k8s.io/kustomize/kyaml v0.10.21 // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.1.0 // indirect
|
||||
sigs.k8s.io/yaml v1.2.0 // indirect
|
||||
)
|
||||
|
||||
replace (
|
||||
cloud.google.com/go => cloud.google.com/go v0.56.0
|
||||
github.com/Azure/azure-sdk-for-go => github.com/Azure/azure-sdk-for-go v41.3.0+incompatible
|
||||
github.com/Azure/go-ansiterm => github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78
|
||||
github.com/Azure/go-autorest/autorest => github.com/Azure/go-autorest/autorest v0.10.0
|
||||
github.com/Azure/go-autorest/autorest/adal => github.com/Azure/go-autorest/autorest/adal v0.8.3
|
||||
github.com/DATA-DOG/go-sqlmock => github.com/DATA-DOG/go-sqlmock v1.3.3
|
||||
github.com/Masterminds/semver/v3 => github.com/Masterminds/semver/v3 v3.0.1
|
||||
github.com/Masterminds/sprig/v3 => github.com/Masterminds/sprig/v3 v3.0.0
|
||||
github.com/Masterminds/squirrel => github.com/Masterminds/squirrel v0.0.0-20161115235646-20f192218cf5
|
||||
github.com/Masterminds/vcs => github.com/Masterminds/vcs v1.13.0
|
||||
github.com/Microsoft/go-winio => github.com/Microsoft/go-winio v0.4.12
|
||||
github.com/Microsoft/hcsshim => github.com/Microsoft/hcsshim v0.8.6
|
||||
github.com/asaskevich/govalidator => github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496
|
||||
github.com/aws/aws-sdk-go => github.com/aws/aws-sdk-go v1.30.12
|
||||
github.com/blang/semver => github.com/blang/semver v3.5.0+incompatible
|
||||
github.com/bshuster-repo/logrus-logstash-hook => github.com/bshuster-repo/logrus-logstash-hook v0.4.1
|
||||
github.com/cespare/xxhash/v2 => github.com/cespare/xxhash/v2 v2.1.1
|
||||
github.com/containerd/containerd => github.com/containerd/containerd v1.3.0
|
||||
github.com/containerd/continuity => github.com/containerd/continuity v0.0.0-20181203112020-004b46473808
|
||||
github.com/coreos/go-systemd => github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f
|
||||
github.com/creack/pty => github.com/creack/pty v1.1.7
|
||||
github.com/deislabs/oras => github.com/deislabs/oras v0.8.1
|
||||
github.com/denisenkom/go-mssqldb => github.com/denisenkom/go-mssqldb v0.0.0-20190204142019-df6d76eb9289
|
||||
github.com/docker/cli => github.com/docker/cli v0.0.0-20190506213505-d88565df0c2d
|
||||
github.com/docker/docker => github.com/docker/engine v1.4.2-0.20200203170920-46ec8731fbce
|
||||
github.com/docker/docker-credential-helpers => github.com/docker/docker-credential-helpers v0.6.1
|
||||
github.com/docker/go-metrics => github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82
|
||||
github.com/evanphx/json-patch => github.com/evanphx/json-patch v4.9.0+incompatible
|
||||
github.com/fsnotify/fsnotify => github.com/fsnotify/fsnotify v1.4.9
|
||||
github.com/go-logr/logr => github.com/go-logr/logr v0.4.0
|
||||
github.com/go-openapi/spec => github.com/go-openapi/spec v0.19.7
|
||||
github.com/gobuffalo/flect => github.com/gobuffalo/flect v0.2.0
|
||||
github.com/gobuffalo/packr/v2 => github.com/gobuffalo/packr/v2 v2.2.0
|
||||
github.com/gofrs/flock => github.com/gofrs/flock v0.7.1
|
||||
github.com/gofrs/uuid => github.com/gofrs/uuid v3.2.0+incompatible
|
||||
github.com/golang/groupcache => github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
|
||||
github.com/golang/protobuf => github.com/golang/protobuf v1.4.2
|
||||
github.com/golang/snappy => github.com/golang/snappy v0.0.1
|
||||
github.com/google/go-cmp => github.com/google/go-cmp v0.4.0
|
||||
github.com/google/pprof => github.com/google/pprof v0.0.0-20200417002340-c6e0a841f49a
|
||||
github.com/google/uuid => github.com/google/uuid v1.1.1
|
||||
github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.4.1
|
||||
github.com/gorilla/handlers => github.com/gorilla/handlers v1.4.0
|
||||
github.com/gorilla/mux => github.com/gorilla/mux v1.7.3
|
||||
github.com/gorilla/websocket => github.com/gorilla/websocket v1.4.1
|
||||
github.com/gosuri/uitable => github.com/gosuri/uitable v0.0.1
|
||||
github.com/hashicorp/consul/api => github.com/hashicorp/consul/api v1.4.0
|
||||
github.com/hashicorp/memberlist => github.com/hashicorp/memberlist v0.2.0
|
||||
github.com/imdario/mergo => github.com/imdario/mergo v0.3.9
|
||||
github.com/jmoiron/sqlx => github.com/jmoiron/sqlx v1.2.0
|
||||
github.com/kardianos/osext => github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1
|
||||
github.com/kisielk/errcheck => github.com/kisielk/errcheck v1.2.0
|
||||
github.com/kr/text => github.com/kr/text v0.1.0
|
||||
github.com/lib/pq => github.com/lib/pq v1.2.0
|
||||
github.com/mattn/go-runewidth => github.com/mattn/go-runewidth v0.0.4
|
||||
github.com/mattn/go-shellwords => github.com/mattn/go-shellwords v1.0.5
|
||||
github.com/mattn/go-sqlite3 => github.com/mattn/go-sqlite3 v1.11.0
|
||||
github.com/matttproud/golang_protobuf_extensions => github.com/matttproud/golang_protobuf_extensions v1.0.1
|
||||
github.com/miekg/dns => github.com/miekg/dns v1.1.29
|
||||
github.com/mitchellh/copystructure => github.com/mitchellh/copystructure v1.0.0
|
||||
github.com/moby/term => github.com/moby/term v0.0.0-20201216013528-df9cb8a40635
|
||||
github.com/morikuni/aec => github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c
|
||||
github.com/olekukonko/tablewriter => github.com/olekukonko/tablewriter v0.0.1
|
||||
github.com/onsi/ginkgo => github.com/onsi/ginkgo v1.14.0
|
||||
github.com/onsi/gomega => github.com/onsi/gomega v1.10.1
|
||||
github.com/opencontainers/image-spec => github.com/opencontainers/image-spec v1.0.1
|
||||
github.com/phayes/freeport => github.com/phayes/freeport v0.0.0-20171002181615-b8543db493a5
|
||||
github.com/prometheus/client_golang => github.com/prometheus/client_golang v1.11.0
|
||||
github.com/prometheus/common => github.com/prometheus/common v0.10.0
|
||||
github.com/prometheus/procfs => github.com/prometheus/procfs v0.1.3
|
||||
github.com/sergi/go-diff => github.com/sergi/go-diff v1.0.0
|
||||
github.com/sirupsen/logrus => github.com/sirupsen/logrus v1.4.2
|
||||
github.com/spf13/cobra => github.com/spf13/cobra v1.2.1
|
||||
github.com/spf13/viper => github.com/spf13/viper v1.4.0
|
||||
github.com/stretchr/testify => github.com/stretchr/testify v1.4.0
|
||||
github.com/urfave/cli => github.com/urfave/cli v1.20.0
|
||||
github.com/xeipuuv/gojsonpointer => github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f
|
||||
github.com/xlab/treeprint => github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6
|
||||
go.etcd.io/bbolt => go.etcd.io/bbolt v1.3.3
|
||||
golang.org/x/crypto => golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e
|
||||
golang.org/x/exp => golang.org/x/exp v0.0.0-20190121172915-509febef88a4
|
||||
golang.org/x/lint => golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f
|
||||
golang.org/x/net => golang.org/x/net v0.0.0-20210525063256-abc453219eb5
|
||||
golang.org/x/oauth2 => golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a
|
||||
golang.org/x/sync => golang.org/x/sync v0.0.0-20190423024810-112230192c58
|
||||
golang.org/x/sys => golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d
|
||||
golang.org/x/term => golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||
golang.org/x/text => golang.org/x/text v0.3.0
|
||||
golang.org/x/time => golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
|
||||
golang.org/x/tools => golang.org/x/tools v0.0.0-20190710153321-831012c29e42
|
||||
golang.org/x/xerrors => golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
|
||||
google.golang.org/api => google.golang.org/api v0.22.0
|
||||
google.golang.org/appengine => google.golang.org/appengine v1.6.6
|
||||
google.golang.org/genproto => google.golang.org/genproto v0.0.0-20200420144010-e5e8543f8aeb
|
||||
google.golang.org/grpc => google.golang.org/grpc v1.27.1
|
||||
google.golang.org/protobuf => google.golang.org/protobuf v1.23.0
|
||||
gopkg.in/check.v1 => gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15
|
||||
gopkg.in/yaml.v3 => gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
|
||||
k8s.io/api => k8s.io/api v0.21.2
|
||||
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.21.2
|
||||
k8s.io/apimachinery => k8s.io/apimachinery v0.21.2
|
||||
k8s.io/client-go => k8s.io/client-go v0.21.2
|
||||
k8s.io/component-base => k8s.io/component-base v0.21.2
|
||||
k8s.io/gengo => k8s.io/gengo v0.0.0-20200114144118-36b2048a9120
|
||||
k8s.io/klog/v2 => k8s.io/klog/v2 v2.8.0
|
||||
k8s.io/utils => k8s.io/utils v0.0.0-20200603063816-c1c6865ac451
|
||||
kubesphere.io/utils => ../utils
|
||||
sigs.k8s.io/kustomize/kyaml => sigs.k8s.io/kustomize/kyaml v0.10.17
|
||||
)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
5
vendor/github.com/agnivade/levenshtein/.gitignore
generated
vendored
Normal file
5
vendor/github.com/agnivade/levenshtein/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
coverage.txt
|
||||
fuzz/fuzz-fuzz.zip
|
||||
fuzz/corpus/corpus/*
|
||||
fuzz/corpus/suppressions/*
|
||||
fuzz/corpus/crashes/*
|
||||
7
vendor/github.com/agnivade/levenshtein/.travis.yml
generated
vendored
Normal file
7
vendor/github.com/agnivade/levenshtein/.travis.yml
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
language: go
|
||||
|
||||
go:
|
||||
- 1.9.x
|
||||
- 1.10.x
|
||||
- 1.11.x
|
||||
- tip
|
||||
21
vendor/github.com/agnivade/levenshtein/License.txt
generated
vendored
Normal file
21
vendor/github.com/agnivade/levenshtein/License.txt
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Agniva De Sarker
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
13
vendor/github.com/agnivade/levenshtein/Makefile
generated
vendored
Normal file
13
vendor/github.com/agnivade/levenshtein/Makefile
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
all: test install
|
||||
|
||||
install:
|
||||
go install
|
||||
|
||||
lint:
|
||||
gofmt -l -s -w . && go tool vet -all . && golint
|
||||
|
||||
test:
|
||||
go test -race -v -coverprofile=coverage.txt -covermode=atomic
|
||||
|
||||
bench:
|
||||
go test -run=XXX -bench=. -benchmem
|
||||
57
vendor/github.com/agnivade/levenshtein/README.md
generated
vendored
Normal file
57
vendor/github.com/agnivade/levenshtein/README.md
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
levenshtein [](https://travis-ci.org/agnivade/levenshtein) [](https://goreportcard.com/report/github.com/agnivade/levenshtein) [](https://godoc.org/github.com/agnivade/levenshtein)
|
||||
===========
|
||||
|
||||
[Go](http://golang.org) package to calculate the [Levenshtein Distance](http://en.wikipedia.org/wiki/Levenshtein_distance)
|
||||
|
||||
The library is fully capable of working with non-ascii strings. But the strings are not normalized. That is left as a user-dependant use case. Please normalize the strings before passing it to the library if you have such a requirement.
|
||||
- https://blog.golang.org/normalization
|
||||
|
||||
Install
|
||||
-------
|
||||
|
||||
go get github.com/agnivade/levenshtein
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/agnivade/levenshtein"
|
||||
)
|
||||
|
||||
func main() {
|
||||
s1 := "kitten"
|
||||
s2 := "sitting"
|
||||
distance := levenshtein.ComputeDistance(s1, s2)
|
||||
fmt.Printf("The distance between %s and %s is %d.\n", s1, s2, distance)
|
||||
// Output:
|
||||
// The distance between kitten and sitting is 3.
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Benchmarks
|
||||
----------
|
||||
|
||||
```
|
||||
name time/op
|
||||
Simple/ASCII-4 537ns ± 2%
|
||||
Simple/French-4 956ns ± 0%
|
||||
Simple/Nordic-4 1.95µs ± 1%
|
||||
Simple/Tibetan-4 1.53µs ± 2%
|
||||
|
||||
name alloc/op
|
||||
Simple/ASCII-4 96.0B ± 0%
|
||||
Simple/French-4 128B ± 0%
|
||||
Simple/Nordic-4 192B ± 0%
|
||||
Simple/Tibetan-4 144B ± 0%
|
||||
|
||||
name allocs/op
|
||||
Simple/ASCII-4 1.00 ± 0%
|
||||
Simple/French-4 1.00 ± 0%
|
||||
Simple/Nordic-4 1.00 ± 0%
|
||||
Simple/Tibetan-4 1.00 ± 0%
|
||||
```
|
||||
75
vendor/github.com/agnivade/levenshtein/levenshtein.go
generated
vendored
Normal file
75
vendor/github.com/agnivade/levenshtein/levenshtein.go
generated
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
// Package levenshtein is a Go implementation to calculate Levenshtein Distance.
|
||||
//
|
||||
// Implementation taken from
|
||||
// https://gist.github.com/andrei-m/982927#gistcomment-1931258
|
||||
package levenshtein
|
||||
|
||||
import "unicode/utf8"
|
||||
|
||||
// ComputeDistance computes the levenshtein distance between the two
|
||||
// strings passed as an argument. The return value is the levenshtein distance
|
||||
//
|
||||
// Works on runes (Unicode code points) but does not normalize
|
||||
// the input strings. See https://blog.golang.org/normalization
|
||||
// and the golang.org/x/text/unicode/norm pacage.
|
||||
func ComputeDistance(a, b string) int {
|
||||
if len(a) == 0 {
|
||||
return utf8.RuneCountInString(b)
|
||||
}
|
||||
|
||||
if len(b) == 0 {
|
||||
return utf8.RuneCountInString(a)
|
||||
}
|
||||
|
||||
if a == b {
|
||||
return 0
|
||||
}
|
||||
|
||||
// We need to convert to []rune if the strings are non-ascii.
|
||||
// This could be avoided by using utf8.RuneCountInString
|
||||
// and then doing some juggling with rune indices.
|
||||
// The primary challenge is keeping track of the previous rune.
|
||||
// With a range loop, its not that easy. And with a for-loop
|
||||
// we need to keep track of the inter-rune width using utf8.DecodeRuneInString
|
||||
s1 := []rune(a)
|
||||
s2 := []rune(b)
|
||||
|
||||
// swap to save some memory O(min(a,b)) instead of O(a)
|
||||
if len(s1) > len(s2) {
|
||||
s1, s2 = s2, s1
|
||||
}
|
||||
lenS1 := len(s1)
|
||||
lenS2 := len(s2)
|
||||
|
||||
// init the row
|
||||
x := make([]int, lenS1+1)
|
||||
for i := 0; i <= lenS1; i++ {
|
||||
x[i] = i
|
||||
}
|
||||
|
||||
// fill in the rest
|
||||
for i := 1; i <= lenS2; i++ {
|
||||
prev := i
|
||||
var current int
|
||||
|
||||
for j := 1; j <= lenS1; j++ {
|
||||
|
||||
if s2[i-1] == s1[j-1] {
|
||||
current = x[j-1] // match
|
||||
} else {
|
||||
current = min(min(x[j-1]+1, prev+1), x[j]+1)
|
||||
}
|
||||
x[j-1] = prev
|
||||
prev = current
|
||||
}
|
||||
x[lenS1] = prev
|
||||
}
|
||||
return x[lenS1]
|
||||
}
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
786
vendor/github.com/open-policy-agent/opa/ast/annotations.go
generated
vendored
Normal file
786
vendor/github.com/open-policy-agent/opa/ast/annotations.go
generated
vendored
Normal file
@@ -0,0 +1,786 @@
|
||||
// Copyright 2022 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ast
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/open-policy-agent/opa/internal/deepcopy"
|
||||
"github.com/open-policy-agent/opa/util"
|
||||
)
|
||||
|
||||
const (
|
||||
annotationScopePackage = "package"
|
||||
annotationScopeImport = "import"
|
||||
annotationScopeRule = "rule"
|
||||
annotationScopeDocument = "document"
|
||||
annotationScopeSubpackages = "subpackages"
|
||||
)
|
||||
|
||||
type (
|
||||
// Annotations represents metadata attached to other AST nodes such as rules.
|
||||
Annotations struct {
|
||||
Location *Location `json:"-"`
|
||||
Scope string `json:"scope"`
|
||||
Title string `json:"title,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Organizations []string `json:"organizations,omitempty"`
|
||||
RelatedResources []*RelatedResourceAnnotation `json:"related_resources,omitempty"`
|
||||
Authors []*AuthorAnnotation `json:"authors,omitempty"`
|
||||
Schemas []*SchemaAnnotation `json:"schemas,omitempty"`
|
||||
Custom map[string]interface{} `json:"custom,omitempty"`
|
||||
node Node
|
||||
}
|
||||
|
||||
// SchemaAnnotation contains a schema declaration for the document identified by the path.
|
||||
SchemaAnnotation struct {
|
||||
Path Ref `json:"path"`
|
||||
Schema Ref `json:"schema,omitempty"`
|
||||
Definition *interface{} `json:"definition,omitempty"`
|
||||
}
|
||||
|
||||
AuthorAnnotation struct {
|
||||
Name string `json:"name"`
|
||||
Email string `json:"email,omitempty"`
|
||||
}
|
||||
|
||||
RelatedResourceAnnotation struct {
|
||||
Ref url.URL `json:"ref"`
|
||||
Description string `json:"description,omitempty"`
|
||||
}
|
||||
|
||||
AnnotationSet struct {
|
||||
byRule map[*Rule][]*Annotations
|
||||
byPackage map[*Package]*Annotations
|
||||
byPath *annotationTreeNode
|
||||
modules []*Module // Modules this set was constructed from
|
||||
}
|
||||
|
||||
annotationTreeNode struct {
|
||||
Value *Annotations
|
||||
Children map[Value]*annotationTreeNode // we assume key elements are hashable (vars and strings only!)
|
||||
}
|
||||
|
||||
AnnotationsRef struct {
|
||||
Location *Location `json:"location"` // The location of the node the annotations are applied to
|
||||
Path Ref `json:"path"` // The path of the node the annotations are applied to
|
||||
Annotations *Annotations `json:"annotations,omitempty"`
|
||||
node Node // The node the annotations are applied to
|
||||
}
|
||||
)
|
||||
|
||||
func (a *Annotations) String() string {
|
||||
bs, _ := json.Marshal(a)
|
||||
return string(bs)
|
||||
}
|
||||
|
||||
// Loc returns the location of this annotation.
|
||||
func (a *Annotations) Loc() *Location {
|
||||
return a.Location
|
||||
}
|
||||
|
||||
// SetLoc updates the location of this annotation.
|
||||
func (a *Annotations) SetLoc(l *Location) {
|
||||
a.Location = l
|
||||
}
|
||||
|
||||
// Compare returns an integer indicating if a is less than, equal to, or greater
|
||||
// than other.
|
||||
func (a *Annotations) Compare(other *Annotations) int {
|
||||
|
||||
if a == nil && other == nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
if a == nil {
|
||||
return -1
|
||||
}
|
||||
|
||||
if other == nil {
|
||||
return 1
|
||||
}
|
||||
|
||||
if cmp := scopeCompare(a.Scope, other.Scope); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := strings.Compare(a.Title, other.Title); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := strings.Compare(a.Description, other.Description); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := compareStringLists(a.Organizations, other.Organizations); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := compareRelatedResources(a.RelatedResources, other.RelatedResources); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := compareAuthors(a.Authors, other.Authors); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := compareSchemas(a.Schemas, other.Schemas); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := util.Compare(a.Custom, other.Custom); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// GetTargetPath returns the path of the node these Annotations are applied to (the target)
|
||||
func (a *Annotations) GetTargetPath() Ref {
|
||||
switch n := a.node.(type) {
|
||||
case *Package:
|
||||
return n.Path
|
||||
case *Rule:
|
||||
return n.Path()
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func NewAnnotationsRef(a *Annotations) *AnnotationsRef {
|
||||
return &AnnotationsRef{
|
||||
Location: a.node.Loc(),
|
||||
Path: a.GetTargetPath(),
|
||||
Annotations: a,
|
||||
node: a.node,
|
||||
}
|
||||
}
|
||||
|
||||
func (ar *AnnotationsRef) GetPackage() *Package {
|
||||
switch n := ar.node.(type) {
|
||||
case *Package:
|
||||
return n
|
||||
case *Rule:
|
||||
return n.Module.Package
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (ar *AnnotationsRef) GetRule() *Rule {
|
||||
switch n := ar.node.(type) {
|
||||
case *Rule:
|
||||
return n
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func scopeCompare(s1, s2 string) int {
|
||||
|
||||
o1 := scopeOrder(s1)
|
||||
o2 := scopeOrder(s2)
|
||||
|
||||
if o2 < o1 {
|
||||
return 1
|
||||
} else if o2 > o1 {
|
||||
return -1
|
||||
}
|
||||
|
||||
if s1 < s2 {
|
||||
return -1
|
||||
} else if s2 < s1 {
|
||||
return 1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func scopeOrder(s string) int {
|
||||
switch s {
|
||||
case annotationScopeRule:
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func compareAuthors(a, b []*AuthorAnnotation) int {
|
||||
if len(a) > len(b) {
|
||||
return 1
|
||||
} else if len(a) < len(b) {
|
||||
return -1
|
||||
}
|
||||
|
||||
for i := 0; i < len(a); i++ {
|
||||
if cmp := a[i].Compare(b[i]); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func compareRelatedResources(a, b []*RelatedResourceAnnotation) int {
|
||||
if len(a) > len(b) {
|
||||
return 1
|
||||
} else if len(a) < len(b) {
|
||||
return -1
|
||||
}
|
||||
|
||||
for i := 0; i < len(a); i++ {
|
||||
if cmp := strings.Compare(a[i].String(), b[i].String()); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func compareSchemas(a, b []*SchemaAnnotation) int {
|
||||
max := len(a)
|
||||
if len(b) < max {
|
||||
max = len(b)
|
||||
}
|
||||
|
||||
for i := 0; i < max; i++ {
|
||||
if cmp := a[i].Compare(b[i]); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
}
|
||||
|
||||
if len(a) > len(b) {
|
||||
return 1
|
||||
} else if len(a) < len(b) {
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func compareStringLists(a, b []string) int {
|
||||
if len(a) > len(b) {
|
||||
return 1
|
||||
} else if len(a) < len(b) {
|
||||
return -1
|
||||
}
|
||||
|
||||
for i := 0; i < len(a); i++ {
|
||||
if cmp := strings.Compare(a[i], b[i]); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of s.
|
||||
func (a *Annotations) Copy(node Node) *Annotations {
|
||||
cpy := *a
|
||||
|
||||
cpy.Organizations = make([]string, len(a.Organizations))
|
||||
copy(cpy.Organizations, a.Organizations)
|
||||
|
||||
cpy.RelatedResources = make([]*RelatedResourceAnnotation, len(a.RelatedResources))
|
||||
for i := range a.RelatedResources {
|
||||
cpy.RelatedResources[i] = a.RelatedResources[i].Copy()
|
||||
}
|
||||
|
||||
cpy.Authors = make([]*AuthorAnnotation, len(a.Authors))
|
||||
for i := range a.Authors {
|
||||
cpy.Authors[i] = a.Authors[i].Copy()
|
||||
}
|
||||
|
||||
cpy.Schemas = make([]*SchemaAnnotation, len(a.Schemas))
|
||||
for i := range a.Schemas {
|
||||
cpy.Schemas[i] = a.Schemas[i].Copy()
|
||||
}
|
||||
|
||||
cpy.Custom = deepcopy.Map(a.Custom)
|
||||
|
||||
cpy.node = node
|
||||
|
||||
return &cpy
|
||||
}
|
||||
|
||||
// toObject constructs an AST Object from a.
|
||||
func (a *Annotations) toObject() (*Object, *Error) {
|
||||
obj := NewObject()
|
||||
|
||||
if a == nil {
|
||||
return &obj, nil
|
||||
}
|
||||
|
||||
if len(a.Scope) > 0 {
|
||||
obj.Insert(StringTerm("scope"), StringTerm(a.Scope))
|
||||
}
|
||||
|
||||
if len(a.Title) > 0 {
|
||||
obj.Insert(StringTerm("title"), StringTerm(a.Title))
|
||||
}
|
||||
|
||||
if len(a.Description) > 0 {
|
||||
obj.Insert(StringTerm("description"), StringTerm(a.Description))
|
||||
}
|
||||
|
||||
if len(a.Organizations) > 0 {
|
||||
orgs := make([]*Term, 0, len(a.Organizations))
|
||||
for _, org := range a.Organizations {
|
||||
orgs = append(orgs, StringTerm(org))
|
||||
}
|
||||
obj.Insert(StringTerm("organizations"), ArrayTerm(orgs...))
|
||||
}
|
||||
|
||||
if len(a.RelatedResources) > 0 {
|
||||
rrs := make([]*Term, 0, len(a.RelatedResources))
|
||||
for _, rr := range a.RelatedResources {
|
||||
rrObj := NewObject(Item(StringTerm("ref"), StringTerm(rr.Ref.String())))
|
||||
if len(rr.Description) > 0 {
|
||||
rrObj.Insert(StringTerm("description"), StringTerm(rr.Description))
|
||||
}
|
||||
rrs = append(rrs, NewTerm(rrObj))
|
||||
}
|
||||
obj.Insert(StringTerm("related_resources"), ArrayTerm(rrs...))
|
||||
}
|
||||
|
||||
if len(a.Authors) > 0 {
|
||||
as := make([]*Term, 0, len(a.Authors))
|
||||
for _, author := range a.Authors {
|
||||
aObj := NewObject()
|
||||
if len(author.Name) > 0 {
|
||||
aObj.Insert(StringTerm("name"), StringTerm(author.Name))
|
||||
}
|
||||
if len(author.Email) > 0 {
|
||||
aObj.Insert(StringTerm("email"), StringTerm(author.Email))
|
||||
}
|
||||
as = append(as, NewTerm(aObj))
|
||||
}
|
||||
obj.Insert(StringTerm("authors"), ArrayTerm(as...))
|
||||
}
|
||||
|
||||
if len(a.Schemas) > 0 {
|
||||
ss := make([]*Term, 0, len(a.Schemas))
|
||||
for _, s := range a.Schemas {
|
||||
sObj := NewObject()
|
||||
if len(s.Path) > 0 {
|
||||
sObj.Insert(StringTerm("path"), NewTerm(s.Path.toArray()))
|
||||
}
|
||||
if len(s.Schema) > 0 {
|
||||
sObj.Insert(StringTerm("schema"), NewTerm(s.Schema.toArray()))
|
||||
}
|
||||
if s.Definition != nil {
|
||||
def, err := InterfaceToValue(s.Definition)
|
||||
if err != nil {
|
||||
return nil, NewError(CompileErr, a.Location, "invalid definition in schema annotation: %s", err.Error())
|
||||
}
|
||||
sObj.Insert(StringTerm("definition"), NewTerm(def))
|
||||
}
|
||||
ss = append(ss, NewTerm(sObj))
|
||||
}
|
||||
obj.Insert(StringTerm("schemas"), ArrayTerm(ss...))
|
||||
}
|
||||
|
||||
if len(a.Custom) > 0 {
|
||||
c, err := InterfaceToValue(a.Custom)
|
||||
if err != nil {
|
||||
return nil, NewError(CompileErr, a.Location, "invalid custom annotation %s", err.Error())
|
||||
}
|
||||
obj.Insert(StringTerm("custom"), NewTerm(c))
|
||||
}
|
||||
|
||||
return &obj, nil
|
||||
}
|
||||
|
||||
func attachAnnotationsNodes(mod *Module) Errors {
|
||||
var errs Errors
|
||||
|
||||
// Find first non-annotation statement following each annotation and attach
|
||||
// the annotation to that statement.
|
||||
for _, a := range mod.Annotations {
|
||||
for _, stmt := range mod.stmts {
|
||||
_, ok := stmt.(*Annotations)
|
||||
if !ok {
|
||||
if stmt.Loc().Row > a.Location.Row {
|
||||
a.node = stmt
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if a.Scope == "" {
|
||||
switch a.node.(type) {
|
||||
case *Rule:
|
||||
a.Scope = annotationScopeRule
|
||||
case *Package:
|
||||
a.Scope = annotationScopePackage
|
||||
case *Import:
|
||||
a.Scope = annotationScopeImport
|
||||
}
|
||||
}
|
||||
|
||||
if err := validateAnnotationScopeAttachment(a); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func validateAnnotationScopeAttachment(a *Annotations) *Error {
|
||||
|
||||
switch a.Scope {
|
||||
case annotationScopeRule, annotationScopeDocument:
|
||||
if _, ok := a.node.(*Rule); ok {
|
||||
return nil
|
||||
}
|
||||
return newScopeAttachmentErr(a, "rule")
|
||||
case annotationScopePackage, annotationScopeSubpackages:
|
||||
if _, ok := a.node.(*Package); ok {
|
||||
return nil
|
||||
}
|
||||
return newScopeAttachmentErr(a, "package")
|
||||
}
|
||||
|
||||
return NewError(ParseErr, a.Loc(), "invalid annotation scope '%v'", a.Scope)
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of a.
|
||||
func (a *AuthorAnnotation) Copy() *AuthorAnnotation {
|
||||
cpy := *a
|
||||
return &cpy
|
||||
}
|
||||
|
||||
// Compare returns an integer indicating if s is less than, equal to, or greater
|
||||
// than other.
|
||||
func (a *AuthorAnnotation) Compare(other *AuthorAnnotation) int {
|
||||
if cmp := strings.Compare(a.Name, other.Name); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := strings.Compare(a.Email, other.Email); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func (a *AuthorAnnotation) String() string {
|
||||
if len(a.Email) == 0 {
|
||||
return a.Name
|
||||
} else if len(a.Name) == 0 {
|
||||
return fmt.Sprintf("<%s>", a.Email)
|
||||
} else {
|
||||
return fmt.Sprintf("%s <%s>", a.Name, a.Email)
|
||||
}
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of rr.
|
||||
func (rr *RelatedResourceAnnotation) Copy() *RelatedResourceAnnotation {
|
||||
cpy := *rr
|
||||
return &cpy
|
||||
}
|
||||
|
||||
// Compare returns an integer indicating if s is less than, equal to, or greater
|
||||
// than other.
|
||||
func (rr *RelatedResourceAnnotation) Compare(other *RelatedResourceAnnotation) int {
|
||||
if cmp := strings.Compare(rr.Description, other.Description); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := strings.Compare(rr.Ref.String(), other.Ref.String()); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func (rr *RelatedResourceAnnotation) String() string {
|
||||
bs, _ := json.Marshal(rr)
|
||||
return string(bs)
|
||||
}
|
||||
|
||||
func (rr *RelatedResourceAnnotation) MarshalJSON() ([]byte, error) {
|
||||
d := map[string]interface{}{
|
||||
"ref": rr.Ref.String(),
|
||||
}
|
||||
|
||||
if len(rr.Description) > 0 {
|
||||
d["description"] = rr.Description
|
||||
}
|
||||
|
||||
return json.Marshal(d)
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of s.
|
||||
func (s *SchemaAnnotation) Copy() *SchemaAnnotation {
|
||||
cpy := *s
|
||||
return &cpy
|
||||
}
|
||||
|
||||
// Compare returns an integer indicating if s is less than, equal to, or greater
|
||||
// than other.
|
||||
func (s *SchemaAnnotation) Compare(other *SchemaAnnotation) int {
|
||||
|
||||
if cmp := s.Path.Compare(other.Path); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if cmp := s.Schema.Compare(other.Schema); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
|
||||
if s.Definition != nil && other.Definition == nil {
|
||||
return -1
|
||||
} else if s.Definition == nil && other.Definition != nil {
|
||||
return 1
|
||||
} else if s.Definition != nil && other.Definition != nil {
|
||||
return util.Compare(*s.Definition, *other.Definition)
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func (s *SchemaAnnotation) String() string {
|
||||
bs, _ := json.Marshal(s)
|
||||
return string(bs)
|
||||
}
|
||||
|
||||
func newAnnotationSet() *AnnotationSet {
|
||||
return &AnnotationSet{
|
||||
byRule: map[*Rule][]*Annotations{},
|
||||
byPackage: map[*Package]*Annotations{},
|
||||
byPath: newAnnotationTree(),
|
||||
}
|
||||
}
|
||||
|
||||
func BuildAnnotationSet(modules []*Module) (*AnnotationSet, Errors) {
|
||||
as := newAnnotationSet()
|
||||
var errs Errors
|
||||
for _, m := range modules {
|
||||
for _, a := range m.Annotations {
|
||||
if err := as.add(a); err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(errs) > 0 {
|
||||
return nil, errs
|
||||
}
|
||||
as.modules = modules
|
||||
return as, nil
|
||||
}
|
||||
|
||||
func (as *AnnotationSet) add(a *Annotations) *Error {
|
||||
switch a.Scope {
|
||||
case annotationScopeRule:
|
||||
rule := a.node.(*Rule)
|
||||
as.byRule[rule] = append(as.byRule[rule], a)
|
||||
case annotationScopePackage:
|
||||
pkg := a.node.(*Package)
|
||||
if exist, ok := as.byPackage[pkg]; ok {
|
||||
return errAnnotationRedeclared(a, exist.Location)
|
||||
}
|
||||
as.byPackage[pkg] = a
|
||||
case annotationScopeDocument:
|
||||
rule := a.node.(*Rule)
|
||||
path := rule.Path()
|
||||
x := as.byPath.get(path)
|
||||
if x != nil {
|
||||
return errAnnotationRedeclared(a, x.Value.Location)
|
||||
}
|
||||
as.byPath.insert(path, a)
|
||||
case annotationScopeSubpackages:
|
||||
pkg := a.node.(*Package)
|
||||
x := as.byPath.get(pkg.Path)
|
||||
if x != nil && x.Value != nil {
|
||||
return errAnnotationRedeclared(a, x.Value.Location)
|
||||
}
|
||||
as.byPath.insert(pkg.Path, a)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (as *AnnotationSet) GetRuleScope(r *Rule) []*Annotations {
|
||||
if as == nil {
|
||||
return nil
|
||||
}
|
||||
return as.byRule[r]
|
||||
}
|
||||
|
||||
func (as *AnnotationSet) GetSubpackagesScope(path Ref) []*Annotations {
|
||||
if as == nil {
|
||||
return nil
|
||||
}
|
||||
return as.byPath.ancestors(path)
|
||||
}
|
||||
|
||||
func (as *AnnotationSet) GetDocumentScope(path Ref) *Annotations {
|
||||
if as == nil {
|
||||
return nil
|
||||
}
|
||||
if node := as.byPath.get(path); node != nil {
|
||||
return node.Value
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (as *AnnotationSet) GetPackageScope(pkg *Package) *Annotations {
|
||||
if as == nil {
|
||||
return nil
|
||||
}
|
||||
return as.byPackage[pkg]
|
||||
}
|
||||
|
||||
// Flatten returns a flattened list view of this AnnotationSet.
|
||||
// The returned slice is sorted, first by the annotations' target path, then by their target location
|
||||
func (as *AnnotationSet) Flatten() []*AnnotationsRef {
|
||||
// This preallocation often won't be optimal, but it's superior to starting with a nil slice.
|
||||
refs := make([]*AnnotationsRef, 0, len(as.byPath.Children)+len(as.byRule)+len(as.byPackage))
|
||||
|
||||
refs = as.byPath.flatten(refs)
|
||||
|
||||
for _, a := range as.byPackage {
|
||||
refs = append(refs, NewAnnotationsRef(a))
|
||||
}
|
||||
|
||||
for _, as := range as.byRule {
|
||||
for _, a := range as {
|
||||
refs = append(refs, NewAnnotationsRef(a))
|
||||
}
|
||||
}
|
||||
|
||||
// Sort by path, then annotation location, for stable output
|
||||
sort.SliceStable(refs, func(i, j int) bool {
|
||||
if refs[i].Path.Compare(refs[j].Path) < 0 {
|
||||
return true
|
||||
}
|
||||
if refs[i].Annotations.Location.Compare(refs[j].Annotations.Location) < 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
return refs
|
||||
}
|
||||
|
||||
// Chain returns the chain of annotations leading up to the given rule.
|
||||
// The returned slice is ordered as follows
|
||||
// 0. Entries for the given rule, ordered from the METADATA block declared immediately above the rule, to the block declared farthest away (always at least one entry)
|
||||
// 1. The 'document' scope entry, if any
|
||||
// 2. The 'package' scope entry, if any
|
||||
// 3. Entries for the 'subpackages' scope, if any; ordered from the closest package path to the fartest. E.g.: 'do.re.mi', 'do.re', 'do'
|
||||
// The returned slice is guaranteed to always contain at least one entry, corresponding to the given rule.
|
||||
func (as *AnnotationSet) Chain(rule *Rule) []*AnnotationsRef {
|
||||
var refs []*AnnotationsRef
|
||||
|
||||
ruleAnnots := as.GetRuleScope(rule)
|
||||
|
||||
if len(ruleAnnots) >= 1 {
|
||||
for _, a := range ruleAnnots {
|
||||
refs = append(refs, NewAnnotationsRef(a))
|
||||
}
|
||||
} else {
|
||||
// Make sure there is always a leading entry representing the passed rule, even if it has no annotations
|
||||
refs = append(refs, &AnnotationsRef{
|
||||
Location: rule.Location,
|
||||
Path: rule.Path(),
|
||||
node: rule,
|
||||
})
|
||||
}
|
||||
|
||||
if len(refs) > 1 {
|
||||
// Sort by annotation location; chain must start with annotations declared closest to rule, then going outward
|
||||
sort.SliceStable(refs, func(i, j int) bool {
|
||||
return refs[i].Annotations.Location.Compare(refs[j].Annotations.Location) > 0
|
||||
})
|
||||
}
|
||||
|
||||
docAnnots := as.GetDocumentScope(rule.Path())
|
||||
if docAnnots != nil {
|
||||
refs = append(refs, NewAnnotationsRef(docAnnots))
|
||||
}
|
||||
|
||||
pkg := rule.Module.Package
|
||||
pkgAnnots := as.GetPackageScope(pkg)
|
||||
if pkgAnnots != nil {
|
||||
refs = append(refs, NewAnnotationsRef(pkgAnnots))
|
||||
}
|
||||
|
||||
subPkgAnnots := as.GetSubpackagesScope(pkg.Path)
|
||||
// We need to reverse the order, as subPkgAnnots ordering will start at the root,
|
||||
// whereas we want to end at the root.
|
||||
for i := len(subPkgAnnots) - 1; i >= 0; i-- {
|
||||
refs = append(refs, NewAnnotationsRef(subPkgAnnots[i]))
|
||||
}
|
||||
|
||||
return refs
|
||||
}
|
||||
|
||||
func newAnnotationTree() *annotationTreeNode {
|
||||
return &annotationTreeNode{
|
||||
Value: nil,
|
||||
Children: map[Value]*annotationTreeNode{},
|
||||
}
|
||||
}
|
||||
|
||||
func (t *annotationTreeNode) insert(path Ref, value *Annotations) {
|
||||
node := t
|
||||
for _, k := range path {
|
||||
child, ok := node.Children[k.Value]
|
||||
if !ok {
|
||||
child = newAnnotationTree()
|
||||
node.Children[k.Value] = child
|
||||
}
|
||||
node = child
|
||||
}
|
||||
node.Value = value
|
||||
}
|
||||
|
||||
func (t *annotationTreeNode) get(path Ref) *annotationTreeNode {
|
||||
node := t
|
||||
for _, k := range path {
|
||||
if node == nil {
|
||||
return nil
|
||||
}
|
||||
child, ok := node.Children[k.Value]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
node = child
|
||||
}
|
||||
return node
|
||||
}
|
||||
|
||||
// ancestors returns a slice of annotations in ascending order, starting with the root of ref; e.g.: 'root', 'root.foo', 'root.foo.bar'.
|
||||
func (t *annotationTreeNode) ancestors(path Ref) (result []*Annotations) {
|
||||
node := t
|
||||
for _, k := range path {
|
||||
if node == nil {
|
||||
return result
|
||||
}
|
||||
child, ok := node.Children[k.Value]
|
||||
if !ok {
|
||||
return result
|
||||
}
|
||||
if child.Value != nil {
|
||||
result = append(result, child.Value)
|
||||
}
|
||||
node = child
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (t *annotationTreeNode) flatten(refs []*AnnotationsRef) []*AnnotationsRef {
|
||||
if a := t.Value; a != nil {
|
||||
refs = append(refs, NewAnnotationsRef(a))
|
||||
}
|
||||
for _, c := range t.Children {
|
||||
refs = c.flatten(refs)
|
||||
}
|
||||
return refs
|
||||
}
|
||||
2531
vendor/github.com/open-policy-agent/opa/ast/builtins.go
generated
vendored
2531
vendor/github.com/open-policy-agent/opa/ast/builtins.go
generated
vendored
File diff suppressed because it is too large
Load Diff
116
vendor/github.com/open-policy-agent/opa/ast/capabilities.go
generated
vendored
Normal file
116
vendor/github.com/open-policy-agent/opa/ast/capabilities.go
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ast
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
caps "github.com/open-policy-agent/opa/capabilities"
|
||||
"github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities"
|
||||
"github.com/open-policy-agent/opa/util"
|
||||
)
|
||||
|
||||
// Capabilities defines a structure containing data that describes the capabilities
|
||||
// or features supported by a particular version of OPA.
|
||||
type Capabilities struct {
|
||||
Builtins []*Builtin `json:"builtins"`
|
||||
FutureKeywords []string `json:"future_keywords"`
|
||||
WasmABIVersions []WasmABIVersion `json:"wasm_abi_versions"`
|
||||
|
||||
// allow_net is an array of hostnames or IP addresses, that an OPA instance is
|
||||
// allowed to connect to.
|
||||
// If omitted, ANY host can be connected to. If empty, NO host can be connected to.
|
||||
// As of now, this only controls fetching remote refs for using JSON Schemas in
|
||||
// the type checker.
|
||||
// TODO(sr): support ports to further restrict connection peers
|
||||
// TODO(sr): support restricting `http.send` using the same mechanism (see https://github.com/open-policy-agent/opa/issues/3665)
|
||||
AllowNet []string `json:"allow_net,omitempty"`
|
||||
}
|
||||
|
||||
// WasmABIVersion captures the Wasm ABI version. Its `Minor` version is indicating
|
||||
// backwards-compatible changes.
|
||||
type WasmABIVersion struct {
|
||||
Version int `json:"version"`
|
||||
Minor int `json:"minor_version"`
|
||||
}
|
||||
|
||||
// CapabilitiesForThisVersion returns the capabilities of this version of OPA.
|
||||
func CapabilitiesForThisVersion() *Capabilities {
|
||||
f := &Capabilities{}
|
||||
|
||||
for _, vers := range capabilities.ABIVersions() {
|
||||
f.WasmABIVersions = append(f.WasmABIVersions, WasmABIVersion{Version: vers[0], Minor: vers[1]})
|
||||
}
|
||||
|
||||
f.Builtins = make([]*Builtin, len(Builtins))
|
||||
copy(f.Builtins, Builtins)
|
||||
sort.Slice(f.Builtins, func(i, j int) bool {
|
||||
return f.Builtins[i].Name < f.Builtins[j].Name
|
||||
})
|
||||
|
||||
for kw := range futureKeywords {
|
||||
f.FutureKeywords = append(f.FutureKeywords, kw)
|
||||
}
|
||||
sort.Strings(f.FutureKeywords)
|
||||
|
||||
return f
|
||||
}
|
||||
|
||||
// LoadCapabilitiesJSON loads a JSON serialized capabilities structure from the reader r.
|
||||
func LoadCapabilitiesJSON(r io.Reader) (*Capabilities, error) {
|
||||
d := util.NewJSONDecoder(r)
|
||||
var c Capabilities
|
||||
return &c, d.Decode(&c)
|
||||
}
|
||||
|
||||
// LoadCapabilitiesVersion loads a JSON serialized capabilities structure from the specific version.
|
||||
func LoadCapabilitiesVersion(version string) (*Capabilities, error) {
|
||||
cvs, err := LoadCapabilitiesVersions()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, cv := range cvs {
|
||||
if cv == version {
|
||||
cont, err := caps.FS.ReadFile(cv + ".json")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return LoadCapabilitiesJSON(bytes.NewReader(cont))
|
||||
}
|
||||
|
||||
}
|
||||
return nil, fmt.Errorf("no capabilities version found %v", version)
|
||||
}
|
||||
|
||||
// LoadCapabilitiesFile loads a JSON serialized capabilities structure from a file.
|
||||
func LoadCapabilitiesFile(file string) (*Capabilities, error) {
|
||||
fd, err := os.Open(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer fd.Close()
|
||||
return LoadCapabilitiesJSON(fd)
|
||||
}
|
||||
|
||||
// LoadCapabilitiesVersions loads all capabilities versions
|
||||
func LoadCapabilitiesVersions() ([]string, error) {
|
||||
ents, err := caps.FS.ReadDir(".")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
capabilitiesVersions := make([]string, 0, len(ents))
|
||||
for _, ent := range ents {
|
||||
capabilitiesVersions = append(capabilitiesVersions, strings.Replace(ent.Name(), ".json", "", 1))
|
||||
}
|
||||
return capabilitiesVersions, nil
|
||||
}
|
||||
544
vendor/github.com/open-policy-agent/opa/ast/check.go
generated
vendored
544
vendor/github.com/open-policy-agent/opa/ast/check.go
generated
vendored
@@ -13,7 +13,7 @@ import (
|
||||
"github.com/open-policy-agent/opa/util"
|
||||
)
|
||||
|
||||
type rewriteVars func(x Ref) Ref
|
||||
type varRewriter func(Ref) Ref
|
||||
|
||||
// exprChecker defines the interface for executing type checking on a single
|
||||
// expression. The exprChecker must update the provided TypeEnv with inferred
|
||||
@@ -26,7 +26,10 @@ type exprChecker func(*TypeEnv, *Expr) *Error
|
||||
type typeChecker struct {
|
||||
errs Errors
|
||||
exprCheckers map[string]exprChecker
|
||||
varRewriter rewriteVars
|
||||
varRewriter varRewriter
|
||||
ss *SchemaSet
|
||||
allowNet []string
|
||||
input types.Type
|
||||
}
|
||||
|
||||
// newTypeChecker returns a new typeChecker object that has no errors.
|
||||
@@ -38,27 +41,69 @@ func newTypeChecker() *typeChecker {
|
||||
return tc
|
||||
}
|
||||
|
||||
func (tc *typeChecker) WithVarRewriter(f rewriteVars) *typeChecker {
|
||||
func (tc *typeChecker) newEnv(exist *TypeEnv) *TypeEnv {
|
||||
if exist != nil {
|
||||
return exist.wrap()
|
||||
}
|
||||
env := newTypeEnv(tc.copy)
|
||||
if tc.input != nil {
|
||||
env.tree.Put(InputRootRef, tc.input)
|
||||
}
|
||||
return env
|
||||
}
|
||||
|
||||
func (tc *typeChecker) copy() *typeChecker {
|
||||
return newTypeChecker().
|
||||
WithVarRewriter(tc.varRewriter).
|
||||
WithSchemaSet(tc.ss).
|
||||
WithAllowNet(tc.allowNet).
|
||||
WithInputType(tc.input)
|
||||
}
|
||||
|
||||
func (tc *typeChecker) WithSchemaSet(ss *SchemaSet) *typeChecker {
|
||||
tc.ss = ss
|
||||
return tc
|
||||
}
|
||||
|
||||
func (tc *typeChecker) WithAllowNet(hosts []string) *typeChecker {
|
||||
tc.allowNet = hosts
|
||||
return tc
|
||||
}
|
||||
|
||||
func (tc *typeChecker) WithVarRewriter(f varRewriter) *typeChecker {
|
||||
tc.varRewriter = f
|
||||
return tc
|
||||
}
|
||||
|
||||
func (tc *typeChecker) WithInputType(tpe types.Type) *typeChecker {
|
||||
tc.input = tpe
|
||||
return tc
|
||||
}
|
||||
|
||||
// Env returns a type environment for the specified built-ins with any other
|
||||
// global types configured on the checker. In practice, this is the default
|
||||
// environment that other statements will be checked against.
|
||||
func (tc *typeChecker) Env(builtins map[string]*Builtin) *TypeEnv {
|
||||
env := tc.newEnv(nil)
|
||||
for _, bi := range builtins {
|
||||
env.tree.Put(bi.Ref(), bi.Decl)
|
||||
}
|
||||
return env
|
||||
}
|
||||
|
||||
// CheckBody runs type checking on the body and returns a TypeEnv if no errors
|
||||
// are found. The resulting TypeEnv wraps the provided one. The resulting
|
||||
// TypeEnv will be able to resolve types of vars contained in the body.
|
||||
func (tc *typeChecker) CheckBody(env *TypeEnv, body Body) (*TypeEnv, Errors) {
|
||||
|
||||
if env == nil {
|
||||
env = NewTypeEnv()
|
||||
} else {
|
||||
env = env.wrap()
|
||||
}
|
||||
errors := []*Error{}
|
||||
env = tc.newEnv(env)
|
||||
|
||||
WalkExprs(body, func(expr *Expr) bool {
|
||||
|
||||
closureErrs := tc.checkClosures(env, expr)
|
||||
for _, err := range closureErrs {
|
||||
tc.err(err)
|
||||
errors = append(errors, err)
|
||||
}
|
||||
|
||||
hasClosureErrors := len(closureErrs) > 0
|
||||
@@ -66,7 +111,7 @@ func (tc *typeChecker) CheckBody(env *TypeEnv, body Body) (*TypeEnv, Errors) {
|
||||
vis := newRefChecker(env, tc.varRewriter)
|
||||
NewGenericVisitor(vis.Visit).Walk(expr)
|
||||
for _, err := range vis.errs {
|
||||
tc.err(err)
|
||||
errors = append(errors, err)
|
||||
}
|
||||
|
||||
hasRefErrors := len(vis.errs) > 0
|
||||
@@ -78,27 +123,23 @@ func (tc *typeChecker) CheckBody(env *TypeEnv, body Body) (*TypeEnv, Errors) {
|
||||
// likely to be the result of the more specific error.
|
||||
skip := (hasClosureErrors || hasRefErrors) && causedByNilType(err)
|
||||
if !skip {
|
||||
tc.err(err)
|
||||
errors = append(errors, err)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
return env, tc.errs
|
||||
tc.err(errors)
|
||||
return env, errors
|
||||
}
|
||||
|
||||
// CheckTypes runs type checking on the rules returns a TypeEnv if no errors
|
||||
// are found. The resulting TypeEnv wraps the provided one. The resulting
|
||||
// TypeEnv will be able to resolve types of refs that refer to rules.
|
||||
func (tc *typeChecker) CheckTypes(env *TypeEnv, sorted []util.T) (*TypeEnv, Errors) {
|
||||
if env == nil {
|
||||
env = NewTypeEnv()
|
||||
} else {
|
||||
env = env.wrap()
|
||||
}
|
||||
func (tc *typeChecker) CheckTypes(env *TypeEnv, sorted []util.T, as *AnnotationSet) (*TypeEnv, Errors) {
|
||||
env = tc.newEnv(env)
|
||||
for _, s := range sorted {
|
||||
tc.checkRule(env, s.(*Rule))
|
||||
tc.checkRule(env, as, s.(*Rule))
|
||||
}
|
||||
tc.errs.Sort()
|
||||
return env, tc.errs
|
||||
@@ -109,19 +150,19 @@ func (tc *typeChecker) checkClosures(env *TypeEnv, expr *Expr) Errors {
|
||||
WalkClosures(expr, func(x interface{}) bool {
|
||||
switch x := x.(type) {
|
||||
case *ArrayComprehension:
|
||||
_, errs := newTypeChecker().WithVarRewriter(tc.varRewriter).CheckBody(env, x.Body)
|
||||
_, errs := tc.copy().CheckBody(env, x.Body)
|
||||
if len(errs) > 0 {
|
||||
result = errs
|
||||
return true
|
||||
}
|
||||
case *SetComprehension:
|
||||
_, errs := newTypeChecker().WithVarRewriter(tc.varRewriter).CheckBody(env, x.Body)
|
||||
_, errs := tc.copy().CheckBody(env, x.Body)
|
||||
if len(errs) > 0 {
|
||||
result = errs
|
||||
return true
|
||||
}
|
||||
case *ObjectComprehension:
|
||||
_, errs := newTypeChecker().WithVarRewriter(tc.varRewriter).CheckBody(env, x.Body)
|
||||
_, errs := tc.copy().CheckBody(env, x.Body)
|
||||
if len(errs) > 0 {
|
||||
result = errs
|
||||
return true
|
||||
@@ -132,83 +173,103 @@ func (tc *typeChecker) checkClosures(env *TypeEnv, expr *Expr) Errors {
|
||||
return result
|
||||
}
|
||||
|
||||
func (tc *typeChecker) checkLanguageBuiltins(env *TypeEnv, builtins map[string]*Builtin) *TypeEnv {
|
||||
if env == nil {
|
||||
env = NewTypeEnv()
|
||||
} else {
|
||||
env = env.wrap()
|
||||
}
|
||||
for _, bi := range builtins {
|
||||
env.tree.Put(bi.Ref(), bi.Decl)
|
||||
}
|
||||
return env
|
||||
}
|
||||
func (tc *typeChecker) checkRule(env *TypeEnv, as *AnnotationSet, rule *Rule) {
|
||||
|
||||
func (tc *typeChecker) checkRule(env *TypeEnv, rule *Rule) {
|
||||
env = env.wrap()
|
||||
|
||||
if schemaAnnots := getRuleAnnotation(as, rule); schemaAnnots != nil {
|
||||
for _, schemaAnnot := range schemaAnnots {
|
||||
ref, refType, err := processAnnotation(tc.ss, schemaAnnot, rule, tc.allowNet)
|
||||
if err != nil {
|
||||
tc.err([]*Error{err})
|
||||
continue
|
||||
}
|
||||
prefixRef, t := getPrefix(env, ref)
|
||||
if t == nil || len(prefixRef) == len(ref) {
|
||||
env.tree.Put(ref, refType)
|
||||
} else {
|
||||
newType, err := override(ref[len(prefixRef):], t, refType, rule)
|
||||
if err != nil {
|
||||
tc.err([]*Error{err})
|
||||
continue
|
||||
}
|
||||
env.tree.Put(prefixRef, newType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cpy, err := tc.CheckBody(env, rule.Body)
|
||||
env = env.next
|
||||
path := rule.Path()
|
||||
|
||||
if len(err) == 0 {
|
||||
if len(err) > 0 {
|
||||
// if the rule/function contains an error, add it to the type env so
|
||||
// that expressions that refer to this rule/function do not encounter
|
||||
// type errors.
|
||||
env.tree.Put(path, types.A)
|
||||
return
|
||||
}
|
||||
|
||||
path := rule.Path()
|
||||
var tpe types.Type
|
||||
var tpe types.Type
|
||||
|
||||
if len(rule.Head.Args) > 0 {
|
||||
if len(rule.Head.Args) > 0 {
|
||||
|
||||
// If args are not referred to in body, infer as any.
|
||||
WalkVars(rule.Head.Args, func(v Var) bool {
|
||||
if cpy.Get(v) == nil {
|
||||
cpy.tree.PutOne(v, types.A)
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
// Construct function type.
|
||||
args := make([]types.Type, len(rule.Head.Args))
|
||||
for i := 0; i < len(rule.Head.Args); i++ {
|
||||
args[i] = cpy.Get(rule.Head.Args[i])
|
||||
// If args are not referred to in body, infer as any.
|
||||
WalkVars(rule.Head.Args, func(v Var) bool {
|
||||
if cpy.Get(v) == nil {
|
||||
cpy.tree.PutOne(v, types.A)
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
f := types.NewFunction(args, cpy.Get(rule.Head.Value))
|
||||
|
||||
// Union with existing.
|
||||
exist := env.tree.Get(path)
|
||||
tpe = types.Or(exist, f)
|
||||
|
||||
} else {
|
||||
switch rule.Head.DocKind() {
|
||||
case CompleteDoc:
|
||||
typeV := cpy.Get(rule.Head.Value)
|
||||
if typeV != nil {
|
||||
exist := env.tree.Get(path)
|
||||
tpe = types.Or(typeV, exist)
|
||||
}
|
||||
case PartialObjectDoc:
|
||||
typeK := cpy.Get(rule.Head.Key)
|
||||
typeV := cpy.Get(rule.Head.Value)
|
||||
if typeK != nil && typeV != nil {
|
||||
exist := env.tree.Get(path)
|
||||
typeV = types.Or(types.Values(exist), typeV)
|
||||
typeK = types.Or(types.Keys(exist), typeK)
|
||||
tpe = types.NewObject(nil, types.NewDynamicProperty(typeK, typeV))
|
||||
}
|
||||
case PartialSetDoc:
|
||||
typeK := cpy.Get(rule.Head.Key)
|
||||
if typeK != nil {
|
||||
exist := env.tree.Get(path)
|
||||
typeK = types.Or(types.Keys(exist), typeK)
|
||||
tpe = types.NewSet(typeK)
|
||||
}
|
||||
}
|
||||
// Construct function type.
|
||||
args := make([]types.Type, len(rule.Head.Args))
|
||||
for i := 0; i < len(rule.Head.Args); i++ {
|
||||
args[i] = cpy.Get(rule.Head.Args[i])
|
||||
}
|
||||
|
||||
if tpe != nil {
|
||||
env.tree.Put(path, tpe)
|
||||
f := types.NewFunction(args, cpy.Get(rule.Head.Value))
|
||||
|
||||
// Union with existing.
|
||||
exist := env.tree.Get(path)
|
||||
tpe = types.Or(exist, f)
|
||||
|
||||
} else {
|
||||
switch rule.Head.DocKind() {
|
||||
case CompleteDoc:
|
||||
typeV := cpy.Get(rule.Head.Value)
|
||||
if typeV != nil {
|
||||
exist := env.tree.Get(path)
|
||||
tpe = types.Or(typeV, exist)
|
||||
}
|
||||
case PartialObjectDoc:
|
||||
typeK := cpy.Get(rule.Head.Key)
|
||||
typeV := cpy.Get(rule.Head.Value)
|
||||
if typeK != nil && typeV != nil {
|
||||
exist := env.tree.Get(path)
|
||||
typeV = types.Or(types.Values(exist), typeV)
|
||||
typeK = types.Or(types.Keys(exist), typeK)
|
||||
tpe = types.NewObject(nil, types.NewDynamicProperty(typeK, typeV))
|
||||
}
|
||||
case PartialSetDoc:
|
||||
typeK := cpy.Get(rule.Head.Key)
|
||||
if typeK != nil {
|
||||
exist := env.tree.Get(path)
|
||||
typeK = types.Or(types.Keys(exist), typeK)
|
||||
tpe = types.NewSet(typeK)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if tpe != nil {
|
||||
env.tree.Put(path, tpe)
|
||||
}
|
||||
}
|
||||
|
||||
func (tc *typeChecker) checkExpr(env *TypeEnv, expr *Expr) *Error {
|
||||
if err := tc.checkExprWith(env, expr, 0); err != nil {
|
||||
return err
|
||||
}
|
||||
if !expr.IsCall() {
|
||||
return nil
|
||||
}
|
||||
@@ -241,32 +302,40 @@ func (tc *typeChecker) checkExprBuiltin(env *TypeEnv, expr *Expr) *Error {
|
||||
return NewError(TypeErr, expr.Location, "undefined function %v", name)
|
||||
}
|
||||
|
||||
// check if the expression refers to a function that contains an error
|
||||
_, ok := tpe.(types.Any)
|
||||
if ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
ftpe, ok := tpe.(*types.Function)
|
||||
if !ok {
|
||||
return NewError(TypeErr, expr.Location, "undefined function %v", name)
|
||||
}
|
||||
|
||||
maxArgs := len(ftpe.Args())
|
||||
expArgs := ftpe.Args()
|
||||
fargs := ftpe.FuncArgs()
|
||||
namedFargs := ftpe.NamedFuncArgs()
|
||||
|
||||
if ftpe.Result() != nil {
|
||||
maxArgs++
|
||||
expArgs = append(expArgs, ftpe.Result())
|
||||
fargs.Args = append(fargs.Args, ftpe.Result())
|
||||
namedFargs.Args = append(namedFargs.Args, ftpe.NamedResult())
|
||||
}
|
||||
|
||||
if len(args) > maxArgs {
|
||||
return newArgError(expr.Location, name, "too many arguments", pre, expArgs)
|
||||
} else if len(args) < len(ftpe.Args()) {
|
||||
return newArgError(expr.Location, name, "too few arguments", pre, expArgs)
|
||||
if len(args) > len(fargs.Args) && fargs.Variadic == nil {
|
||||
return newArgError(expr.Location, name, "too many arguments", pre, namedFargs)
|
||||
}
|
||||
|
||||
if len(args) < len(ftpe.FuncArgs().Args) {
|
||||
return newArgError(expr.Location, name, "too few arguments", pre, namedFargs)
|
||||
}
|
||||
|
||||
for i := range args {
|
||||
if !unify1(env, args[i], expArgs[i], false) {
|
||||
if !unify1(env, args[i], fargs.Arg(i), false) {
|
||||
post := make([]types.Type, len(args))
|
||||
for i := range args {
|
||||
post[i] = env.Get(args[i])
|
||||
}
|
||||
return newArgError(expr.Location, name, "invalid argument(s)", post, expArgs)
|
||||
return newArgError(expr.Location, name, "invalid argument(s)", post, namedFargs)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,11 +345,13 @@ func (tc *typeChecker) checkExprBuiltin(env *TypeEnv, expr *Expr) *Error {
|
||||
func (tc *typeChecker) checkExprEq(env *TypeEnv, expr *Expr) *Error {
|
||||
|
||||
pre := getArgTypes(env, expr.Operands())
|
||||
exp := Equality.Decl.Args()
|
||||
exp := Equality.Decl.FuncArgs()
|
||||
|
||||
if len(pre) < len(exp) {
|
||||
if len(pre) < len(exp.Args) {
|
||||
return newArgError(expr.Location, expr.Operator(), "too few arguments", pre, exp)
|
||||
} else if len(exp) < len(pre) {
|
||||
}
|
||||
|
||||
if len(exp.Args) < len(pre) {
|
||||
return newArgError(expr.Location, expr.Operator(), "too many arguments", pre, exp)
|
||||
}
|
||||
|
||||
@@ -299,6 +370,27 @@ func (tc *typeChecker) checkExprEq(env *TypeEnv, expr *Expr) *Error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (tc *typeChecker) checkExprWith(env *TypeEnv, expr *Expr, i int) *Error {
|
||||
if i == len(expr.With) {
|
||||
return nil
|
||||
}
|
||||
|
||||
target, value := expr.With[i].Target, expr.With[i].Value
|
||||
targetType, valueType := env.Get(target), env.Get(value)
|
||||
|
||||
if t, ok := targetType.(*types.Function); ok { // built-in function replacement
|
||||
switch v := valueType.(type) {
|
||||
case *types.Function: // ...by function
|
||||
if !unifies(targetType, valueType) {
|
||||
return newArgError(expr.With[i].Loc(), target.Value.(Ref), "arity mismatch", v.Args(), t.NamedFuncArgs())
|
||||
}
|
||||
default: // ... by value, nothing to check
|
||||
}
|
||||
}
|
||||
|
||||
return tc.checkExprWith(env, expr, i+1)
|
||||
}
|
||||
|
||||
func unify2(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.Type) bool {
|
||||
|
||||
nilA := types.Nil(typeA)
|
||||
@@ -313,31 +405,31 @@ func unify2(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.Type)
|
||||
}
|
||||
|
||||
switch a.Value.(type) {
|
||||
case Array:
|
||||
return unify2Array(env, a, typeA, b, typeB)
|
||||
case Object:
|
||||
return unify2Object(env, a, typeA, b, typeB)
|
||||
case *Array:
|
||||
return unify2Array(env, a, b)
|
||||
case *object:
|
||||
return unify2Object(env, a, b)
|
||||
case Var:
|
||||
switch b.Value.(type) {
|
||||
case Var:
|
||||
return unify1(env, a, types.A, false) && unify1(env, b, env.Get(a), false)
|
||||
case Array:
|
||||
return unify2Array(env, b, typeB, a, typeA)
|
||||
case Object:
|
||||
return unify2Object(env, b, typeB, a, typeA)
|
||||
case *Array:
|
||||
return unify2Array(env, b, a)
|
||||
case *object:
|
||||
return unify2Object(env, b, a)
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func unify2Array(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.Type) bool {
|
||||
arr := a.Value.(Array)
|
||||
func unify2Array(env *TypeEnv, a *Term, b *Term) bool {
|
||||
arr := a.Value.(*Array)
|
||||
switch bv := b.Value.(type) {
|
||||
case Array:
|
||||
if len(arr) == len(bv) {
|
||||
for i := range arr {
|
||||
if !unify2(env, arr[i], env.Get(arr[i]), bv[i], env.Get(bv[i])) {
|
||||
case *Array:
|
||||
if arr.Len() == bv.Len() {
|
||||
for i := 0; i < arr.Len(); i++ {
|
||||
if !unify2(env, arr.Elem(i), env.Get(arr.Elem(i)), bv.Elem(i), env.Get(bv.Elem(i))) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -349,10 +441,10 @@ func unify2Array(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.T
|
||||
return false
|
||||
}
|
||||
|
||||
func unify2Object(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.Type) bool {
|
||||
func unify2Object(env *TypeEnv, a *Term, b *Term) bool {
|
||||
obj := a.Value.(Object)
|
||||
switch bv := b.Value.(type) {
|
||||
case Object:
|
||||
case *object:
|
||||
cv := obj.Intersect(bv)
|
||||
if obj.Len() == bv.Len() && bv.Len() == len(cv) {
|
||||
for i := range cv {
|
||||
@@ -370,14 +462,14 @@ func unify2Object(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.
|
||||
|
||||
func unify1(env *TypeEnv, term *Term, tpe types.Type, union bool) bool {
|
||||
switch v := term.Value.(type) {
|
||||
case Array:
|
||||
case *Array:
|
||||
switch tpe := tpe.(type) {
|
||||
case *types.Array:
|
||||
return unify1Array(env, v, tpe, union)
|
||||
case types.Any:
|
||||
if types.Compare(tpe, types.A) == 0 {
|
||||
for i := range v {
|
||||
unify1(env, v[i], types.A, true)
|
||||
for i := 0; i < v.Len(); i++ {
|
||||
unify1(env, v.Elem(i), types.A, true)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -388,7 +480,7 @@ func unify1(env *TypeEnv, term *Term, tpe types.Type, union bool) bool {
|
||||
return unifies
|
||||
}
|
||||
return false
|
||||
case Object:
|
||||
case *object:
|
||||
switch tpe := tpe.(type) {
|
||||
case *types.Object:
|
||||
return unify1Object(env, v, tpe, union)
|
||||
@@ -445,12 +537,12 @@ func unify1(env *TypeEnv, term *Term, tpe types.Type, union bool) bool {
|
||||
}
|
||||
}
|
||||
|
||||
func unify1Array(env *TypeEnv, val Array, tpe *types.Array, union bool) bool {
|
||||
if len(val) != tpe.Len() && tpe.Dynamic() == nil {
|
||||
func unify1Array(env *TypeEnv, val *Array, tpe *types.Array, union bool) bool {
|
||||
if val.Len() != tpe.Len() && tpe.Dynamic() == nil {
|
||||
return false
|
||||
}
|
||||
for i := range val {
|
||||
if !unify1(env, val[i], tpe.Select(i), union) {
|
||||
for i := 0; i < val.Len(); i++ {
|
||||
if !unify1(env, val.Elem(i), tpe.Select(i), union) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -489,17 +581,21 @@ func unify1Set(env *TypeEnv, val Set, tpe *types.Set, union bool) bool {
|
||||
})
|
||||
}
|
||||
|
||||
func (tc *typeChecker) err(err *Error) {
|
||||
tc.errs = append(tc.errs, err)
|
||||
func (tc *typeChecker) err(errors []*Error) {
|
||||
tc.errs = append(tc.errs, errors...)
|
||||
}
|
||||
|
||||
type refChecker struct {
|
||||
env *TypeEnv
|
||||
errs Errors
|
||||
varRewriter rewriteVars
|
||||
varRewriter varRewriter
|
||||
}
|
||||
|
||||
func newRefChecker(env *TypeEnv, f rewriteVars) *refChecker {
|
||||
func rewriteVarsNop(node Ref) Ref {
|
||||
return node
|
||||
}
|
||||
|
||||
func newRefChecker(env *TypeEnv, f varRewriter) *refChecker {
|
||||
|
||||
if f == nil {
|
||||
f = rewriteVarsNop
|
||||
@@ -540,11 +636,11 @@ func (rc *refChecker) Visit(x interface{}) bool {
|
||||
}
|
||||
|
||||
func (rc *refChecker) checkApply(curr *TypeEnv, ref Ref) *Error {
|
||||
if tpe := curr.Get(ref); tpe != nil {
|
||||
if _, ok := tpe.(*types.Function); ok {
|
||||
return newRefErrUnsupported(ref[0].Location, rc.varRewriter(ref), len(ref)-1, tpe)
|
||||
}
|
||||
switch tpe := curr.Get(ref).(type) {
|
||||
case *types.Function: // NOTE(sr): We don't support first-class functions, except for `with`.
|
||||
return newRefErrUnsupported(ref[0].Location, rc.varRewriter(ref), len(ref)-1, tpe)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -617,7 +713,7 @@ func (rc *refChecker) checkRef(curr *TypeEnv, node *typeTreeNode, ref Ref, idx i
|
||||
// potentially refers to data for which no type information exists,
|
||||
// checking should never fail.
|
||||
node.Children().Iter(func(_, child util.T) bool {
|
||||
rc.checkRef(curr, child.(*typeTreeNode), ref, idx+1)
|
||||
_ = rc.checkRef(curr, child.(*typeTreeNode), ref, idx+1) // ignore error
|
||||
return false
|
||||
})
|
||||
|
||||
@@ -655,11 +751,7 @@ func (rc *refChecker) checkRefLeaf(tpe types.Type, ref Ref, idx int) *Error {
|
||||
}
|
||||
}
|
||||
|
||||
case Array, Object, Set:
|
||||
// Composite references operands may only be used with a set.
|
||||
if !unifies(tpe, types.NewSet(types.A)) {
|
||||
return newRefErrInvalid(ref[0].Location, rc.varRewriter(ref), idx, tpe, types.NewSet(types.A), nil)
|
||||
}
|
||||
case *Array, Object, Set:
|
||||
if !unify1(rc.env, head, keys, false) {
|
||||
return newRefErrInvalid(ref[0].Location, rc.varRewriter(ref), idx, rc.env.Get(head), keys, nil)
|
||||
}
|
||||
@@ -731,7 +823,17 @@ func unifies(a, b types.Type) bool {
|
||||
}
|
||||
return unifies(types.Values(a), types.Values(b))
|
||||
case *types.Function:
|
||||
// TODO(tsandall): revisit once functions become first-class values.
|
||||
// NOTE(sr): variadic functions can only be internal ones, and we've forbidden
|
||||
// their replacement via `with`; so we disregard variadic here
|
||||
if types.Arity(a) == types.Arity(b) {
|
||||
b := b.(*types.Function)
|
||||
for i := range a.FuncArgs().Args {
|
||||
if !unifies(a.FuncArgs().Arg(i), b.FuncArgs().Arg(i)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
default:
|
||||
panic("unreachable")
|
||||
@@ -812,15 +914,15 @@ func causedByNilType(err *Error) bool {
|
||||
|
||||
// ArgErrDetail represents a generic argument error.
|
||||
type ArgErrDetail struct {
|
||||
Have []types.Type `json:"have"`
|
||||
Want []types.Type `json:"want"`
|
||||
Have []types.Type `json:"have"`
|
||||
Want types.FuncArgs `json:"want"`
|
||||
}
|
||||
|
||||
// Lines returns the string representation of the detail.
|
||||
func (d *ArgErrDetail) Lines() []string {
|
||||
lines := make([]string, 2)
|
||||
lines[0] = fmt.Sprint("have: ", formatArgs(d.Have))
|
||||
lines[1] = fmt.Sprint("want: ", formatArgs(d.Want))
|
||||
lines[0] = "have: " + formatArgs(d.Have)
|
||||
lines[1] = "want: " + fmt.Sprint(d.Want)
|
||||
return lines
|
||||
}
|
||||
|
||||
@@ -934,7 +1036,7 @@ func newRefError(loc *Location, ref Ref) *Error {
|
||||
return NewError(TypeErr, loc, "undefined ref: %v", ref)
|
||||
}
|
||||
|
||||
func newArgError(loc *Location, builtinName Ref, msg string, have []types.Type, want []types.Type) *Error {
|
||||
func newArgError(loc *Location, builtinName Ref, msg string, have []types.Type, want types.FuncArgs) *Error {
|
||||
err := NewError(TypeErr, loc, "%v: %v", builtinName, msg)
|
||||
err.Details = &ArgErrDetail{
|
||||
Have: have,
|
||||
@@ -963,7 +1065,15 @@ func getOneOfForType(tpe types.Type) (result []Value) {
|
||||
}
|
||||
result = append(result, v)
|
||||
}
|
||||
|
||||
case types.Any:
|
||||
for _, object := range tpe {
|
||||
objRes := getOneOfForType(object)
|
||||
result = append(result, objRes...)
|
||||
}
|
||||
}
|
||||
|
||||
result = removeDuplicate(result)
|
||||
sortValueSlice(result)
|
||||
return result
|
||||
}
|
||||
@@ -974,6 +1084,18 @@ func sortValueSlice(sl []Value) {
|
||||
})
|
||||
}
|
||||
|
||||
func removeDuplicate(list []Value) []Value {
|
||||
seen := make(map[Value]bool)
|
||||
var newResult []Value
|
||||
for _, item := range list {
|
||||
if !seen[item] {
|
||||
newResult = append(newResult, item)
|
||||
seen[item] = true
|
||||
}
|
||||
}
|
||||
return newResult
|
||||
}
|
||||
|
||||
func getArgTypes(env *TypeEnv, args []*Term) []types.Type {
|
||||
pre := make([]types.Type, len(args))
|
||||
for i := range args {
|
||||
@@ -981,3 +1103,143 @@ func getArgTypes(env *TypeEnv, args []*Term) []types.Type {
|
||||
}
|
||||
return pre
|
||||
}
|
||||
|
||||
// getPrefix returns the shortest prefix of ref that exists in env
|
||||
func getPrefix(env *TypeEnv, ref Ref) (Ref, types.Type) {
|
||||
if len(ref) == 1 {
|
||||
t := env.Get(ref)
|
||||
if t != nil {
|
||||
return ref, t
|
||||
}
|
||||
}
|
||||
for i := 1; i < len(ref); i++ {
|
||||
t := env.Get(ref[:i])
|
||||
if t != nil {
|
||||
return ref[:i], t
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// override takes a type t and returns a type obtained from t where the path represented by ref within it has type o (overriding the original type of that path)
|
||||
func override(ref Ref, t types.Type, o types.Type, rule *Rule) (types.Type, *Error) {
|
||||
var newStaticProps []*types.StaticProperty
|
||||
obj, ok := t.(*types.Object)
|
||||
if !ok {
|
||||
newType, err := getObjectType(ref, o, rule, types.NewDynamicProperty(types.A, types.A))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return newType, nil
|
||||
}
|
||||
found := false
|
||||
if ok {
|
||||
staticProps := obj.StaticProperties()
|
||||
for _, prop := range staticProps {
|
||||
valueCopy := prop.Value
|
||||
key, err := InterfaceToValue(prop.Key)
|
||||
if err != nil {
|
||||
return nil, NewError(TypeErr, rule.Location, "unexpected error in override: %s", err.Error())
|
||||
}
|
||||
if len(ref) > 0 && ref[0].Value.Compare(key) == 0 {
|
||||
found = true
|
||||
if len(ref) == 1 {
|
||||
valueCopy = o
|
||||
} else {
|
||||
newVal, err := override(ref[1:], valueCopy, o, rule)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
valueCopy = newVal
|
||||
}
|
||||
}
|
||||
newStaticProps = append(newStaticProps, types.NewStaticProperty(prop.Key, valueCopy))
|
||||
}
|
||||
}
|
||||
|
||||
// ref[0] is not a top-level key in staticProps, so it must be added
|
||||
if !found {
|
||||
newType, err := getObjectType(ref, o, rule, obj.DynamicProperties())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newStaticProps = append(newStaticProps, newType.StaticProperties()...)
|
||||
}
|
||||
return types.NewObject(newStaticProps, obj.DynamicProperties()), nil
|
||||
}
|
||||
|
||||
func getKeys(ref Ref, rule *Rule) ([]interface{}, *Error) {
|
||||
keys := []interface{}{}
|
||||
for _, refElem := range ref {
|
||||
key, err := JSON(refElem.Value)
|
||||
if err != nil {
|
||||
return nil, NewError(TypeErr, rule.Location, "error getting key from value: %s", err.Error())
|
||||
}
|
||||
keys = append(keys, key)
|
||||
}
|
||||
return keys, nil
|
||||
}
|
||||
|
||||
func getObjectTypeRec(keys []interface{}, o types.Type, d *types.DynamicProperty) *types.Object {
|
||||
if len(keys) == 1 {
|
||||
staticProps := []*types.StaticProperty{types.NewStaticProperty(keys[0], o)}
|
||||
return types.NewObject(staticProps, d)
|
||||
}
|
||||
|
||||
staticProps := []*types.StaticProperty{types.NewStaticProperty(keys[0], getObjectTypeRec(keys[1:], o, d))}
|
||||
return types.NewObject(staticProps, d)
|
||||
}
|
||||
|
||||
func getObjectType(ref Ref, o types.Type, rule *Rule, d *types.DynamicProperty) (*types.Object, *Error) {
|
||||
keys, err := getKeys(ref, rule)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return getObjectTypeRec(keys, o, d), nil
|
||||
}
|
||||
|
||||
func getRuleAnnotation(as *AnnotationSet, rule *Rule) (result []*SchemaAnnotation) {
|
||||
|
||||
for _, x := range as.GetSubpackagesScope(rule.Module.Package.Path) {
|
||||
result = append(result, x.Schemas...)
|
||||
}
|
||||
|
||||
if x := as.GetPackageScope(rule.Module.Package); x != nil {
|
||||
result = append(result, x.Schemas...)
|
||||
}
|
||||
|
||||
if x := as.GetDocumentScope(rule.Path()); x != nil {
|
||||
result = append(result, x.Schemas...)
|
||||
}
|
||||
|
||||
for _, x := range as.GetRuleScope(rule) {
|
||||
result = append(result, x.Schemas...)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func processAnnotation(ss *SchemaSet, annot *SchemaAnnotation, rule *Rule, allowNet []string) (Ref, types.Type, *Error) {
|
||||
|
||||
var schema interface{}
|
||||
|
||||
if annot.Schema != nil {
|
||||
schema = ss.Get(annot.Schema)
|
||||
if schema == nil {
|
||||
return nil, nil, NewError(TypeErr, rule.Location, "undefined schema: %v", annot.Schema)
|
||||
}
|
||||
} else if annot.Definition != nil {
|
||||
schema = *annot.Definition
|
||||
}
|
||||
|
||||
tpe, err := loadSchema(schema, allowNet)
|
||||
if err != nil {
|
||||
return nil, nil, NewError(TypeErr, rule.Location, err.Error())
|
||||
}
|
||||
|
||||
return annot.Path, tpe, nil
|
||||
}
|
||||
|
||||
func errAnnotationRedeclared(a *Annotations, other *Location) *Error {
|
||||
return NewError(TypeErr, a.Location, "%v annotation redeclared: %v", a.Scope, other)
|
||||
}
|
||||
|
||||
98
vendor/github.com/open-policy-agent/opa/ast/compare.go
generated
vendored
98
vendor/github.com/open-policy-agent/opa/ast/compare.go
generated
vendored
@@ -23,17 +23,18 @@ import (
|
||||
// ArrayComprehension < ObjectComprehension < SetComprehension < Expr < SomeDecl
|
||||
// < With < Body < Rule < Import < Package < Module.
|
||||
//
|
||||
// Arrays and Refs are equal iff both a and b have the same length and all
|
||||
// corresponding elements are equal. If one element is not equal, the return
|
||||
// value is the same as for the first differing element. If all elements are
|
||||
// equal but a and b have different lengths, the shorter is considered less than
|
||||
// the other.
|
||||
// Arrays and Refs are equal if and only if both a and b have the same length
|
||||
// and all corresponding elements are equal. If one element is not equal, the
|
||||
// return value is the same as for the first differing element. If all elements
|
||||
// are equal but a and b have different lengths, the shorter is considered less
|
||||
// than the other.
|
||||
//
|
||||
// Objects are considered equal iff both a and b have the same sorted (key,
|
||||
// value) pairs and are of the same length. Other comparisons are consistent but
|
||||
// not defined.
|
||||
// Objects are considered equal if and only if both a and b have the same sorted
|
||||
// (key, value) pairs and are of the same length. Other comparisons are
|
||||
// consistent but not defined.
|
||||
//
|
||||
// Sets are considered equal iff the symmetric difference of a and b is empty.
|
||||
// Sets are considered equal if and only if the symmetric difference of a and b
|
||||
// is empty.
|
||||
// Other comparisons are consistent but not defined.
|
||||
func Compare(a, b interface{}) int {
|
||||
|
||||
@@ -97,14 +98,48 @@ func Compare(a, b interface{}) int {
|
||||
}
|
||||
}
|
||||
|
||||
bigA, ok := new(big.Float).SetString(string(a))
|
||||
// We use big.Rat for comparing big numbers.
|
||||
// It replaces big.Float due to following reason:
|
||||
// big.Float comes with a default precision of 64, and setting a
|
||||
// larger precision results in more memory being allocated
|
||||
// (regardless of the actual number we are parsing with SetString).
|
||||
//
|
||||
// Note: If we're so close to zero that big.Float says we are zero, do
|
||||
// *not* big.Rat).SetString on the original string it'll potentially
|
||||
// take very long.
|
||||
var bigA, bigB *big.Rat
|
||||
fa, ok := new(big.Float).SetString(string(a))
|
||||
if !ok {
|
||||
panic("illegal value")
|
||||
}
|
||||
bigB, ok := new(big.Float).SetString(string(b.(Number)))
|
||||
if fa.IsInt() {
|
||||
if i, _ := fa.Int64(); i == 0 {
|
||||
bigA = new(big.Rat).SetInt64(0)
|
||||
}
|
||||
}
|
||||
if bigA == nil {
|
||||
bigA, ok = new(big.Rat).SetString(string(a))
|
||||
if !ok {
|
||||
panic("illegal value")
|
||||
}
|
||||
}
|
||||
|
||||
fb, ok := new(big.Float).SetString(string(b.(Number)))
|
||||
if !ok {
|
||||
panic("illegal value")
|
||||
}
|
||||
if fb.IsInt() {
|
||||
if i, _ := fb.Int64(); i == 0 {
|
||||
bigB = new(big.Rat).SetInt64(0)
|
||||
}
|
||||
}
|
||||
if bigB == nil {
|
||||
bigB, ok = new(big.Rat).SetString(string(b.(Number)))
|
||||
if !ok {
|
||||
panic("illegal value")
|
||||
}
|
||||
}
|
||||
|
||||
return bigA.Cmp(bigB)
|
||||
case String:
|
||||
b := b.(String)
|
||||
@@ -127,11 +162,11 @@ func Compare(a, b interface{}) int {
|
||||
case Ref:
|
||||
b := b.(Ref)
|
||||
return termSliceCompare(a, b)
|
||||
case Array:
|
||||
b := b.(Array)
|
||||
return termSliceCompare(a, b)
|
||||
case Object:
|
||||
b := b.(Object)
|
||||
case *Array:
|
||||
b := b.(*Array)
|
||||
return termSliceCompare(a.elems, b.elems)
|
||||
case *object:
|
||||
b := b.(*object)
|
||||
return a.Compare(b)
|
||||
case Set:
|
||||
b := b.(Set)
|
||||
@@ -166,6 +201,9 @@ func Compare(a, b interface{}) int {
|
||||
case *SomeDecl:
|
||||
b := b.(*SomeDecl)
|
||||
return a.Compare(b)
|
||||
case *Every:
|
||||
b := b.(*Every)
|
||||
return a.Compare(b)
|
||||
case *With:
|
||||
b := b.(*With)
|
||||
return a.Compare(b)
|
||||
@@ -187,6 +225,9 @@ func Compare(a, b interface{}) int {
|
||||
case *Package:
|
||||
b := b.(*Package)
|
||||
return a.Compare(b)
|
||||
case *Annotations:
|
||||
b := b.(*Annotations)
|
||||
return a.Compare(b)
|
||||
case *Module:
|
||||
b := b.(*Module)
|
||||
return a.Compare(b)
|
||||
@@ -214,7 +255,7 @@ func sortOrder(x interface{}) int {
|
||||
return 4
|
||||
case Ref:
|
||||
return 5
|
||||
case Array:
|
||||
case *Array:
|
||||
return 6
|
||||
case Object:
|
||||
return 7
|
||||
@@ -234,6 +275,8 @@ func sortOrder(x interface{}) int {
|
||||
return 100
|
||||
case *SomeDecl:
|
||||
return 101
|
||||
case *Every:
|
||||
return 102
|
||||
case *With:
|
||||
return 110
|
||||
case *Head:
|
||||
@@ -246,6 +289,8 @@ func sortOrder(x interface{}) int {
|
||||
return 1001
|
||||
case *Package:
|
||||
return 1002
|
||||
case *Annotations:
|
||||
return 1003
|
||||
case *Module:
|
||||
return 10000
|
||||
}
|
||||
@@ -271,6 +316,25 @@ func importsCompare(a, b []*Import) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func annotationsCompare(a, b []*Annotations) int {
|
||||
minLen := len(a)
|
||||
if len(b) < minLen {
|
||||
minLen = len(b)
|
||||
}
|
||||
for i := 0; i < minLen; i++ {
|
||||
if cmp := a[i].Compare(b[i]); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
}
|
||||
if len(a) < len(b) {
|
||||
return -1
|
||||
}
|
||||
if len(b) < len(a) {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func rulesCompare(a, b []*Rule) int {
|
||||
minLen := len(a)
|
||||
if len(b) < minLen {
|
||||
|
||||
2754
vendor/github.com/open-policy-agent/opa/ast/compile.go
generated
vendored
2754
vendor/github.com/open-policy-agent/opa/ast/compile.go
generated
vendored
File diff suppressed because it is too large
Load Diff
24
vendor/github.com/open-policy-agent/opa/ast/compilehelper.go
generated
vendored
24
vendor/github.com/open-policy-agent/opa/ast/compilehelper.go
generated
vendored
@@ -7,19 +7,31 @@ package ast
|
||||
// CompileModules takes a set of Rego modules represented as strings and
|
||||
// compiles them for evaluation. The keys of the map are used as filenames.
|
||||
func CompileModules(modules map[string]string) (*Compiler, error) {
|
||||
return CompileModulesWithOpt(modules, CompileOpts{})
|
||||
}
|
||||
|
||||
// CompileOpts defines a set of options for the compiler.
|
||||
type CompileOpts struct {
|
||||
EnablePrintStatements bool
|
||||
ParserOptions ParserOptions
|
||||
}
|
||||
|
||||
// CompileModulesWithOpt takes a set of Rego modules represented as strings and
|
||||
// compiles them for evaluation. The keys of the map are used as filenames.
|
||||
func CompileModulesWithOpt(modules map[string]string, opts CompileOpts) (*Compiler, error) {
|
||||
|
||||
parsed := make(map[string]*Module, len(modules))
|
||||
|
||||
for f, module := range modules {
|
||||
var pm *Module
|
||||
var err error
|
||||
if pm, err = ParseModule(f, module); err != nil {
|
||||
if pm, err = ParseModuleWithOpts(f, module, opts.ParserOptions); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
parsed[f] = pm
|
||||
}
|
||||
|
||||
compiler := NewCompiler()
|
||||
compiler := NewCompiler().WithEnablePrintStatements(opts.EnablePrintStatements)
|
||||
compiler.Compile(parsed)
|
||||
|
||||
if compiler.Failed() {
|
||||
@@ -32,8 +44,14 @@ func CompileModules(modules map[string]string) (*Compiler, error) {
|
||||
// MustCompileModules compiles a set of Rego modules represented as strings. If
|
||||
// the compilation process fails, this function panics.
|
||||
func MustCompileModules(modules map[string]string) *Compiler {
|
||||
return MustCompileModulesWithOpts(modules, CompileOpts{})
|
||||
}
|
||||
|
||||
compiler, err := CompileModules(modules)
|
||||
// MustCompileModulesWithOpts compiles a set of Rego modules represented as strings. If
|
||||
// the compilation process fails, this function panics.
|
||||
func MustCompileModulesWithOpts(modules map[string]string, opts CompileOpts) *Compiler {
|
||||
|
||||
compiler, err := CompileModulesWithOpt(modules, opts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
9
vendor/github.com/open-policy-agent/opa/ast/compilemetrics.go
generated
vendored
Normal file
9
vendor/github.com/open-policy-agent/opa/ast/compilemetrics.go
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ast
|
||||
|
||||
const (
|
||||
compileStageComprehensionIndexBuild = "compile_stage_comprehension_index_build"
|
||||
)
|
||||
36
vendor/github.com/open-policy-agent/opa/ast/env.go
generated
vendored
36
vendor/github.com/open-policy-agent/opa/ast/env.go
generated
vendored
@@ -11,14 +11,17 @@ import (
|
||||
|
||||
// TypeEnv contains type info for static analysis such as type checking.
|
||||
type TypeEnv struct {
|
||||
tree *typeTreeNode
|
||||
next *TypeEnv
|
||||
tree *typeTreeNode
|
||||
next *TypeEnv
|
||||
newChecker func() *typeChecker
|
||||
}
|
||||
|
||||
// NewTypeEnv returns an empty TypeEnv.
|
||||
func NewTypeEnv() *TypeEnv {
|
||||
// newTypeEnv returns an empty TypeEnv. The constructor is not exported because
|
||||
// type environments should only be created by the type checker.
|
||||
func newTypeEnv(f func() *typeChecker) *TypeEnv {
|
||||
return &TypeEnv{
|
||||
tree: newTypeTree(),
|
||||
tree: newTypeTree(),
|
||||
newChecker: f,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,10 +45,10 @@ func (env *TypeEnv) Get(x interface{}) types.Type {
|
||||
return types.NewString()
|
||||
|
||||
// Composites.
|
||||
case Array:
|
||||
static := make([]types.Type, len(x))
|
||||
case *Array:
|
||||
static := make([]types.Type, x.Len())
|
||||
for i := range static {
|
||||
tpe := env.Get(x[i].Value)
|
||||
tpe := env.Get(x.Elem(i).Value)
|
||||
static[i] = tpe
|
||||
}
|
||||
|
||||
@@ -56,7 +59,7 @@ func (env *TypeEnv) Get(x interface{}) types.Type {
|
||||
|
||||
return types.NewArray(static, dynamic)
|
||||
|
||||
case Object:
|
||||
case *object:
|
||||
static := []*types.StaticProperty{}
|
||||
var dynamic *types.DynamicProperty
|
||||
|
||||
@@ -94,22 +97,19 @@ func (env *TypeEnv) Get(x interface{}) types.Type {
|
||||
|
||||
// Comprehensions.
|
||||
case *ArrayComprehension:
|
||||
checker := newTypeChecker()
|
||||
cpy, errs := checker.CheckBody(env, x.Body)
|
||||
cpy, errs := env.newChecker().CheckBody(env, x.Body)
|
||||
if len(errs) == 0 {
|
||||
return types.NewArray(nil, cpy.Get(x.Term))
|
||||
}
|
||||
return nil
|
||||
case *ObjectComprehension:
|
||||
checker := newTypeChecker()
|
||||
cpy, errs := checker.CheckBody(env, x.Body)
|
||||
cpy, errs := env.newChecker().CheckBody(env, x.Body)
|
||||
if len(errs) == 0 {
|
||||
return types.NewObject(nil, types.NewDynamicProperty(cpy.Get(x.Key), cpy.Get(x.Value)))
|
||||
}
|
||||
return nil
|
||||
case *SetComprehension:
|
||||
checker := newTypeChecker()
|
||||
cpy, errs := checker.CheckBody(env, x.Body)
|
||||
cpy, errs := env.newChecker().CheckBody(env, x.Body)
|
||||
if len(errs) == 0 {
|
||||
return types.NewSet(cpy.Get(x.Term))
|
||||
}
|
||||
@@ -129,6 +129,10 @@ func (env *TypeEnv) Get(x interface{}) types.Type {
|
||||
}
|
||||
return nil
|
||||
|
||||
// Calls.
|
||||
case Call:
|
||||
return nil
|
||||
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
@@ -315,7 +319,7 @@ func selectRef(tpe types.Type, ref Ref) types.Type {
|
||||
head, tail := ref[0], ref[1:]
|
||||
|
||||
switch head.Value.(type) {
|
||||
case Var, Ref, Array, Object, Set:
|
||||
case Var, Ref, *Array, Object, Set:
|
||||
return selectRef(types.Values(tpe), tail)
|
||||
default:
|
||||
return selectRef(selectConstant(tpe, head), tail)
|
||||
|
||||
16
vendor/github.com/open-policy-agent/opa/ast/errors.go
generated
vendored
16
vendor/github.com/open-policy-agent/opa/ast/errors.go
generated
vendored
@@ -24,9 +24,9 @@ func (e Errors) Error() string {
|
||||
return fmt.Sprintf("1 error occurred: %v", e[0].Error())
|
||||
}
|
||||
|
||||
s := []string{}
|
||||
for _, err := range e {
|
||||
s = append(s, err.Error())
|
||||
s := make([]string, len(e))
|
||||
for i, err := range e {
|
||||
s[i] = err.Error()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%d errors occurred:\n%s", len(e), strings.Join(s, "\n"))
|
||||
@@ -121,13 +121,3 @@ func NewError(code string, loc *Location, f string, a ...interface{}) *Error {
|
||||
Message: fmt.Sprintf(f, a...),
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
errPartialRuleAssignOperator = fmt.Errorf("partial rules must use = operator (not := operator)")
|
||||
errElseAssignOperator = fmt.Errorf("else keyword cannot be used on rule declared with := operator")
|
||||
errFunctionAssignOperator = fmt.Errorf("functions must use = operator (not := operator)")
|
||||
)
|
||||
|
||||
func errTermAssignOperator(x interface{}) error {
|
||||
return fmt.Errorf("cannot assign to %v", TypeName(x))
|
||||
}
|
||||
|
||||
13
vendor/github.com/open-policy-agent/opa/ast/fuzz.go
generated
vendored
13
vendor/github.com/open-policy-agent/opa/ast/fuzz.go
generated
vendored
@@ -1,21 +1,10 @@
|
||||
//go:build gofuzz
|
||||
// +build gofuzz
|
||||
|
||||
package ast
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
)
|
||||
|
||||
// nested { and [ tokens cause the parse time to explode.
|
||||
// see: https://github.com/mna/pigeon/issues/75
|
||||
var blacklistRegexp = regexp.MustCompile(`[{(\[]{5,}`)
|
||||
|
||||
func Fuzz(data []byte) int {
|
||||
|
||||
if blacklistRegexp.Match(data) {
|
||||
return -1
|
||||
}
|
||||
|
||||
str := string(data)
|
||||
_, _, err := ParseStatements("", str)
|
||||
|
||||
|
||||
338
vendor/github.com/open-policy-agent/opa/ast/index.go
generated
vendored
338
vendor/github.com/open-policy-agent/opa/ast/index.go
generated
vendored
@@ -6,7 +6,6 @@ package ast
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
@@ -17,26 +16,27 @@ import (
|
||||
type RuleIndex interface {
|
||||
|
||||
// Build tries to construct an index for the given rules. If the index was
|
||||
// constructed, ok is true, otherwise false.
|
||||
Build(rules []*Rule) (ok bool)
|
||||
// constructed, it returns true, otherwise false.
|
||||
Build(rules []*Rule) bool
|
||||
|
||||
// Lookup searches the index for rules that will match the provided
|
||||
// resolver. If the resolver returns an error, it is returned via err.
|
||||
Lookup(resolver ValueResolver) (result *IndexResult, err error)
|
||||
Lookup(resolver ValueResolver) (*IndexResult, error)
|
||||
|
||||
// AllRules traverses the index and returns all rules that will match
|
||||
// the provided resolver without any optimizations (effectively with
|
||||
// indexing disabled). If the resolver returns an error, it is returned
|
||||
// via err.
|
||||
AllRules(resolver ValueResolver) (result *IndexResult, err error)
|
||||
AllRules(resolver ValueResolver) (*IndexResult, error)
|
||||
}
|
||||
|
||||
// IndexResult contains the result of an index lookup.
|
||||
type IndexResult struct {
|
||||
Kind DocKind
|
||||
Rules []*Rule
|
||||
Else map[*Rule][]*Rule
|
||||
Default *Rule
|
||||
Kind DocKind
|
||||
Rules []*Rule
|
||||
Else map[*Rule][]*Rule
|
||||
Default *Rule
|
||||
EarlyExit bool
|
||||
}
|
||||
|
||||
// NewIndexResult returns a new IndexResult object.
|
||||
@@ -53,16 +53,18 @@ func (ir *IndexResult) Empty() bool {
|
||||
}
|
||||
|
||||
type baseDocEqIndex struct {
|
||||
isVirtual func(Ref) bool
|
||||
root *trieNode
|
||||
defaultRule *Rule
|
||||
kind DocKind
|
||||
skipIndexing Set
|
||||
isVirtual func(Ref) bool
|
||||
root *trieNode
|
||||
defaultRule *Rule
|
||||
kind DocKind
|
||||
}
|
||||
|
||||
func newBaseDocEqIndex(isVirtual func(Ref) bool) *baseDocEqIndex {
|
||||
return &baseDocEqIndex{
|
||||
isVirtual: isVirtual,
|
||||
root: newTrieNodeImpl(),
|
||||
skipIndexing: NewSet(NewTerm(InternalPrint.Ref())),
|
||||
isVirtual: isVirtual,
|
||||
root: newTrieNodeImpl(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,8 +83,17 @@ func (i *baseDocEqIndex) Build(rules []*Rule) bool {
|
||||
i.defaultRule = rule
|
||||
return false
|
||||
}
|
||||
var skip bool
|
||||
for _, expr := range rule.Body {
|
||||
indices.Update(rule, expr)
|
||||
if op := expr.OperatorTerm(); op != nil && i.skipIndexing.Contains(op) {
|
||||
skip = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !skip {
|
||||
for _, expr := range rule.Body {
|
||||
indices.Update(rule, expr)
|
||||
}
|
||||
}
|
||||
return false
|
||||
})
|
||||
@@ -104,13 +115,11 @@ func (i *baseDocEqIndex) Build(rules []*Rule) bool {
|
||||
// Insert rule into trie with (insertion order, priority order)
|
||||
// tuple. Retaining the insertion order allows us to return rules
|
||||
// in the order they were passed to this function.
|
||||
node.rules = append(node.rules, &ruleNode{[...]int{idx, prio}, rule})
|
||||
node.append([...]int{idx, prio}, rule)
|
||||
prio++
|
||||
return false
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -133,6 +142,7 @@ func (i *baseDocEqIndex) Lookup(resolver ValueResolver) (*IndexResult, error) {
|
||||
})
|
||||
nodes := tr.unordered[pos]
|
||||
root := nodes[0].rule
|
||||
|
||||
result.Rules = append(result.Rules, root)
|
||||
if len(nodes) > 1 {
|
||||
result.Else[root] = make([]*Rule, len(nodes)-1)
|
||||
@@ -142,6 +152,8 @@ func (i *baseDocEqIndex) Lookup(resolver ValueResolver) (*IndexResult, error) {
|
||||
}
|
||||
}
|
||||
|
||||
result.EarlyExit = tr.values.Len() == 1 && tr.values.Slice()[0].IsGround()
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -171,6 +183,8 @@ func (i *baseDocEqIndex) AllRules(resolver ValueResolver) (*IndexResult, error)
|
||||
}
|
||||
}
|
||||
|
||||
result.EarlyExit = tr.values.Len() == 1 && tr.values.Slice()[0].IsGround()
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -180,18 +194,19 @@ type ruleWalker struct {
|
||||
|
||||
func (r *ruleWalker) Do(x interface{}) trieWalker {
|
||||
tn := x.(*trieNode)
|
||||
for _, rn := range tn.rules {
|
||||
r.result.Add(rn)
|
||||
}
|
||||
r.result.Add(tn)
|
||||
return r
|
||||
}
|
||||
|
||||
type valueMapper func(Value) Value
|
||||
type valueMapper struct {
|
||||
Key string
|
||||
MapValue func(Value) Value
|
||||
}
|
||||
|
||||
type refindex struct {
|
||||
Ref Ref
|
||||
Value Value
|
||||
Mapper func(Value) Value
|
||||
Mapper *valueMapper
|
||||
}
|
||||
|
||||
type refindices struct {
|
||||
@@ -231,12 +246,15 @@ func (i *refindices) Update(rule *Rule, expr *Expr) {
|
||||
|
||||
op := expr.Operator()
|
||||
|
||||
if op.Equal(Equality.Ref()) || op.Equal(Equal.Ref()) {
|
||||
|
||||
if op.Equal(Equality.Ref()) {
|
||||
i.updateEq(rule, expr)
|
||||
} else if op.Equal(Equal.Ref()) && len(expr.Operands()) == 2 {
|
||||
// NOTE(tsandall): if equal() is called with more than two arguments the
|
||||
// output value is being captured in which case the indexer cannot
|
||||
// exclude the rule if the equal() call would return false (because the
|
||||
// false value must still be produced.)
|
||||
i.updateEq(rule, expr)
|
||||
|
||||
} else if op.Equal(GlobMatch.Ref()) {
|
||||
|
||||
i.updateGlobMatch(rule, expr)
|
||||
}
|
||||
}
|
||||
@@ -256,8 +274,13 @@ func (i *refindices) Sorted() []Ref {
|
||||
return false
|
||||
})
|
||||
|
||||
sort.Slice(i.sorted, func(i, j int) bool {
|
||||
return counts[i] > counts[j]
|
||||
sort.Slice(i.sorted, func(a, b int) bool {
|
||||
if counts[a] > counts[b] {
|
||||
return true
|
||||
} else if counts[b] > counts[a] {
|
||||
return false
|
||||
}
|
||||
return i.sorted[a][0].Loc().Compare(i.sorted[b][0].Loc()) < 0
|
||||
})
|
||||
}
|
||||
|
||||
@@ -275,7 +298,7 @@ func (i *refindices) Value(rule *Rule, ref Ref) Value {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *refindices) Mapper(rule *Rule, ref Ref) valueMapper {
|
||||
func (i *refindices) Mapper(rule *Rule, ref Ref) *valueMapper {
|
||||
if index := i.index(rule, ref); index != nil {
|
||||
return index.Mapper
|
||||
}
|
||||
@@ -284,20 +307,19 @@ func (i *refindices) Mapper(rule *Rule, ref Ref) valueMapper {
|
||||
|
||||
func (i *refindices) updateEq(rule *Rule, expr *Expr) {
|
||||
a, b := expr.Operand(0), expr.Operand(1)
|
||||
if ref, value, ok := eqOperandsToRefAndValue(i.isVirtual, a, b); ok {
|
||||
i.insert(rule, &refindex{
|
||||
Ref: ref,
|
||||
Value: value,
|
||||
})
|
||||
} else if ref, value, ok := eqOperandsToRefAndValue(i.isVirtual, b, a); ok {
|
||||
i.insert(rule, &refindex{
|
||||
Ref: ref,
|
||||
Value: value,
|
||||
})
|
||||
args := rule.Head.Args
|
||||
if idx, ok := eqOperandsToRefAndValue(i.isVirtual, args, a, b); ok {
|
||||
i.insert(rule, idx)
|
||||
return
|
||||
}
|
||||
if idx, ok := eqOperandsToRefAndValue(i.isVirtual, args, b, a); ok {
|
||||
i.insert(rule, idx)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func (i *refindices) updateGlobMatch(rule *Rule, expr *Expr) {
|
||||
args := rule.Head.Args
|
||||
|
||||
delim, ok := globDelimiterToString(expr.Operand(1))
|
||||
if !ok {
|
||||
@@ -307,22 +329,36 @@ func (i *refindices) updateGlobMatch(rule *Rule, expr *Expr) {
|
||||
if arr := globPatternToArray(expr.Operand(0), delim); arr != nil {
|
||||
// The 3rd operand of glob.match is the value to match. We assume the
|
||||
// 3rd operand was a reference that has been rewritten and bound to a
|
||||
// variable earlier in the query.
|
||||
// variable earlier in the query OR a function argument variable.
|
||||
match := expr.Operand(2)
|
||||
if _, ok := match.Value.(Var); ok {
|
||||
var ref Ref
|
||||
for _, other := range i.rules[rule] {
|
||||
if _, ok := other.Value.(Var); ok && other.Value.Compare(match.Value) == 0 {
|
||||
i.insert(rule, &refindex{
|
||||
Ref: other.Ref,
|
||||
Value: arr.Value,
|
||||
Mapper: func(v Value) Value {
|
||||
ref = other.Ref
|
||||
}
|
||||
}
|
||||
if ref == nil {
|
||||
for j, arg := range args {
|
||||
if arg.Equal(match) {
|
||||
ref = Ref{FunctionArgRootDocument, IntNumberTerm(j)}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ref != nil {
|
||||
i.insert(rule, &refindex{
|
||||
Ref: ref,
|
||||
Value: arr.Value,
|
||||
Mapper: &valueMapper{
|
||||
Key: delim,
|
||||
MapValue: func(v Value) Value {
|
||||
if s, ok := v.(String); ok {
|
||||
return stringSliceToArray(splitStringEscaped(string(s), delim))
|
||||
}
|
||||
return v
|
||||
},
|
||||
})
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -363,26 +399,34 @@ type trieWalker interface {
|
||||
type trieTraversalResult struct {
|
||||
unordered map[int][]*ruleNode
|
||||
ordering []int
|
||||
values Set
|
||||
}
|
||||
|
||||
func newTrieTraversalResult() *trieTraversalResult {
|
||||
return &trieTraversalResult{
|
||||
unordered: map[int][]*ruleNode{},
|
||||
values: NewSet(),
|
||||
}
|
||||
}
|
||||
|
||||
func (tr *trieTraversalResult) Add(node *ruleNode) {
|
||||
root := node.prio[0]
|
||||
nodes, ok := tr.unordered[root]
|
||||
if !ok {
|
||||
tr.ordering = append(tr.ordering, root)
|
||||
func (tr *trieTraversalResult) Add(t *trieNode) {
|
||||
for _, node := range t.rules {
|
||||
root := node.prio[0]
|
||||
nodes, ok := tr.unordered[root]
|
||||
if !ok {
|
||||
tr.ordering = append(tr.ordering, root)
|
||||
}
|
||||
tr.unordered[root] = append(nodes, node)
|
||||
}
|
||||
if t.values != nil {
|
||||
t.values.Foreach(func(v *Term) { tr.values.Add(v) })
|
||||
}
|
||||
tr.unordered[root] = append(nodes, node)
|
||||
}
|
||||
|
||||
type trieNode struct {
|
||||
ref Ref
|
||||
mapper valueMapper
|
||||
values Set
|
||||
mappers []*valueMapper
|
||||
next *trieNode
|
||||
any *trieNode
|
||||
undefined *trieNode
|
||||
@@ -410,7 +454,7 @@ func (node *trieNode) String() string {
|
||||
flags = append(flags, fmt.Sprintf("array:%p", node.array))
|
||||
}
|
||||
if len(node.scalars) > 0 {
|
||||
buf := []string{}
|
||||
buf := make([]string, 0, len(node.scalars))
|
||||
for k, v := range node.scalars {
|
||||
buf = append(buf, fmt.Sprintf("scalar(%v):%p", k, v))
|
||||
}
|
||||
@@ -420,12 +464,28 @@ func (node *trieNode) String() string {
|
||||
if len(node.rules) > 0 {
|
||||
flags = append(flags, fmt.Sprintf("%d rule(s)", len(node.rules)))
|
||||
}
|
||||
if node.mapper != nil {
|
||||
flags = append(flags, "mapper")
|
||||
if len(node.mappers) > 0 {
|
||||
flags = append(flags, fmt.Sprintf("%d mapper(s)", len(node.mappers)))
|
||||
}
|
||||
if l := node.values.Len(); l > 0 {
|
||||
flags = append(flags, fmt.Sprintf("%d value(s)", l))
|
||||
}
|
||||
return strings.Join(flags, " ")
|
||||
}
|
||||
|
||||
func (node *trieNode) append(prio [2]int, rule *Rule) {
|
||||
node.rules = append(node.rules, &ruleNode{prio, rule})
|
||||
|
||||
if node.values != nil {
|
||||
node.values.Add(rule.Head.Value)
|
||||
return
|
||||
}
|
||||
|
||||
if node.values == nil && rule.Head.DocKind() == CompleteDoc {
|
||||
node.values = NewSet(rule.Head.Value)
|
||||
}
|
||||
}
|
||||
|
||||
type ruleNode struct {
|
||||
prio [2]int
|
||||
rule *Rule
|
||||
@@ -459,14 +519,16 @@ func (node *trieNode) Do(walker trieWalker) {
|
||||
}
|
||||
}
|
||||
|
||||
func (node *trieNode) Insert(ref Ref, value Value, mapper valueMapper) *trieNode {
|
||||
func (node *trieNode) Insert(ref Ref, value Value, mapper *valueMapper) *trieNode {
|
||||
|
||||
if node.next == nil {
|
||||
node.next = newTrieNodeImpl()
|
||||
node.next.ref = ref
|
||||
}
|
||||
|
||||
node.next.mapper = mapper
|
||||
if mapper != nil {
|
||||
node.next.addMapper(mapper)
|
||||
}
|
||||
|
||||
return node.next.insertValue(value)
|
||||
}
|
||||
@@ -477,13 +539,20 @@ func (node *trieNode) Traverse(resolver ValueResolver, tr *trieTraversalResult)
|
||||
return nil
|
||||
}
|
||||
|
||||
for i := range node.rules {
|
||||
tr.Add(node.rules[i])
|
||||
}
|
||||
tr.Add(node)
|
||||
|
||||
return node.next.traverse(resolver, tr)
|
||||
}
|
||||
|
||||
func (node *trieNode) addMapper(mapper *valueMapper) {
|
||||
for i := range node.mappers {
|
||||
if node.mappers[i].Key == mapper.Key {
|
||||
return
|
||||
}
|
||||
}
|
||||
node.mappers = append(node.mappers, mapper)
|
||||
}
|
||||
|
||||
func (node *trieNode) insertValue(value Value) *trieNode {
|
||||
|
||||
switch value := value.(type) {
|
||||
@@ -504,7 +573,7 @@ func (node *trieNode) insertValue(value Value) *trieNode {
|
||||
node.scalars[value] = child
|
||||
}
|
||||
return child
|
||||
case Array:
|
||||
case *Array:
|
||||
if node.array == nil {
|
||||
node.array = newTrieNodeImpl()
|
||||
}
|
||||
@@ -514,25 +583,25 @@ func (node *trieNode) insertValue(value Value) *trieNode {
|
||||
panic("illegal value")
|
||||
}
|
||||
|
||||
func (node *trieNode) insertArray(arr Array) *trieNode {
|
||||
func (node *trieNode) insertArray(arr *Array) *trieNode {
|
||||
|
||||
if len(arr) == 0 {
|
||||
if arr.Len() == 0 {
|
||||
return node
|
||||
}
|
||||
|
||||
switch head := arr[0].Value.(type) {
|
||||
switch head := arr.Elem(0).Value.(type) {
|
||||
case Var:
|
||||
if node.any == nil {
|
||||
node.any = newTrieNodeImpl()
|
||||
}
|
||||
return node.any.insertArray(arr[1:])
|
||||
return node.any.insertArray(arr.Slice(1, -1))
|
||||
case Null, Boolean, Number, String:
|
||||
child, ok := node.scalars[head]
|
||||
if !ok {
|
||||
child = newTrieNodeImpl()
|
||||
node.scalars[head] = child
|
||||
}
|
||||
return child.insertArray(arr[1:])
|
||||
return child.insertArray(arr.Slice(1, -1))
|
||||
}
|
||||
|
||||
panic("illegal value")
|
||||
@@ -553,7 +622,10 @@ func (node *trieNode) traverse(resolver ValueResolver, tr *trieTraversalResult)
|
||||
}
|
||||
|
||||
if node.undefined != nil {
|
||||
node.undefined.Traverse(resolver, tr)
|
||||
err = node.undefined.Traverse(resolver, tr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if v == nil {
|
||||
@@ -561,20 +633,29 @@ func (node *trieNode) traverse(resolver ValueResolver, tr *trieTraversalResult)
|
||||
}
|
||||
|
||||
if node.any != nil {
|
||||
node.any.Traverse(resolver, tr)
|
||||
err = node.any.Traverse(resolver, tr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if node.mapper != nil {
|
||||
v = node.mapper(v)
|
||||
if err := node.traverseValue(resolver, tr, v); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return node.traverseValue(resolver, tr, v)
|
||||
for i := range node.mappers {
|
||||
if err := node.traverseValue(resolver, tr, node.mappers[i].MapValue(v)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (node *trieNode) traverseValue(resolver ValueResolver, tr *trieTraversalResult, value Value) error {
|
||||
|
||||
switch value := value.(type) {
|
||||
case Array:
|
||||
case *Array:
|
||||
if node.array == nil {
|
||||
return nil
|
||||
}
|
||||
@@ -591,20 +672,23 @@ func (node *trieNode) traverseValue(resolver ValueResolver, tr *trieTraversalRes
|
||||
return nil
|
||||
}
|
||||
|
||||
func (node *trieNode) traverseArray(resolver ValueResolver, tr *trieTraversalResult, arr Array) error {
|
||||
func (node *trieNode) traverseArray(resolver ValueResolver, tr *trieTraversalResult, arr *Array) error {
|
||||
|
||||
if len(arr) == 0 {
|
||||
if arr.Len() == 0 {
|
||||
return node.Traverse(resolver, tr)
|
||||
}
|
||||
|
||||
head := arr[0].Value
|
||||
head := arr.Elem(0).Value
|
||||
|
||||
if !IsScalar(head) {
|
||||
return nil
|
||||
}
|
||||
|
||||
if node.any != nil {
|
||||
node.any.traverseArray(resolver, tr, arr[1:])
|
||||
err := node.any.traverseArray(resolver, tr, arr.Slice(1, -1))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
child, ok := node.scalars[head]
|
||||
@@ -612,7 +696,7 @@ func (node *trieNode) traverseArray(resolver ValueResolver, tr *trieTraversalRes
|
||||
return nil
|
||||
}
|
||||
|
||||
return child.traverseArray(resolver, tr, arr[1:])
|
||||
return child.traverseArray(resolver, tr, arr.Slice(1, -1))
|
||||
}
|
||||
|
||||
func (node *trieNode) traverseUnknown(resolver ValueResolver, tr *trieTraversalResult) error {
|
||||
@@ -646,41 +730,42 @@ func (node *trieNode) traverseUnknown(resolver ValueResolver, tr *trieTraversalR
|
||||
return nil
|
||||
}
|
||||
|
||||
type triePrinter struct {
|
||||
depth int
|
||||
w io.Writer
|
||||
// If term `a` is one of the function's operands, we store a Ref: `args[0]`
|
||||
// for the argument number. So for `f(x, y) { x = 10; y = 12 }`, we'll
|
||||
// bind `args[0]` and `args[1]` to this rule when called for (x=10) and
|
||||
// (y=12) respectively.
|
||||
func eqOperandsToRefAndValue(isVirtual func(Ref) bool, args []*Term, a, b *Term) (*refindex, bool) {
|
||||
switch v := a.Value.(type) {
|
||||
case Var:
|
||||
for i, arg := range args {
|
||||
if arg.Value.Compare(v) == 0 {
|
||||
if bval, ok := indexValue(b); ok {
|
||||
return &refindex{Ref: Ref{FunctionArgRootDocument, IntNumberTerm(i)}, Value: bval}, true
|
||||
}
|
||||
}
|
||||
}
|
||||
case Ref:
|
||||
if !RootDocumentNames.Contains(v[0]) {
|
||||
return nil, false
|
||||
}
|
||||
if isVirtual(v) {
|
||||
return nil, false
|
||||
}
|
||||
if v.IsNested() || !v.IsGround() {
|
||||
return nil, false
|
||||
}
|
||||
if bval, ok := indexValue(b); ok {
|
||||
return &refindex{Ref: v, Value: bval}, true
|
||||
}
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func (p triePrinter) Do(x interface{}) trieWalker {
|
||||
padding := strings.Repeat(" ", p.depth)
|
||||
fmt.Fprintf(p.w, "%v%v\n", padding, x)
|
||||
p.depth++
|
||||
return p
|
||||
}
|
||||
|
||||
func eqOperandsToRefAndValue(isVirtual func(Ref) bool, a, b *Term) (Ref, Value, bool) {
|
||||
|
||||
ref, ok := a.Value.(Ref)
|
||||
if !ok {
|
||||
return nil, nil, false
|
||||
}
|
||||
|
||||
if !RootDocumentNames.Contains(ref[0]) {
|
||||
return nil, nil, false
|
||||
}
|
||||
|
||||
if isVirtual(ref) {
|
||||
return nil, nil, false
|
||||
}
|
||||
|
||||
if ref.IsNested() || !ref.IsGround() {
|
||||
return nil, nil, false
|
||||
}
|
||||
|
||||
func indexValue(b *Term) (Value, bool) {
|
||||
switch b := b.Value.(type) {
|
||||
case Null, Boolean, Number, String, Var:
|
||||
return ref, b, true
|
||||
case Array:
|
||||
return b, true
|
||||
case *Array:
|
||||
stop := false
|
||||
first := true
|
||||
vis := NewGenericVisitor(func(x interface{}) bool {
|
||||
@@ -690,33 +775,34 @@ func eqOperandsToRefAndValue(isVirtual func(Ref) bool, a, b *Term) (Ref, Value,
|
||||
}
|
||||
switch x.(type) {
|
||||
// No nested structures or values that require evaluation (other than var).
|
||||
case Array, Object, Set, *ArrayComprehension, *ObjectComprehension, *SetComprehension, Ref:
|
||||
case *Array, Object, Set, *ArrayComprehension, *ObjectComprehension, *SetComprehension, Ref:
|
||||
stop = true
|
||||
}
|
||||
return stop
|
||||
})
|
||||
vis.Walk(b)
|
||||
if !stop {
|
||||
return ref, b, true
|
||||
return b, true
|
||||
}
|
||||
}
|
||||
|
||||
return nil, nil, false
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func globDelimiterToString(delim *Term) (string, bool) {
|
||||
|
||||
arr, ok := delim.Value.(Array)
|
||||
arr, ok := delim.Value.(*Array)
|
||||
if !ok {
|
||||
return "", false
|
||||
}
|
||||
|
||||
var result string
|
||||
|
||||
if len(arr) == 0 {
|
||||
if arr.Len() == 0 {
|
||||
result = "."
|
||||
} else {
|
||||
for _, term := range arr {
|
||||
for i := 0; i < arr.Len(); i++ {
|
||||
term := arr.Elem(i)
|
||||
s, ok := term.Value.(String)
|
||||
if !ok {
|
||||
return "", false
|
||||
@@ -736,11 +822,11 @@ func globPatternToArray(pattern *Term, delim string) *Term {
|
||||
}
|
||||
|
||||
parts := splitStringEscaped(string(s), delim)
|
||||
result := make(Array, len(parts))
|
||||
arr := make([]*Term, len(parts))
|
||||
|
||||
for i := range parts {
|
||||
if parts[i] == "*" {
|
||||
result[i] = VarTerm("$globwildcard")
|
||||
arr[i] = VarTerm("$globwildcard")
|
||||
} else {
|
||||
var escaped bool
|
||||
for _, c := range parts[i] {
|
||||
@@ -758,11 +844,11 @@ func globPatternToArray(pattern *Term, delim string) *Term {
|
||||
}
|
||||
escaped = false
|
||||
}
|
||||
result[i] = StringTerm(parts[i])
|
||||
arr[i] = StringTerm(parts[i])
|
||||
}
|
||||
}
|
||||
|
||||
return NewTerm(result)
|
||||
return NewTerm(NewArray(arr...))
|
||||
}
|
||||
|
||||
// splits s on characters in delim except if delim characters have been escaped
|
||||
@@ -789,10 +875,10 @@ func splitStringEscaped(s string, delim string) []string {
|
||||
return result
|
||||
}
|
||||
|
||||
func stringSliceToArray(s []string) (result Array) {
|
||||
result = make(Array, len(s))
|
||||
for i := range s {
|
||||
result[i] = StringTerm(s[i])
|
||||
func stringSliceToArray(s []string) *Array {
|
||||
arr := make([]*Term, len(s))
|
||||
for i, v := range s {
|
||||
arr[i] = StringTerm(v)
|
||||
}
|
||||
return
|
||||
return NewArray(arr...)
|
||||
}
|
||||
|
||||
431
vendor/github.com/open-policy-agent/opa/ast/internal/scanner/scanner.go
generated
vendored
Normal file
431
vendor/github.com/open-policy-agent/opa/ast/internal/scanner/scanner.go
generated
vendored
Normal file
@@ -0,0 +1,431 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package scanner
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/open-policy-agent/opa/ast/internal/tokens"
|
||||
)
|
||||
|
||||
const bom = 0xFEFF
|
||||
|
||||
// Scanner is used to tokenize an input stream of
|
||||
// Rego source code.
|
||||
type Scanner struct {
|
||||
offset int
|
||||
row int
|
||||
col int
|
||||
bs []byte
|
||||
curr rune
|
||||
width int
|
||||
errors []Error
|
||||
keywords map[string]tokens.Token
|
||||
}
|
||||
|
||||
// Error represents a scanner error.
|
||||
type Error struct {
|
||||
Pos Position
|
||||
Message string
|
||||
}
|
||||
|
||||
// Position represents a point in the scanned source code.
|
||||
type Position struct {
|
||||
Offset int // start offset in bytes
|
||||
End int // end offset in bytes
|
||||
Row int // line number computed in bytes
|
||||
Col int // column number computed in bytes
|
||||
}
|
||||
|
||||
// New returns an initialized scanner that will scan
|
||||
// through the source code provided by the io.Reader.
|
||||
func New(r io.Reader) (*Scanner, error) {
|
||||
|
||||
bs, err := ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s := &Scanner{
|
||||
offset: 0,
|
||||
row: 1,
|
||||
col: 0,
|
||||
bs: bs,
|
||||
curr: -1,
|
||||
width: 0,
|
||||
keywords: tokens.Keywords(),
|
||||
}
|
||||
|
||||
s.next()
|
||||
|
||||
if s.curr == bom {
|
||||
s.next()
|
||||
}
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// Bytes returns the raw bytes for the full source
|
||||
// which the scanner has read in.
|
||||
func (s *Scanner) Bytes() []byte {
|
||||
return s.bs
|
||||
}
|
||||
|
||||
// String returns a human readable string of the current scanner state.
|
||||
func (s *Scanner) String() string {
|
||||
return fmt.Sprintf("<curr: %q, offset: %d, len: %d>", s.curr, s.offset, len(s.bs))
|
||||
}
|
||||
|
||||
// Keyword will return a token for the passed in
|
||||
// literal value. If the value is a Rego keyword
|
||||
// then the appropriate token is returned. Everything
|
||||
// else is an Ident.
|
||||
func (s *Scanner) Keyword(lit string) tokens.Token {
|
||||
if tok, ok := s.keywords[lit]; ok {
|
||||
return tok
|
||||
}
|
||||
return tokens.Ident
|
||||
}
|
||||
|
||||
// AddKeyword adds a string -> token mapping to this Scanner instance.
|
||||
func (s *Scanner) AddKeyword(kw string, tok tokens.Token) {
|
||||
s.keywords[kw] = tok
|
||||
|
||||
switch tok {
|
||||
case tokens.Every: // importing 'every' means also importing 'in'
|
||||
s.keywords["in"] = tokens.In
|
||||
}
|
||||
}
|
||||
|
||||
// WithKeywords returns a new copy of the Scanner struct `s`, with the set
|
||||
// of known keywords being that of `s` with `kws` added.
|
||||
func (s *Scanner) WithKeywords(kws map[string]tokens.Token) *Scanner {
|
||||
cpy := *s
|
||||
cpy.keywords = make(map[string]tokens.Token, len(s.keywords)+len(kws))
|
||||
for kw, tok := range s.keywords {
|
||||
cpy.AddKeyword(kw, tok)
|
||||
}
|
||||
for k, t := range kws {
|
||||
cpy.AddKeyword(k, t)
|
||||
}
|
||||
return &cpy
|
||||
}
|
||||
|
||||
// WithoutKeywords returns a new copy of the Scanner struct `s`, with the
|
||||
// set of known keywords being that of `s` with `kws` removed.
|
||||
// The previously known keywords are returned for a convenient reset.
|
||||
func (s *Scanner) WithoutKeywords(kws map[string]tokens.Token) (*Scanner, map[string]tokens.Token) {
|
||||
cpy := *s
|
||||
kw := s.keywords
|
||||
cpy.keywords = make(map[string]tokens.Token, len(s.keywords)-len(kws))
|
||||
for kw, tok := range s.keywords {
|
||||
if _, ok := kws[kw]; !ok {
|
||||
cpy.AddKeyword(kw, tok)
|
||||
}
|
||||
}
|
||||
return &cpy, kw
|
||||
}
|
||||
|
||||
// Scan will increment the scanners position in the source
|
||||
// code until the next token is found. The token, starting position
|
||||
// of the token, string literal, and any errors encountered are
|
||||
// returned. A token will always be returned, the caller must check
|
||||
// for any errors before using the other values.
|
||||
func (s *Scanner) Scan() (tokens.Token, Position, string, []Error) {
|
||||
|
||||
pos := Position{Offset: s.offset - s.width, Row: s.row, Col: s.col}
|
||||
var tok tokens.Token
|
||||
var lit string
|
||||
|
||||
if s.isWhitespace() {
|
||||
lit = string(s.curr)
|
||||
s.next()
|
||||
tok = tokens.Whitespace
|
||||
} else if isLetter(s.curr) {
|
||||
lit = s.scanIdentifier()
|
||||
tok = s.Keyword(lit)
|
||||
} else if isDecimal(s.curr) {
|
||||
lit = s.scanNumber()
|
||||
tok = tokens.Number
|
||||
} else {
|
||||
ch := s.curr
|
||||
s.next()
|
||||
switch ch {
|
||||
case -1:
|
||||
tok = tokens.EOF
|
||||
case '#':
|
||||
lit = s.scanComment()
|
||||
tok = tokens.Comment
|
||||
case '"':
|
||||
lit = s.scanString()
|
||||
tok = tokens.String
|
||||
case '`':
|
||||
lit = s.scanRawString()
|
||||
tok = tokens.String
|
||||
case '[':
|
||||
tok = tokens.LBrack
|
||||
case ']':
|
||||
tok = tokens.RBrack
|
||||
case '{':
|
||||
tok = tokens.LBrace
|
||||
case '}':
|
||||
tok = tokens.RBrace
|
||||
case '(':
|
||||
tok = tokens.LParen
|
||||
case ')':
|
||||
tok = tokens.RParen
|
||||
case ',':
|
||||
tok = tokens.Comma
|
||||
case ':':
|
||||
if s.curr == '=' {
|
||||
s.next()
|
||||
tok = tokens.Assign
|
||||
} else {
|
||||
tok = tokens.Colon
|
||||
}
|
||||
case '+':
|
||||
tok = tokens.Add
|
||||
case '-':
|
||||
tok = tokens.Sub
|
||||
case '*':
|
||||
tok = tokens.Mul
|
||||
case '/':
|
||||
tok = tokens.Quo
|
||||
case '%':
|
||||
tok = tokens.Rem
|
||||
case '&':
|
||||
tok = tokens.And
|
||||
case '|':
|
||||
tok = tokens.Or
|
||||
case '=':
|
||||
if s.curr == '=' {
|
||||
s.next()
|
||||
tok = tokens.Equal
|
||||
} else {
|
||||
tok = tokens.Unify
|
||||
}
|
||||
case '>':
|
||||
if s.curr == '=' {
|
||||
s.next()
|
||||
tok = tokens.Gte
|
||||
} else {
|
||||
tok = tokens.Gt
|
||||
}
|
||||
case '<':
|
||||
if s.curr == '=' {
|
||||
s.next()
|
||||
tok = tokens.Lte
|
||||
} else {
|
||||
tok = tokens.Lt
|
||||
}
|
||||
case '!':
|
||||
if s.curr == '=' {
|
||||
s.next()
|
||||
tok = tokens.Neq
|
||||
} else {
|
||||
s.error("illegal ! character")
|
||||
}
|
||||
case ';':
|
||||
tok = tokens.Semicolon
|
||||
case '.':
|
||||
tok = tokens.Dot
|
||||
}
|
||||
}
|
||||
|
||||
pos.End = s.offset - s.width
|
||||
errs := s.errors
|
||||
s.errors = nil
|
||||
|
||||
return tok, pos, lit, errs
|
||||
}
|
||||
|
||||
func (s *Scanner) scanIdentifier() string {
|
||||
start := s.offset - 1
|
||||
for isLetter(s.curr) || isDigit(s.curr) {
|
||||
s.next()
|
||||
}
|
||||
return string(s.bs[start : s.offset-1])
|
||||
}
|
||||
|
||||
func (s *Scanner) scanNumber() string {
|
||||
|
||||
start := s.offset - 1
|
||||
|
||||
if s.curr != '.' {
|
||||
for isDecimal(s.curr) {
|
||||
s.next()
|
||||
}
|
||||
}
|
||||
|
||||
if s.curr == '.' {
|
||||
s.next()
|
||||
var found bool
|
||||
for isDecimal(s.curr) {
|
||||
s.next()
|
||||
found = true
|
||||
}
|
||||
if !found {
|
||||
s.error("expected fraction")
|
||||
}
|
||||
}
|
||||
|
||||
if lower(s.curr) == 'e' {
|
||||
s.next()
|
||||
if s.curr == '+' || s.curr == '-' {
|
||||
s.next()
|
||||
}
|
||||
var found bool
|
||||
for isDecimal(s.curr) {
|
||||
s.next()
|
||||
found = true
|
||||
}
|
||||
if !found {
|
||||
s.error("expected exponent")
|
||||
}
|
||||
}
|
||||
|
||||
// Scan any digits following the decimals to get the
|
||||
// entire invalid number/identifier.
|
||||
// Example: 0a2b should be a single invalid number "0a2b"
|
||||
// rather than a number "0", followed by identifier "a2b".
|
||||
if isLetter(s.curr) {
|
||||
s.error("illegal number format")
|
||||
for isLetter(s.curr) || isDigit(s.curr) {
|
||||
s.next()
|
||||
}
|
||||
}
|
||||
|
||||
return string(s.bs[start : s.offset-1])
|
||||
}
|
||||
|
||||
func (s *Scanner) scanString() string {
|
||||
start := s.literalStart()
|
||||
for {
|
||||
ch := s.curr
|
||||
|
||||
if ch == '\n' || ch < 0 {
|
||||
s.error("non-terminated string")
|
||||
break
|
||||
}
|
||||
|
||||
s.next()
|
||||
|
||||
if ch == '"' {
|
||||
break
|
||||
}
|
||||
|
||||
if ch == '\\' {
|
||||
switch s.curr {
|
||||
case '\\', '"', '/', 'b', 'f', 'n', 'r', 't':
|
||||
s.next()
|
||||
case 'u':
|
||||
s.next()
|
||||
s.next()
|
||||
s.next()
|
||||
s.next()
|
||||
default:
|
||||
s.error("illegal escape sequence")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return string(s.bs[start : s.offset-1])
|
||||
}
|
||||
|
||||
func (s *Scanner) scanRawString() string {
|
||||
start := s.literalStart()
|
||||
for {
|
||||
ch := s.curr
|
||||
s.next()
|
||||
if ch == '`' {
|
||||
break
|
||||
} else if ch < 0 {
|
||||
s.error("non-terminated string")
|
||||
break
|
||||
}
|
||||
}
|
||||
return string(s.bs[start : s.offset-1])
|
||||
}
|
||||
|
||||
func (s *Scanner) scanComment() string {
|
||||
start := s.literalStart()
|
||||
for s.curr != '\n' && s.curr != -1 {
|
||||
s.next()
|
||||
}
|
||||
end := s.offset - 1
|
||||
// Trim carriage returns that precede the newline
|
||||
if s.offset > 1 && s.bs[s.offset-2] == '\r' {
|
||||
end = end - 1
|
||||
}
|
||||
return string(s.bs[start:end])
|
||||
}
|
||||
|
||||
func (s *Scanner) next() {
|
||||
|
||||
if s.offset >= len(s.bs) {
|
||||
s.curr = -1
|
||||
s.offset = len(s.bs) + 1
|
||||
return
|
||||
}
|
||||
|
||||
s.curr = rune(s.bs[s.offset])
|
||||
s.width = 1
|
||||
|
||||
if s.curr == 0 {
|
||||
s.error("illegal null character")
|
||||
} else if s.curr >= utf8.RuneSelf {
|
||||
s.curr, s.width = utf8.DecodeRune(s.bs[s.offset:])
|
||||
if s.curr == utf8.RuneError && s.width == 1 {
|
||||
s.error("illegal utf-8 character")
|
||||
} else if s.curr == bom && s.offset > 0 {
|
||||
s.error("illegal byte-order mark")
|
||||
}
|
||||
}
|
||||
|
||||
s.offset += s.width
|
||||
|
||||
if s.curr == '\n' {
|
||||
s.row++
|
||||
s.col = 0
|
||||
} else {
|
||||
s.col++
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scanner) literalStart() int {
|
||||
// The current offset is at the first character past the literal delimiter (#, ", `, etc.)
|
||||
// Need to subtract width of first character (plus one for the delimiter).
|
||||
return s.offset - (s.width + 1)
|
||||
}
|
||||
|
||||
// From the Go scanner (src/go/scanner/scanner.go)
|
||||
|
||||
func isLetter(ch rune) bool {
|
||||
return 'a' <= lower(ch) && lower(ch) <= 'z' || ch == '_'
|
||||
}
|
||||
|
||||
func isDigit(ch rune) bool {
|
||||
return isDecimal(ch) || ch >= utf8.RuneSelf && unicode.IsDigit(ch)
|
||||
}
|
||||
|
||||
func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' }
|
||||
|
||||
func lower(ch rune) rune { return ('a' - 'A') | ch } // returns lower-case ch iff ch is ASCII letter
|
||||
|
||||
func (s *Scanner) isWhitespace() bool {
|
||||
return s.curr == ' ' || s.curr == '\t' || s.curr == '\n' || s.curr == '\r'
|
||||
}
|
||||
|
||||
func (s *Scanner) error(reason string) {
|
||||
s.errors = append(s.errors, Error{Pos: Position{
|
||||
Offset: s.offset,
|
||||
Row: s.row,
|
||||
Col: s.col,
|
||||
}, Message: reason})
|
||||
}
|
||||
151
vendor/github.com/open-policy-agent/opa/ast/internal/tokens/tokens.go
generated
vendored
Normal file
151
vendor/github.com/open-policy-agent/opa/ast/internal/tokens/tokens.go
generated
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package tokens
|
||||
|
||||
// Token represents a single Rego source code token
|
||||
// for use by the Parser.
|
||||
type Token int
|
||||
|
||||
func (t Token) String() string {
|
||||
if t < 0 || int(t) >= len(strings) {
|
||||
return "unknown"
|
||||
}
|
||||
return strings[t]
|
||||
}
|
||||
|
||||
// All tokens must be defined here
|
||||
const (
|
||||
Illegal Token = iota
|
||||
EOF
|
||||
Whitespace
|
||||
Ident
|
||||
Comment
|
||||
|
||||
Package
|
||||
Import
|
||||
As
|
||||
Default
|
||||
Else
|
||||
Not
|
||||
Some
|
||||
With
|
||||
Null
|
||||
True
|
||||
False
|
||||
|
||||
Number
|
||||
String
|
||||
|
||||
LBrack
|
||||
RBrack
|
||||
LBrace
|
||||
RBrace
|
||||
LParen
|
||||
RParen
|
||||
Comma
|
||||
Colon
|
||||
|
||||
Add
|
||||
Sub
|
||||
Mul
|
||||
Quo
|
||||
Rem
|
||||
And
|
||||
Or
|
||||
Unify
|
||||
Equal
|
||||
Assign
|
||||
In
|
||||
Neq
|
||||
Gt
|
||||
Lt
|
||||
Gte
|
||||
Lte
|
||||
Dot
|
||||
Semicolon
|
||||
|
||||
Every
|
||||
Contains
|
||||
If
|
||||
)
|
||||
|
||||
var strings = [...]string{
|
||||
Illegal: "illegal",
|
||||
EOF: "eof",
|
||||
Whitespace: "whitespace",
|
||||
Comment: "comment",
|
||||
Ident: "ident",
|
||||
Package: "package",
|
||||
Import: "import",
|
||||
As: "as",
|
||||
Default: "default",
|
||||
Else: "else",
|
||||
Not: "not",
|
||||
Some: "some",
|
||||
With: "with",
|
||||
Null: "null",
|
||||
True: "true",
|
||||
False: "false",
|
||||
Number: "number",
|
||||
String: "string",
|
||||
LBrack: "[",
|
||||
RBrack: "]",
|
||||
LBrace: "{",
|
||||
RBrace: "}",
|
||||
LParen: "(",
|
||||
RParen: ")",
|
||||
Comma: ",",
|
||||
Colon: ":",
|
||||
Add: "plus",
|
||||
Sub: "minus",
|
||||
Mul: "mul",
|
||||
Quo: "div",
|
||||
Rem: "rem",
|
||||
And: "and",
|
||||
Or: "or",
|
||||
Unify: "eq",
|
||||
Equal: "equal",
|
||||
Assign: "assign",
|
||||
In: "in",
|
||||
Neq: "neq",
|
||||
Gt: "gt",
|
||||
Lt: "lt",
|
||||
Gte: "gte",
|
||||
Lte: "lte",
|
||||
Dot: ".",
|
||||
Semicolon: ";",
|
||||
Every: "every",
|
||||
Contains: "contains",
|
||||
If: "if",
|
||||
}
|
||||
|
||||
var keywords = map[string]Token{
|
||||
"package": Package,
|
||||
"import": Import,
|
||||
"as": As,
|
||||
"default": Default,
|
||||
"else": Else,
|
||||
"not": Not,
|
||||
"some": Some,
|
||||
"with": With,
|
||||
"null": Null,
|
||||
"true": True,
|
||||
"false": False,
|
||||
}
|
||||
|
||||
// Keywords returns a copy of the default string -> Token keyword map.
|
||||
func Keywords() map[string]Token {
|
||||
cpy := make(map[string]Token, len(keywords))
|
||||
for k, v := range keywords {
|
||||
cpy[k] = v
|
||||
}
|
||||
return cpy
|
||||
}
|
||||
|
||||
// IsKeyword returns if a token is a keyword
|
||||
func IsKeyword(tok Token) bool {
|
||||
_, ok := keywords[strings[tok]]
|
||||
return ok
|
||||
}
|
||||
90
vendor/github.com/open-policy-agent/opa/ast/location/location.go
generated
vendored
Normal file
90
vendor/github.com/open-policy-agent/opa/ast/location/location.go
generated
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
// Package location defines locations in Rego source code.
|
||||
package location
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// Location records a position in source code
|
||||
type Location struct {
|
||||
Text []byte `json:"-"` // The original text fragment from the source.
|
||||
File string `json:"file"` // The name of the source file (which may be empty).
|
||||
Row int `json:"row"` // The line in the source.
|
||||
Col int `json:"col"` // The column in the row.
|
||||
Offset int `json:"-"` // The byte offset for the location in the source.
|
||||
}
|
||||
|
||||
// NewLocation returns a new Location object.
|
||||
func NewLocation(text []byte, file string, row int, col int) *Location {
|
||||
return &Location{Text: text, File: file, Row: row, Col: col}
|
||||
}
|
||||
|
||||
// Equal checks if two locations are equal to each other.
|
||||
func (loc *Location) Equal(other *Location) bool {
|
||||
return bytes.Equal(loc.Text, other.Text) &&
|
||||
loc.File == other.File &&
|
||||
loc.Row == other.Row &&
|
||||
loc.Col == other.Col
|
||||
}
|
||||
|
||||
// Errorf returns a new error value with a message formatted to include the location
|
||||
// info (e.g., line, column, filename, etc.)
|
||||
func (loc *Location) Errorf(f string, a ...interface{}) error {
|
||||
return errors.New(loc.Format(f, a...))
|
||||
}
|
||||
|
||||
// Wrapf returns a new error value that wraps an existing error with a message formatted
|
||||
// to include the location info (e.g., line, column, filename, etc.)
|
||||
func (loc *Location) Wrapf(err error, f string, a ...interface{}) error {
|
||||
return fmt.Errorf(loc.Format(f, a...)+": %w", err)
|
||||
}
|
||||
|
||||
// Format returns a formatted string prefixed with the location information.
|
||||
func (loc *Location) Format(f string, a ...interface{}) string {
|
||||
if len(loc.File) > 0 {
|
||||
f = fmt.Sprintf("%v:%v: %v", loc.File, loc.Row, f)
|
||||
} else {
|
||||
f = fmt.Sprintf("%v:%v: %v", loc.Row, loc.Col, f)
|
||||
}
|
||||
return fmt.Sprintf(f, a...)
|
||||
}
|
||||
|
||||
func (loc *Location) String() string {
|
||||
if len(loc.File) > 0 {
|
||||
return fmt.Sprintf("%v:%v", loc.File, loc.Row)
|
||||
}
|
||||
if len(loc.Text) > 0 {
|
||||
return string(loc.Text)
|
||||
}
|
||||
return fmt.Sprintf("%v:%v", loc.Row, loc.Col)
|
||||
}
|
||||
|
||||
// Compare returns -1, 0, or 1 to indicate if this loc is less than, equal to,
|
||||
// or greater than the other. Comparison is performed on the file, row, and
|
||||
// column of the Location (but not on the text.) Nil locations are greater than
|
||||
// non-nil locations.
|
||||
func (loc *Location) Compare(other *Location) int {
|
||||
if loc == nil && other == nil {
|
||||
return 0
|
||||
} else if loc == nil {
|
||||
return 1
|
||||
} else if other == nil {
|
||||
return -1
|
||||
} else if loc.File < other.File {
|
||||
return -1
|
||||
} else if loc.File > other.File {
|
||||
return 1
|
||||
} else if loc.Row < other.Row {
|
||||
return -1
|
||||
} else if loc.Row > other.Row {
|
||||
return 1
|
||||
} else if loc.Col < other.Col {
|
||||
return -1
|
||||
} else if loc.Col > other.Col {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
7431
vendor/github.com/open-policy-agent/opa/ast/parser.go
generated
vendored
7431
vendor/github.com/open-policy-agent/opa/ast/parser.go
generated
vendored
File diff suppressed because it is too large
Load Diff
425
vendor/github.com/open-policy-agent/opa/ast/parser_ext.go
generated
vendored
425
vendor/github.com/open-policy-agent/opa/ast/parser_ext.go
generated
vendored
@@ -3,26 +3,31 @@
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// This file contains extra functions for parsing Rego.
|
||||
// Most of the parsing is handled by the auto-generated code in
|
||||
// parser.go, however, there are additional utilities that are
|
||||
// Most of the parsing is handled by the code in parser.go,
|
||||
// however, there are additional utilities that are
|
||||
// helpful for dealing with Rego source inputs (e.g., REPL
|
||||
// statements, source files, etc.)
|
||||
|
||||
package ast
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// MustParseBody returns a parsed body.
|
||||
// If an error occurs during parsing, panic.
|
||||
func MustParseBody(input string) Body {
|
||||
parsed, err := ParseBody(input)
|
||||
return MustParseBodyWithOpts(input, ParserOptions{})
|
||||
}
|
||||
|
||||
// MustParseBodyWithOpts returns a parsed body.
|
||||
// If an error occurs during parsing, panic.
|
||||
func MustParseBodyWithOpts(input string, opts ParserOptions) Body {
|
||||
parsed, err := ParseBodyWithOpts(input, opts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@@ -52,7 +57,13 @@ func MustParseImports(input string) []*Import {
|
||||
// MustParseModule returns a parsed module.
|
||||
// If an error occurs during parsing, panic.
|
||||
func MustParseModule(input string) *Module {
|
||||
parsed, err := ParseModule("", input)
|
||||
return MustParseModuleWithOpts(input, ParserOptions{})
|
||||
}
|
||||
|
||||
// MustParseModuleWithOpts returns a parsed module.
|
||||
// If an error occurs during parsing, panic.
|
||||
func MustParseModuleWithOpts(input string, opts ParserOptions) *Module {
|
||||
parsed, err := ParseModuleWithOpts("", input, opts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@@ -161,37 +172,15 @@ func ParseRuleFromExpr(module *Module, expr *Expr) (*Rule, error) {
|
||||
return nil, errors.New("expression cannot be used for rule head")
|
||||
}
|
||||
|
||||
if expr.IsAssignment() {
|
||||
|
||||
lhs, rhs := expr.Operand(0), expr.Operand(1)
|
||||
rule, err := ParseCompleteDocRuleFromAssignmentExpr(module, lhs, rhs)
|
||||
|
||||
if err == nil {
|
||||
return rule, nil
|
||||
} else if _, ok := lhs.Value.(Call); ok {
|
||||
return nil, errFunctionAssignOperator
|
||||
} else if _, ok := lhs.Value.(Ref); ok {
|
||||
return nil, errPartialRuleAssignOperator
|
||||
}
|
||||
|
||||
return nil, errTermAssignOperator(lhs.Value)
|
||||
}
|
||||
|
||||
if expr.IsEquality() {
|
||||
|
||||
lhs, rhs := expr.Operand(0), expr.Operand(1)
|
||||
rule, err := ParseCompleteDocRuleFromEqExpr(module, lhs, rhs)
|
||||
|
||||
if err == nil {
|
||||
return rule, nil
|
||||
return parseCompleteRuleFromEq(module, expr)
|
||||
} else if expr.IsAssignment() {
|
||||
rule, err := parseCompleteRuleFromEq(module, expr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rule, err = ParseRuleFromCallEqExpr(module, lhs, rhs)
|
||||
if err == nil {
|
||||
return rule, nil
|
||||
}
|
||||
|
||||
return ParsePartialObjectDocRuleFromEqExpr(module, lhs, rhs)
|
||||
rule.Head.Assign = true
|
||||
return rule, nil
|
||||
}
|
||||
|
||||
if _, ok := BuiltinMap[expr.Operator().String()]; ok {
|
||||
@@ -201,6 +190,37 @@ func ParseRuleFromExpr(module *Module, expr *Expr) (*Rule, error) {
|
||||
return ParseRuleFromCallExpr(module, expr.Terms.([]*Term))
|
||||
}
|
||||
|
||||
func parseCompleteRuleFromEq(module *Module, expr *Expr) (rule *Rule, err error) {
|
||||
|
||||
// ensure the rule location is set to the expr location
|
||||
// the helper functions called below try to set the location based
|
||||
// on the terms they've been provided but that is not as accurate.
|
||||
defer func() {
|
||||
if rule != nil {
|
||||
rule.Location = expr.Location
|
||||
rule.Head.Location = expr.Location
|
||||
}
|
||||
}()
|
||||
|
||||
lhs, rhs := expr.Operand(0), expr.Operand(1)
|
||||
if lhs == nil || rhs == nil {
|
||||
return nil, errors.New("assignment requires two operands")
|
||||
}
|
||||
|
||||
rule, err = ParseCompleteDocRuleFromEqExpr(module, lhs, rhs)
|
||||
|
||||
if err == nil {
|
||||
return rule, nil
|
||||
}
|
||||
|
||||
rule, err = ParseRuleFromCallEqExpr(module, lhs, rhs)
|
||||
if err == nil {
|
||||
return rule, nil
|
||||
}
|
||||
|
||||
return ParsePartialObjectDocRuleFromEqExpr(module, lhs, rhs)
|
||||
}
|
||||
|
||||
// ParseCompleteDocRuleFromAssignmentExpr returns a rule if the expression can
|
||||
// be interpreted as a complete document definition declared with the assignment
|
||||
// operator.
|
||||
@@ -231,9 +251,9 @@ func ParseCompleteDocRuleFromEqExpr(module *Module, lhs, rhs *Term) (*Rule, erro
|
||||
}
|
||||
|
||||
rule := &Rule{
|
||||
Location: rhs.Location,
|
||||
Location: lhs.Location,
|
||||
Head: &Head{
|
||||
Location: rhs.Location,
|
||||
Location: lhs.Location,
|
||||
Name: name,
|
||||
Value: rhs,
|
||||
},
|
||||
@@ -252,7 +272,11 @@ func ParsePartialObjectDocRuleFromEqExpr(module *Module, lhs, rhs *Term) (*Rule,
|
||||
|
||||
ref, ok := lhs.Value.(Ref)
|
||||
if !ok || len(ref) != 2 {
|
||||
return nil, fmt.Errorf("%v cannot be used for rule name", TypeName(lhs.Value))
|
||||
return nil, fmt.Errorf("%v cannot be used as rule name", TypeName(lhs.Value))
|
||||
}
|
||||
|
||||
if _, ok := ref[0].Value.(Var); !ok {
|
||||
return nil, fmt.Errorf("%vs cannot be used as rule name", TypeName(ref[0].Value))
|
||||
}
|
||||
|
||||
name := ref[0].Value.(Var)
|
||||
@@ -288,11 +312,16 @@ func ParsePartialSetDocRuleFromTerm(module *Module, term *Term) (*Rule, error) {
|
||||
return nil, fmt.Errorf("refs cannot be used for rule")
|
||||
}
|
||||
|
||||
name, ok := ref[0].Value.(Var)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("%vs cannot be used as rule name", TypeName(ref[0].Value))
|
||||
}
|
||||
|
||||
rule := &Rule{
|
||||
Location: term.Location,
|
||||
Head: &Head{
|
||||
Location: term.Location,
|
||||
Name: ref[0].Value.(Var),
|
||||
Name: name,
|
||||
Key: ref[1],
|
||||
},
|
||||
Body: NewBody(
|
||||
@@ -313,11 +342,21 @@ func ParseRuleFromCallEqExpr(module *Module, lhs, rhs *Term) (*Rule, error) {
|
||||
return nil, fmt.Errorf("must be call")
|
||||
}
|
||||
|
||||
ref, ok := call[0].Value.(Ref)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("%vs cannot be used in function signature", TypeName(call[0].Value))
|
||||
}
|
||||
|
||||
name, ok := ref[0].Value.(Var)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("%vs cannot be used in function signature", TypeName(ref[0].Value))
|
||||
}
|
||||
|
||||
rule := &Rule{
|
||||
Location: lhs.Location,
|
||||
Head: &Head{
|
||||
Location: lhs.Location,
|
||||
Name: call[0].Value.(Ref)[0].Value.(Var),
|
||||
Name: name,
|
||||
Args: Args(call[1:]),
|
||||
Value: rhs,
|
||||
},
|
||||
@@ -375,7 +414,14 @@ func ParseImports(input string) ([]*Import, error) {
|
||||
// For details on Module objects and their fields, see policy.go.
|
||||
// Empty input will return nil, nil.
|
||||
func ParseModule(filename, input string) (*Module, error) {
|
||||
stmts, comments, err := ParseStatements(filename, input)
|
||||
return ParseModuleWithOpts(filename, input, ParserOptions{})
|
||||
}
|
||||
|
||||
// ParseModuleWithOpts returns a parsed Module object, and has an additional input ParserOptions
|
||||
// For details on Module objects and their fields, see policy.go.
|
||||
// Empty input will return nil, nil.
|
||||
func ParseModuleWithOpts(filename, input string, popts ParserOptions) (*Module, error) {
|
||||
stmts, comments, err := ParseStatementsWithOpts(filename, input, popts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -385,7 +431,14 @@ func ParseModule(filename, input string) (*Module, error) {
|
||||
// ParseBody returns exactly one body.
|
||||
// If multiple bodies are parsed, an error is returned.
|
||||
func ParseBody(input string) (Body, error) {
|
||||
stmts, _, err := ParseStatements("", input)
|
||||
return ParseBodyWithOpts(input, ParserOptions{SkipRules: true})
|
||||
}
|
||||
|
||||
// ParseBodyWithOpts returns exactly one body. It does _not_ set SkipRules: true on its own,
|
||||
// but respects whatever ParserOptions it's been given.
|
||||
func ParseBodyWithOpts(input string, popts ParserOptions) (Body, error) {
|
||||
|
||||
stmts, _, err := ParseStatementsWithOpts("", input, popts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -395,7 +448,9 @@ func ParseBody(input string) (Body, error) {
|
||||
for _, stmt := range stmts {
|
||||
switch stmt := stmt.(type) {
|
||||
case Body:
|
||||
result = append(result, stmt...)
|
||||
for i := range stmt {
|
||||
result.Append(stmt[i])
|
||||
}
|
||||
case *Comment:
|
||||
// skip
|
||||
default:
|
||||
@@ -403,8 +458,6 @@ func ParseBody(input string) (Body, error) {
|
||||
}
|
||||
}
|
||||
|
||||
setExprIndices(result)
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -413,7 +466,7 @@ func ParseBody(input string) (Body, error) {
|
||||
func ParseExpr(input string) (*Expr, error) {
|
||||
body, err := ParseBody(input)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse expression")
|
||||
return nil, fmt.Errorf("failed to parse expression: %w", err)
|
||||
}
|
||||
if len(body) != 1 {
|
||||
return nil, fmt.Errorf("expected exactly one expression but got: %v", body)
|
||||
@@ -440,7 +493,7 @@ func ParsePackage(input string) (*Package, error) {
|
||||
func ParseTerm(input string) (*Term, error) {
|
||||
body, err := ParseBody(input)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse term")
|
||||
return nil, fmt.Errorf("failed to parse term: %w", err)
|
||||
}
|
||||
if len(body) != 1 {
|
||||
return nil, fmt.Errorf("expected exactly one term but got: %v", body)
|
||||
@@ -456,7 +509,7 @@ func ParseTerm(input string) (*Term, error) {
|
||||
func ParseRef(input string) (Ref, error) {
|
||||
term, err := ParseTerm(input)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to parse ref")
|
||||
return nil, fmt.Errorf("failed to parse ref: %w", err)
|
||||
}
|
||||
ref, ok := term.Value.(Ref)
|
||||
if !ok {
|
||||
@@ -497,106 +550,32 @@ func ParseStatement(input string) (Statement, error) {
|
||||
return stmts[0], nil
|
||||
}
|
||||
|
||||
// CommentsOption returns a parser option to initialize the comments store within
|
||||
// the parser.
|
||||
func CommentsOption() Option {
|
||||
return GlobalStore(commentsKey, map[commentKey]*Comment{})
|
||||
}
|
||||
|
||||
type commentKey struct {
|
||||
File string
|
||||
Row int
|
||||
Col int
|
||||
}
|
||||
|
||||
func (a commentKey) Compare(other commentKey) int {
|
||||
if a.File < other.File {
|
||||
return -1
|
||||
} else if a.File > other.File {
|
||||
return 1
|
||||
} else if a.Row < other.Row {
|
||||
return -1
|
||||
} else if a.Row > other.Row {
|
||||
return 1
|
||||
} else if a.Col < other.Col {
|
||||
return -1
|
||||
} else if a.Col > other.Col {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// ParseStatements returns a slice of parsed statements.
|
||||
// This is the default return value from the parser.
|
||||
// ParseStatements is deprecated. Use ParseStatementWithOpts instead.
|
||||
func ParseStatements(filename, input string) ([]Statement, []*Comment, error) {
|
||||
|
||||
bs := []byte(input)
|
||||
|
||||
parsed, err := Parse(filename, bs, GlobalStore(filenameKey, filename), CommentsOption())
|
||||
if err != nil {
|
||||
return nil, nil, formatParserErrors(filename, bs, err)
|
||||
}
|
||||
|
||||
var comments []*Comment
|
||||
var sl []interface{}
|
||||
if p, ok := parsed.(program); ok {
|
||||
sl = p.buf
|
||||
commentMap := p.comments.(map[commentKey]*Comment)
|
||||
commentKeys := []commentKey{}
|
||||
for k := range commentMap {
|
||||
commentKeys = append(commentKeys, k)
|
||||
}
|
||||
sort.Slice(commentKeys, func(i, j int) bool {
|
||||
return commentKeys[i].Compare(commentKeys[j]) < 0
|
||||
})
|
||||
for _, k := range commentKeys {
|
||||
comments = append(comments, commentMap[k])
|
||||
}
|
||||
} else {
|
||||
sl = parsed.([]interface{})
|
||||
}
|
||||
stmts := make([]Statement, 0, len(sl))
|
||||
|
||||
for _, x := range sl {
|
||||
if rules, ok := x.([]*Rule); ok {
|
||||
for _, rule := range rules {
|
||||
stmts = append(stmts, rule)
|
||||
}
|
||||
} else {
|
||||
// Unchecked cast should be safe. A panic indicates grammar is
|
||||
// out-of-sync.
|
||||
stmts = append(stmts, x.(Statement))
|
||||
}
|
||||
}
|
||||
|
||||
return stmts, comments, postProcess(filename, stmts)
|
||||
return ParseStatementsWithOpts(filename, input, ParserOptions{})
|
||||
}
|
||||
|
||||
func formatParserErrors(filename string, bs []byte, err error) error {
|
||||
// Errors returned by the parser are always of type errList and the errList
|
||||
// always contains *parserError.
|
||||
// https://godoc.org/github.com/mna/pigeon#hdr-Error_reporting.
|
||||
errs := err.(errList)
|
||||
r := make(Errors, len(errs))
|
||||
for i, e := range errs {
|
||||
r[i] = formatParserError(filename, bs, e.(*parserError))
|
||||
}
|
||||
return r
|
||||
}
|
||||
// ParseStatementsWithOpts returns a slice of parsed statements. This is the
|
||||
// default return value from the parser.
|
||||
func ParseStatementsWithOpts(filename, input string, popts ParserOptions) ([]Statement, []*Comment, error) {
|
||||
|
||||
func formatParserError(filename string, bs []byte, e *parserError) *Error {
|
||||
loc := NewLocation(nil, filename, e.pos.line, e.pos.col)
|
||||
inner := e.Inner.Error()
|
||||
idx := strings.Index(inner, "no match found")
|
||||
if idx >= 0 {
|
||||
// Match errors end with "no match found, expected: ...". We do not want to
|
||||
// include ", expected: ..." as it does not provide any value, so truncate the
|
||||
// string here.
|
||||
inner = inner[:idx+14]
|
||||
parser := NewParser().
|
||||
WithFilename(filename).
|
||||
WithReader(bytes.NewBufferString(input)).
|
||||
WithProcessAnnotation(popts.ProcessAnnotation).
|
||||
WithFutureKeywords(popts.FutureKeywords...).
|
||||
WithAllFutureKeywords(popts.AllFutureKeywords).
|
||||
WithCapabilities(popts.Capabilities).
|
||||
WithSkipRules(popts.SkipRules).
|
||||
withUnreleasedKeywords(popts.unreleasedKeywords)
|
||||
|
||||
stmts, comments, errs := parser.Parse()
|
||||
|
||||
if len(errs) > 0 {
|
||||
return nil, nil, errs
|
||||
}
|
||||
err := NewError(ParseErr, loc, inner)
|
||||
err.Details = newParserErrorDetail(bs, e.pos)
|
||||
return err
|
||||
|
||||
return stmts, comments, nil
|
||||
}
|
||||
|
||||
func parseModule(filename string, stmts []Statement, comments []*Comment) (*Module, error) {
|
||||
@@ -607,20 +586,21 @@ func parseModule(filename string, stmts []Statement, comments []*Comment) (*Modu
|
||||
|
||||
var errs Errors
|
||||
|
||||
_package, ok := stmts[0].(*Package)
|
||||
pkg, ok := stmts[0].(*Package)
|
||||
if !ok {
|
||||
loc := stmts[0].(Statement).Loc()
|
||||
loc := stmts[0].Loc()
|
||||
errs = append(errs, NewError(ParseErr, loc, "package expected"))
|
||||
}
|
||||
|
||||
mod := &Module{
|
||||
Package: _package,
|
||||
Package: pkg,
|
||||
stmts: stmts,
|
||||
}
|
||||
|
||||
// The comments slice only holds comments that were not their own statements.
|
||||
mod.Comments = append(mod.Comments, comments...)
|
||||
|
||||
for _, stmt := range stmts[1:] {
|
||||
for i, stmt := range stmts[1:] {
|
||||
switch stmt := stmt.(type) {
|
||||
case *Import:
|
||||
mod.Imports = append(mod.Imports, stmt)
|
||||
@@ -633,98 +613,42 @@ func parseModule(filename string, stmts []Statement, comments []*Comment) (*Modu
|
||||
errs = append(errs, NewError(ParseErr, stmt[0].Location, err.Error()))
|
||||
} else {
|
||||
mod.Rules = append(mod.Rules, rule)
|
||||
|
||||
// NOTE(tsandall): the statement should now be interpreted as a
|
||||
// rule so update the statement list. This is important for the
|
||||
// logic below that associates annotations with statements.
|
||||
stmts[i+1] = rule
|
||||
}
|
||||
case *Package:
|
||||
errs = append(errs, NewError(ParseErr, stmt.Loc(), "unexpected package"))
|
||||
case *Comment: // Ignore comments, they're handled above.
|
||||
case *Annotations:
|
||||
mod.Annotations = append(mod.Annotations, stmt)
|
||||
case *Comment:
|
||||
// Ignore comments, they're handled above.
|
||||
default:
|
||||
panic("illegal value") // Indicates grammar is out-of-sync with code.
|
||||
}
|
||||
}
|
||||
|
||||
if len(errs) == 0 {
|
||||
return mod, nil
|
||||
if len(errs) > 0 {
|
||||
return nil, errs
|
||||
}
|
||||
|
||||
return nil, errs
|
||||
}
|
||||
errs = append(errs, attachAnnotationsNodes(mod)...)
|
||||
|
||||
func postProcess(filename string, stmts []Statement) error {
|
||||
|
||||
if err := mangleDataVars(stmts); err != nil {
|
||||
return err
|
||||
if len(errs) > 0 {
|
||||
return nil, errs
|
||||
}
|
||||
|
||||
if err := mangleInputVars(stmts); err != nil {
|
||||
return err
|
||||
return mod, nil
|
||||
}
|
||||
|
||||
func newScopeAttachmentErr(a *Annotations, want string) *Error {
|
||||
var have string
|
||||
if a.node != nil {
|
||||
have = fmt.Sprintf(" (have %v)", TypeName(a.node))
|
||||
}
|
||||
|
||||
mangleWildcards(stmts)
|
||||
mangleExprIndices(stmts)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func mangleDataVars(stmts []Statement) error {
|
||||
for i := range stmts {
|
||||
vt := newVarToRefTransformer(DefaultRootDocument.Value.(Var), DefaultRootRef.Copy())
|
||||
stmt, err := Transform(vt, stmts[i])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
stmts[i] = stmt.(Statement)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func mangleInputVars(stmts []Statement) error {
|
||||
for i := range stmts {
|
||||
vt := newVarToRefTransformer(InputRootDocument.Value.(Var), InputRootRef.Copy())
|
||||
stmt, err := Transform(vt, stmts[i])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
stmts[i] = stmt.(Statement)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func mangleExprIndices(stmts []Statement) {
|
||||
for _, stmt := range stmts {
|
||||
setExprIndices(stmt)
|
||||
}
|
||||
}
|
||||
|
||||
func setExprIndices(x interface{}) {
|
||||
WalkBodies(x, func(b Body) bool {
|
||||
for i, expr := range b {
|
||||
expr.Index = i
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
func mangleWildcards(stmts []Statement) {
|
||||
m := &wildcardMangler{}
|
||||
for i := range stmts {
|
||||
stmt, _ := Transform(m, stmts[i])
|
||||
stmts[i] = stmt.(Statement)
|
||||
}
|
||||
}
|
||||
|
||||
type wildcardMangler struct {
|
||||
c int
|
||||
}
|
||||
|
||||
func (m *wildcardMangler) Transform(x interface{}) (interface{}, error) {
|
||||
if term, ok := x.(Var); ok {
|
||||
if term.Equal(Wildcard.Value) {
|
||||
name := fmt.Sprintf("%s%d", WildcardPrefix, m.c)
|
||||
m.c++
|
||||
return Var(name), nil
|
||||
}
|
||||
}
|
||||
return x, nil
|
||||
return NewError(ParseErr, a.Loc(), "annotation scope '%v' must be applied to %v%v", a.Scope, want, have)
|
||||
}
|
||||
|
||||
func setRuleModule(rule *Rule, module *Module) {
|
||||
@@ -734,54 +658,13 @@ func setRuleModule(rule *Rule, module *Module) {
|
||||
}
|
||||
}
|
||||
|
||||
type varToRefTransformer struct {
|
||||
orig Var
|
||||
target Ref
|
||||
// skip set to true to avoid recursively processing the result of
|
||||
// transformation.
|
||||
skip bool
|
||||
}
|
||||
|
||||
func newVarToRefTransformer(orig Var, target Ref) *varToRefTransformer {
|
||||
return &varToRefTransformer{
|
||||
orig: orig,
|
||||
target: target,
|
||||
skip: false,
|
||||
}
|
||||
}
|
||||
|
||||
func (vt *varToRefTransformer) Transform(x interface{}) (interface{}, error) {
|
||||
if vt.skip {
|
||||
vt.skip = false
|
||||
return x, nil
|
||||
}
|
||||
switch x := x.(type) {
|
||||
case *Head:
|
||||
// The next AST node will be the rule name (which should not be
|
||||
// transformed).
|
||||
vt.skip = true
|
||||
case Ref:
|
||||
// The next AST node will be the ref head (which should not be
|
||||
// transformed).
|
||||
vt.skip = true
|
||||
case Var:
|
||||
if x.Equal(vt.orig) {
|
||||
vt.skip = true
|
||||
return vt.target, nil
|
||||
}
|
||||
}
|
||||
return x, nil
|
||||
}
|
||||
|
||||
// ParserErrorDetail holds additional details for parser errors.
|
||||
type ParserErrorDetail struct {
|
||||
Line string `json:"line"`
|
||||
Idx int `json:"idx"`
|
||||
}
|
||||
|
||||
func newParserErrorDetail(bs []byte, pos position) *ParserErrorDetail {
|
||||
|
||||
offset := pos.offset
|
||||
func newParserErrorDetail(bs []byte, offset int) *ParserErrorDetail {
|
||||
|
||||
// Find first non-space character at or before offset position.
|
||||
if offset >= len(bs) {
|
||||
@@ -830,7 +713,11 @@ func newParserErrorDetail(bs []byte, pos position) *ParserErrorDetail {
|
||||
func (d ParserErrorDetail) Lines() []string {
|
||||
line := strings.TrimLeft(d.Line, "\t") // remove leading tabs
|
||||
tabCount := len(d.Line) - len(line)
|
||||
return []string{line, strings.Repeat(" ", d.Idx-tabCount) + "^"}
|
||||
indent := d.Idx - tabCount
|
||||
if indent < 0 {
|
||||
indent = 0
|
||||
}
|
||||
return []string{line, strings.Repeat(" ", indent) + "^"}
|
||||
}
|
||||
|
||||
func isNewLineChar(b byte) bool {
|
||||
|
||||
620
vendor/github.com/open-policy-agent/opa/ast/parser_internal.go
generated
vendored
620
vendor/github.com/open-policy-agent/opa/ast/parser_internal.go
generated
vendored
@@ -1,620 +0,0 @@
|
||||
// Copyright 2018 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.op
|
||||
|
||||
package ast
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
const (
|
||||
// commentsKey is the global map key for the comments slice.
|
||||
commentsKey = "comments"
|
||||
|
||||
// filenameKey is the global map key for the filename.
|
||||
filenameKey = "filename"
|
||||
)
|
||||
|
||||
type program struct {
|
||||
buf []interface{}
|
||||
comments interface{}
|
||||
}
|
||||
|
||||
type ruleExt struct {
|
||||
loc *Location
|
||||
term *Term
|
||||
body Body
|
||||
}
|
||||
|
||||
// currentLocation converts the parser context to a Location object.
|
||||
func currentLocation(c *current) *Location {
|
||||
return NewLocation(c.text, c.globalStore[filenameKey].(string), c.pos.line, c.pos.col)
|
||||
}
|
||||
|
||||
func makeProgram(c *current, vals interface{}) (interface{}, error) {
|
||||
var buf []interface{}
|
||||
if vals == nil {
|
||||
return buf, nil
|
||||
}
|
||||
ifaceSlice := vals.([]interface{})
|
||||
head := ifaceSlice[0]
|
||||
buf = append(buf, head)
|
||||
for _, tail := range ifaceSlice[1].([]interface{}) {
|
||||
stmt := tail.([]interface{})[1]
|
||||
buf = append(buf, stmt)
|
||||
}
|
||||
return program{buf, c.globalStore[commentsKey]}, nil
|
||||
}
|
||||
|
||||
func makePackage(loc *Location, value interface{}) (interface{}, error) {
|
||||
// All packages are implicitly declared under the default root document.
|
||||
term := value.(*Term)
|
||||
path := Ref{DefaultRootDocument.Copy().SetLocation(term.Location)}
|
||||
switch v := term.Value.(type) {
|
||||
case Ref:
|
||||
// Convert head of package Ref to String because it will be prefixed
|
||||
// with the root document variable.
|
||||
head := StringTerm(string(v[0].Value.(Var))).SetLocation(v[0].Location)
|
||||
tail := v[1:]
|
||||
if !tail.IsGround() {
|
||||
return nil, fmt.Errorf("package name cannot contain variables: %v", v)
|
||||
}
|
||||
|
||||
// We do not allow non-string values in package names.
|
||||
// Because documents are typically represented as JSON, non-string keys are
|
||||
// not allowed for now.
|
||||
// TODO(tsandall): consider special syntax for namespacing under arrays.
|
||||
for _, p := range tail {
|
||||
_, ok := p.Value.(String)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("package name cannot contain non-string values: %v", v)
|
||||
}
|
||||
}
|
||||
path = append(path, head)
|
||||
path = append(path, tail...)
|
||||
case Var:
|
||||
s := StringTerm(string(v)).SetLocation(term.Location)
|
||||
path = append(path, s)
|
||||
}
|
||||
pkg := &Package{Location: loc, Path: path}
|
||||
return pkg, nil
|
||||
}
|
||||
|
||||
func makeImport(loc *Location, path, alias interface{}) (interface{}, error) {
|
||||
imp := &Import{}
|
||||
imp.Location = loc
|
||||
imp.Path = path.(*Term)
|
||||
if err := IsValidImportPath(imp.Path.Value); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if alias == nil {
|
||||
return imp, nil
|
||||
}
|
||||
aliasSlice := alias.([]interface{})
|
||||
// Import definition above describes the "alias" slice. We only care about the "Var" element.
|
||||
imp.Alias = aliasSlice[3].(*Term).Value.(Var)
|
||||
return imp, nil
|
||||
}
|
||||
|
||||
func makeDefaultRule(loc *Location, name, operator, value interface{}) (interface{}, error) {
|
||||
|
||||
if string(operator.([]uint8)) == Assign.Infix {
|
||||
return nil, fmt.Errorf("default rules must use = operator (not := operator)")
|
||||
}
|
||||
|
||||
term := value.(*Term)
|
||||
var err error
|
||||
|
||||
vis := NewGenericVisitor(func(x interface{}) bool {
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
switch x.(type) {
|
||||
case *ArrayComprehension, *ObjectComprehension, *SetComprehension: // skip closures
|
||||
return true
|
||||
case Ref, Var:
|
||||
err = fmt.Errorf("default rule value cannot contain %v", TypeName(x))
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
vis.Walk(term)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
body := NewBody(NewExpr(BooleanTerm(true).SetLocation(loc)))
|
||||
|
||||
rule := &Rule{
|
||||
Location: loc,
|
||||
Default: true,
|
||||
Head: &Head{
|
||||
Location: loc,
|
||||
Name: name.(*Term).Value.(Var),
|
||||
Value: value.(*Term),
|
||||
},
|
||||
Body: body,
|
||||
}
|
||||
rule.Body[0].Location = loc
|
||||
|
||||
return []*Rule{rule}, nil
|
||||
}
|
||||
|
||||
func makeRule(loc *Location, head, rest interface{}) (interface{}, error) {
|
||||
|
||||
if head == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
sl := rest.([]interface{})
|
||||
|
||||
rules := []*Rule{
|
||||
{
|
||||
Location: loc,
|
||||
Head: head.(*Head),
|
||||
Body: sl[0].(Body),
|
||||
},
|
||||
}
|
||||
|
||||
var ordered bool
|
||||
prev := rules[0]
|
||||
|
||||
for i, elem := range sl[1].([]interface{}) {
|
||||
|
||||
next := elem.([]interface{})
|
||||
re := next[1].(ruleExt)
|
||||
|
||||
if rules[0].Head.Assign {
|
||||
return nil, errElseAssignOperator
|
||||
}
|
||||
|
||||
if re.term == nil {
|
||||
if ordered {
|
||||
return nil, fmt.Errorf("expected 'else' keyword")
|
||||
}
|
||||
rules = append(rules, &Rule{
|
||||
Location: re.loc,
|
||||
Head: prev.Head.Copy(),
|
||||
Body: re.body,
|
||||
})
|
||||
} else {
|
||||
if (rules[0].Head.DocKind() != CompleteDoc) || (i != 0 && !ordered) {
|
||||
return nil, fmt.Errorf("unexpected 'else' keyword")
|
||||
}
|
||||
ordered = true
|
||||
curr := &Rule{
|
||||
Location: re.loc,
|
||||
Head: &Head{
|
||||
Name: prev.Head.Name,
|
||||
Args: prev.Head.Args.Copy(),
|
||||
Value: re.term,
|
||||
Location: re.term.Location,
|
||||
},
|
||||
Body: re.body,
|
||||
}
|
||||
prev.Else = curr
|
||||
prev = curr
|
||||
}
|
||||
}
|
||||
|
||||
return rules, nil
|
||||
}
|
||||
|
||||
func makeRuleHead(loc *Location, name, args, key, value interface{}) (interface{}, error) {
|
||||
|
||||
head := &Head{}
|
||||
|
||||
head.Location = loc
|
||||
head.Name = name.(*Term).Value.(Var)
|
||||
|
||||
if args != nil && key != nil {
|
||||
return nil, fmt.Errorf("partial rules cannot take arguments")
|
||||
}
|
||||
|
||||
if args != nil {
|
||||
argSlice := args.([]interface{})
|
||||
head.Args = argSlice[3].(Args)
|
||||
}
|
||||
|
||||
if key != nil {
|
||||
keySlice := key.([]interface{})
|
||||
// Head definition above describes the "key" slice. We care about the "Term" element.
|
||||
head.Key = keySlice[3].(*Term)
|
||||
}
|
||||
|
||||
if value != nil {
|
||||
valueSlice := value.([]interface{})
|
||||
operator := string(valueSlice[1].([]uint8))
|
||||
|
||||
if operator == Assign.Infix {
|
||||
if head.Key != nil {
|
||||
return nil, errPartialRuleAssignOperator
|
||||
} else if len(head.Args) > 0 {
|
||||
return nil, errFunctionAssignOperator
|
||||
}
|
||||
head.Assign = true
|
||||
}
|
||||
|
||||
// Head definition above describes the "value" slice. We care about the "Term" element.
|
||||
head.Value = valueSlice[len(valueSlice)-1].(*Term)
|
||||
}
|
||||
|
||||
if key == nil && value == nil {
|
||||
head.Value = BooleanTerm(true).SetLocation(head.Location)
|
||||
}
|
||||
|
||||
if key != nil && value != nil {
|
||||
switch head.Key.Value.(type) {
|
||||
case Var, String, Ref: // nop
|
||||
default:
|
||||
return nil, fmt.Errorf("object key must be string, var, or ref, not %v", TypeName(head.Key.Value))
|
||||
}
|
||||
}
|
||||
|
||||
return head, nil
|
||||
}
|
||||
|
||||
func makeArgs(list interface{}) (interface{}, error) {
|
||||
termSlice := list.([]*Term)
|
||||
args := make(Args, len(termSlice))
|
||||
for i := 0; i < len(args); i++ {
|
||||
args[i] = termSlice[i]
|
||||
}
|
||||
return args, nil
|
||||
}
|
||||
|
||||
func makeRuleExt(loc *Location, val, b interface{}) (interface{}, error) {
|
||||
bs := b.([]interface{})
|
||||
body := bs[1].(Body)
|
||||
|
||||
if val == nil {
|
||||
term := BooleanTerm(true)
|
||||
term.Location = loc
|
||||
return ruleExt{term.Location, term, body}, nil
|
||||
}
|
||||
|
||||
vs := val.([]interface{})
|
||||
t := vs[3].(*Term)
|
||||
return ruleExt{loc, t, body}, nil
|
||||
}
|
||||
|
||||
func makeLiteral(negated, value, with interface{}) (interface{}, error) {
|
||||
|
||||
expr := value.(*Expr)
|
||||
|
||||
expr.Negated = negated.(bool)
|
||||
|
||||
if with != nil {
|
||||
expr.With = with.([]*With)
|
||||
}
|
||||
|
||||
return expr, nil
|
||||
}
|
||||
|
||||
func makeLiteralExpr(loc *Location, lhs, rest interface{}) (interface{}, error) {
|
||||
|
||||
if rest == nil {
|
||||
if call, ok := lhs.(*Term).Value.(Call); ok {
|
||||
return NewExpr([]*Term(call)).SetLocation(loc), nil
|
||||
}
|
||||
return NewExpr(lhs).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
termSlice := rest.([]interface{})
|
||||
terms := []*Term{
|
||||
termSlice[1].(*Term),
|
||||
lhs.(*Term),
|
||||
termSlice[3].(*Term),
|
||||
}
|
||||
|
||||
expr := NewExpr(terms).SetLocation(loc)
|
||||
|
||||
return expr, nil
|
||||
}
|
||||
|
||||
func makeSomeDeclLiteral(loc *Location, sl interface{}) (interface{}, error) {
|
||||
symbols := sl.([]*Term)
|
||||
return NewExpr(&SomeDecl{Location: loc, Symbols: symbols}).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeSomeDeclSymbols(head interface{}, rest interface{}) (interface{}, error) {
|
||||
|
||||
var symbols []*Term
|
||||
|
||||
symbols = append(symbols, head.(*Term))
|
||||
|
||||
if sl1, ok := rest.([]interface{}); ok {
|
||||
for i := range sl1 {
|
||||
if sl2, ok := sl1[i].([]interface{}); ok {
|
||||
symbols = append(symbols, sl2[3].(*Term))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return symbols, nil
|
||||
}
|
||||
|
||||
func makeWithKeywordList(head, tail interface{}) (interface{}, error) {
|
||||
var withs []*With
|
||||
|
||||
if head == nil {
|
||||
return withs, nil
|
||||
}
|
||||
|
||||
sl := tail.([]interface{})
|
||||
|
||||
withs = make([]*With, 0, len(sl)+1)
|
||||
withs = append(withs, head.(*With))
|
||||
|
||||
for i := range sl {
|
||||
withSlice := sl[i].([]interface{})
|
||||
withs = append(withs, withSlice[1].(*With))
|
||||
}
|
||||
|
||||
return withs, nil
|
||||
}
|
||||
|
||||
func makeWithKeyword(loc *Location, target, value interface{}) (interface{}, error) {
|
||||
w := &With{
|
||||
Target: target.(*Term),
|
||||
Value: value.(*Term),
|
||||
}
|
||||
return w.SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeExprTerm(loc *Location, lhs, rest interface{}) (interface{}, error) {
|
||||
|
||||
if rest == nil {
|
||||
return lhs, nil
|
||||
}
|
||||
|
||||
sl := rest.([]interface{})
|
||||
|
||||
if len(sl) == 0 {
|
||||
return lhs, nil
|
||||
}
|
||||
|
||||
for i := range sl {
|
||||
termSlice := sl[i].([]interface{})
|
||||
call := Call{
|
||||
termSlice[1].(*Term),
|
||||
lhs.(*Term),
|
||||
termSlice[3].(*Term),
|
||||
}
|
||||
lhs = NewTerm(call).SetLocation(loc)
|
||||
}
|
||||
|
||||
return lhs, nil
|
||||
}
|
||||
|
||||
func makeCall(loc *Location, operator, args interface{}) (interface{}, error) {
|
||||
|
||||
termSlice := args.([]*Term)
|
||||
termOperator := operator.(*Term)
|
||||
|
||||
call := make(Call, len(termSlice)+1)
|
||||
|
||||
if _, ok := termOperator.Value.(Var); ok {
|
||||
termOperator = RefTerm(termOperator).SetLocation(loc)
|
||||
}
|
||||
|
||||
call[0] = termOperator
|
||||
|
||||
for i := 1; i < len(call); i++ {
|
||||
call[i] = termSlice[i-1]
|
||||
}
|
||||
|
||||
return NewTerm(call).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeBraceEnclosedBody(loc *Location, body interface{}) (interface{}, error) {
|
||||
if body != nil {
|
||||
return body, nil
|
||||
}
|
||||
return NewBody(NewExpr(ObjectTerm().SetLocation(loc)).SetLocation(loc)), nil
|
||||
}
|
||||
|
||||
func makeBody(head, tail interface{}, pos int) (interface{}, error) {
|
||||
|
||||
sl := tail.([]interface{})
|
||||
body := make(Body, len(sl)+1)
|
||||
body[0] = head.(*Expr)
|
||||
|
||||
for i := 1; i < len(body); i++ {
|
||||
body[i] = sl[i-1].([]interface{})[pos].(*Expr)
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
||||
|
||||
func makeExprTermList(head, tail interface{}) (interface{}, error) {
|
||||
|
||||
var terms []*Term
|
||||
|
||||
if head == nil {
|
||||
return terms, nil
|
||||
}
|
||||
|
||||
sl := tail.([]interface{})
|
||||
|
||||
terms = make([]*Term, 0, len(sl)+1)
|
||||
terms = append(terms, head.(*Term))
|
||||
|
||||
for i := range sl {
|
||||
termSlice := sl[i].([]interface{})
|
||||
terms = append(terms, termSlice[3].(*Term))
|
||||
}
|
||||
|
||||
return terms, nil
|
||||
}
|
||||
|
||||
func makeExprTermPairList(head, tail interface{}) (interface{}, error) {
|
||||
|
||||
var terms [][2]*Term
|
||||
|
||||
if head == nil {
|
||||
return terms, nil
|
||||
}
|
||||
|
||||
sl := tail.([]interface{})
|
||||
|
||||
terms = make([][2]*Term, 0, len(sl)+1)
|
||||
terms = append(terms, head.([2]*Term))
|
||||
|
||||
for i := range sl {
|
||||
termSlice := sl[i].([]interface{})
|
||||
terms = append(terms, termSlice[3].([2]*Term))
|
||||
}
|
||||
|
||||
return terms, nil
|
||||
}
|
||||
|
||||
func makeExprTermPair(key, value interface{}) (interface{}, error) {
|
||||
return [2]*Term{key.(*Term), value.(*Term)}, nil
|
||||
}
|
||||
|
||||
func makeInfixOperator(loc *Location, text []byte) (interface{}, error) {
|
||||
op := string(text)
|
||||
for _, b := range Builtins {
|
||||
if string(b.Infix) == op {
|
||||
op = string(b.Name)
|
||||
}
|
||||
}
|
||||
operator := RefTerm(VarTerm(op).SetLocation(loc)).SetLocation(loc)
|
||||
return operator, nil
|
||||
}
|
||||
|
||||
func makeArray(loc *Location, list interface{}) (interface{}, error) {
|
||||
termSlice := list.([]*Term)
|
||||
return ArrayTerm(termSlice...).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeObject(loc *Location, list interface{}) (interface{}, error) {
|
||||
termPairSlice := list.([][2]*Term)
|
||||
return ObjectTerm(termPairSlice...).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeSet(loc *Location, list interface{}) (interface{}, error) {
|
||||
termSlice := list.([]*Term)
|
||||
return SetTerm(termSlice...).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeArrayComprehension(loc *Location, head, body interface{}) (interface{}, error) {
|
||||
return ArrayComprehensionTerm(head.(*Term), body.(Body)).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeSetComprehension(loc *Location, head, body interface{}) (interface{}, error) {
|
||||
return SetComprehensionTerm(head.(*Term), body.(Body)).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeObjectComprehension(loc *Location, head, body interface{}) (interface{}, error) {
|
||||
pair := head.([2]*Term)
|
||||
return ObjectComprehensionTerm(pair[0], pair[1], body.(Body)).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeRef(loc *Location, head, rest interface{}) (interface{}, error) {
|
||||
|
||||
headTerm := head.(*Term)
|
||||
ifaceSlice := rest.([]interface{})
|
||||
|
||||
if len(ifaceSlice) == 0 {
|
||||
return headTerm, nil
|
||||
}
|
||||
|
||||
ref := make(Ref, len(ifaceSlice)+1)
|
||||
ref[0] = headTerm
|
||||
|
||||
for i := 1; i < len(ref); i++ {
|
||||
ref[i] = ifaceSlice[i-1].(*Term)
|
||||
}
|
||||
|
||||
return NewTerm(ref).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeRefOperandDot(loc *Location, val interface{}) (interface{}, error) {
|
||||
return StringTerm(string(val.(*Term).Value.(Var))).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeVar(loc *Location, text interface{}) (interface{}, error) {
|
||||
str := string(text.([]byte))
|
||||
return VarTerm(str).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeNumber(loc *Location, text interface{}) (interface{}, error) {
|
||||
f, ok := new(big.Float).SetString(string(text.([]byte)))
|
||||
if !ok {
|
||||
// This indicates the grammar is out-of-sync with what the string
|
||||
// representation of floating point numbers. This should not be
|
||||
// possible.
|
||||
panic("illegal value")
|
||||
}
|
||||
|
||||
// Put limit on size of exponent to prevent non-linear cost of String()
|
||||
// function on big.Float from causing denial of service: https://github.com/golang/go/issues/11068
|
||||
//
|
||||
// n == sign * mantissa * 2^exp
|
||||
// 0.5 <= mantissa < 1.0
|
||||
//
|
||||
// The limit is arbitrary.
|
||||
exp := f.MantExp(nil)
|
||||
if exp > 1e5 || exp < -1e5 {
|
||||
return nil, fmt.Errorf("number too big")
|
||||
}
|
||||
|
||||
return NumberTerm(json.Number(f.String())).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeString(loc *Location, text interface{}) (interface{}, error) {
|
||||
var v string
|
||||
err := json.Unmarshal(text.([]byte), &v)
|
||||
return StringTerm(v).SetLocation(loc), err
|
||||
}
|
||||
|
||||
func makeRawString(loc *Location, text interface{}) (interface{}, error) {
|
||||
s := string(text.([]byte))
|
||||
s = s[1 : len(s)-1] // Trim surrounding quotes.
|
||||
return StringTerm(s).SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeNonterminatedString(loc *Location, s string) (interface{}, error) {
|
||||
return StringTerm(s).SetLocation(loc), fmt.Errorf("found non-terminated string literal")
|
||||
}
|
||||
|
||||
func makeBool(loc *Location, text interface{}) (interface{}, error) {
|
||||
var term *Term
|
||||
if string(text.([]byte)) == "true" {
|
||||
term = BooleanTerm(true)
|
||||
} else {
|
||||
term = BooleanTerm(false)
|
||||
}
|
||||
return term.SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeNull(loc *Location) (interface{}, error) {
|
||||
return NullTerm().SetLocation(loc), nil
|
||||
}
|
||||
|
||||
func makeComments(c *current, text interface{}) (interface{}, error) {
|
||||
|
||||
var buf bytes.Buffer
|
||||
for _, x := range text.([]interface{}) {
|
||||
buf.Write(x.([]byte))
|
||||
}
|
||||
|
||||
comment := NewComment(buf.Bytes())
|
||||
comment.Location = currentLocation(c)
|
||||
comments := c.globalStore[commentsKey].(map[commentKey]*Comment)
|
||||
key := commentKey{
|
||||
File: comment.Location.File,
|
||||
Row: comment.Location.Row,
|
||||
Col: comment.Location.Col,
|
||||
}
|
||||
comments[key] = comment
|
||||
return comment, nil
|
||||
}
|
||||
307
vendor/github.com/open-policy-agent/opa/ast/policy.go
generated
vendored
307
vendor/github.com/open-policy-agent/opa/ast/policy.go
generated
vendored
@@ -20,7 +20,6 @@ import (
|
||||
// subsequent lookups. If the hash seeds are out of sync, lookups will fail.
|
||||
var hashSeed = rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
var hashSeed0 = (uint64(hashSeed.Uint32()) << 32) | uint64(hashSeed.Uint32())
|
||||
var hashSeed1 = (uint64(hashSeed.Uint32()) << 32) | uint64(hashSeed.Uint32())
|
||||
|
||||
// DefaultRootDocument is the default root document.
|
||||
//
|
||||
@@ -31,8 +30,23 @@ var DefaultRootDocument = VarTerm("data")
|
||||
// InputRootDocument names the document containing query arguments.
|
||||
var InputRootDocument = VarTerm("input")
|
||||
|
||||
// SchemaRootDocument names the document containing external data schemas.
|
||||
var SchemaRootDocument = VarTerm("schema")
|
||||
|
||||
// FunctionArgRootDocument names the document containing function arguments.
|
||||
// It's only for internal usage, for referencing function arguments between
|
||||
// the index and topdown.
|
||||
var FunctionArgRootDocument = VarTerm("args")
|
||||
|
||||
// FutureRootDocument names the document containing new, to-become-default,
|
||||
// features.
|
||||
var FutureRootDocument = VarTerm("future")
|
||||
|
||||
// RootDocumentNames contains the names of top-level documents that can be
|
||||
// referred to in modules and queries.
|
||||
//
|
||||
// Note, the schema document is not currently implemented in the evaluator so it
|
||||
// is not registered as a root document name (yet).
|
||||
var RootDocumentNames = NewSet(
|
||||
DefaultRootDocument,
|
||||
InputRootDocument,
|
||||
@@ -48,6 +62,13 @@ var DefaultRootRef = Ref{DefaultRootDocument}
|
||||
// All refs to query arguments are prefixed with this ref.
|
||||
var InputRootRef = Ref{InputRootDocument}
|
||||
|
||||
// SchemaRootRef is a reference to the root of the schema document.
|
||||
//
|
||||
// All refs to schema documents are prefixed with this ref. Note, the schema
|
||||
// document is not currently implemented in the evaluator so it is not
|
||||
// registered as a root document ref (yet).
|
||||
var SchemaRootRef = Ref{SchemaRootDocument}
|
||||
|
||||
// RootDocumentRefs contains the prefixes of top-level documents that all
|
||||
// non-local references start with.
|
||||
var RootDocumentRefs = NewSet(
|
||||
@@ -118,10 +139,12 @@ type (
|
||||
// within a namespace (defined by the package) and optional
|
||||
// dependencies on external documents (defined by imports).
|
||||
Module struct {
|
||||
Package *Package `json:"package"`
|
||||
Imports []*Import `json:"imports,omitempty"`
|
||||
Rules []*Rule `json:"rules,omitempty"`
|
||||
Comments []*Comment `json:"comments,omitempty"`
|
||||
Package *Package `json:"package"`
|
||||
Imports []*Import `json:"imports,omitempty"`
|
||||
Annotations []*Annotations `json:"annotations,omitempty"`
|
||||
Rules []*Rule `json:"rules,omitempty"`
|
||||
Comments []*Comment `json:"comments,omitempty"`
|
||||
stmts []Statement
|
||||
}
|
||||
|
||||
// Comment contains the raw text from the comment in the definition.
|
||||
@@ -180,12 +203,12 @@ type (
|
||||
|
||||
// Expr represents a single expression contained inside the body of a rule.
|
||||
Expr struct {
|
||||
Location *Location `json:"-"`
|
||||
Generated bool `json:"generated,omitempty"`
|
||||
Index int `json:"index"`
|
||||
Negated bool `json:"negated,omitempty"`
|
||||
Terms interface{} `json:"terms"`
|
||||
With []*With `json:"with,omitempty"`
|
||||
Terms interface{} `json:"terms"`
|
||||
Location *Location `json:"-"`
|
||||
Index int `json:"index"`
|
||||
Generated bool `json:"generated,omitempty"`
|
||||
Negated bool `json:"negated,omitempty"`
|
||||
}
|
||||
|
||||
// SomeDecl represents a variable declaration statement. The symbols are variables.
|
||||
@@ -194,6 +217,14 @@ type (
|
||||
Symbols []*Term `json:"symbols"`
|
||||
}
|
||||
|
||||
Every struct {
|
||||
Location *Location `json:"-"`
|
||||
Key *Term `json:"key"`
|
||||
Value *Term `json:"value"`
|
||||
Domain *Term `json:"domain"`
|
||||
Body Body `json:"body"`
|
||||
}
|
||||
|
||||
// With represents a modifier on an expression.
|
||||
With struct {
|
||||
Location *Location `json:"-"`
|
||||
@@ -219,6 +250,9 @@ func (mod *Module) Compare(other *Module) int {
|
||||
if cmp := importsCompare(mod.Imports, other.Imports); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
if cmp := annotationsCompare(mod.Annotations, other.Annotations); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
return rulesCompare(mod.Rules, other.Rules)
|
||||
}
|
||||
|
||||
@@ -226,14 +260,39 @@ func (mod *Module) Compare(other *Module) int {
|
||||
func (mod *Module) Copy() *Module {
|
||||
cpy := *mod
|
||||
cpy.Rules = make([]*Rule, len(mod.Rules))
|
||||
|
||||
nodes := make(map[Node]Node, len(mod.Rules)+len(mod.Imports)+1 /* package */)
|
||||
|
||||
for i := range mod.Rules {
|
||||
cpy.Rules[i] = mod.Rules[i].Copy()
|
||||
cpy.Rules[i].Module = &cpy
|
||||
nodes[mod.Rules[i]] = cpy.Rules[i]
|
||||
}
|
||||
|
||||
cpy.Imports = make([]*Import, len(mod.Imports))
|
||||
for i := range mod.Imports {
|
||||
cpy.Imports[i] = mod.Imports[i].Copy()
|
||||
nodes[mod.Imports[i]] = cpy.Imports[i]
|
||||
}
|
||||
|
||||
cpy.Package = mod.Package.Copy()
|
||||
nodes[mod.Package] = cpy.Package
|
||||
|
||||
cpy.Annotations = make([]*Annotations, len(mod.Annotations))
|
||||
for i := range mod.Annotations {
|
||||
cpy.Annotations[i] = mod.Annotations[i].Copy(nodes[mod.Annotations[i].node])
|
||||
}
|
||||
|
||||
cpy.Comments = make([]*Comment, len(mod.Comments))
|
||||
for i := range mod.Comments {
|
||||
cpy.Comments[i] = mod.Comments[i].Copy()
|
||||
}
|
||||
|
||||
cpy.stmts = make([]Statement, len(mod.stmts))
|
||||
for i := range mod.stmts {
|
||||
cpy.stmts[i] = nodes[mod.stmts[i]]
|
||||
}
|
||||
|
||||
return &cpy
|
||||
}
|
||||
|
||||
@@ -243,17 +302,36 @@ func (mod *Module) Equal(other *Module) bool {
|
||||
}
|
||||
|
||||
func (mod *Module) String() string {
|
||||
byNode := map[Node][]*Annotations{}
|
||||
for _, a := range mod.Annotations {
|
||||
byNode[a.node] = append(byNode[a.node], a)
|
||||
}
|
||||
|
||||
appendAnnotationStrings := func(buf []string, node Node) []string {
|
||||
if as, ok := byNode[node]; ok {
|
||||
for i := range as {
|
||||
buf = append(buf, "# METADATA")
|
||||
buf = append(buf, "# "+as[i].String())
|
||||
}
|
||||
}
|
||||
return buf
|
||||
}
|
||||
|
||||
buf := []string{}
|
||||
buf = appendAnnotationStrings(buf, mod.Package)
|
||||
buf = append(buf, mod.Package.String())
|
||||
|
||||
if len(mod.Imports) > 0 {
|
||||
buf = append(buf, "")
|
||||
for _, imp := range mod.Imports {
|
||||
buf = appendAnnotationStrings(buf, imp)
|
||||
buf = append(buf, imp.String())
|
||||
}
|
||||
}
|
||||
if len(mod.Rules) > 0 {
|
||||
buf = append(buf, "")
|
||||
for _, rule := range mod.Rules {
|
||||
buf = appendAnnotationStrings(buf, rule)
|
||||
buf = append(buf, rule.String())
|
||||
}
|
||||
}
|
||||
@@ -315,6 +393,14 @@ func (c *Comment) String() string {
|
||||
return "#" + string(c.Text)
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of c.
|
||||
func (c *Comment) Copy() *Comment {
|
||||
cpy := *c
|
||||
cpy.Text = make([]byte, len(c.Text))
|
||||
copy(cpy.Text, c.Text)
|
||||
return &cpy
|
||||
}
|
||||
|
||||
// Equal returns true if this comment equals the other comment.
|
||||
// Unlike other equality checks on AST nodes, comment equality
|
||||
// depends on location.
|
||||
@@ -583,10 +669,10 @@ const (
|
||||
CompleteDoc = iota
|
||||
|
||||
// PartialSetDoc represents a set document that is partially defined by the rule.
|
||||
PartialSetDoc = iota
|
||||
PartialSetDoc
|
||||
|
||||
// PartialObjectDoc represents an object document that is partially defined by the rule.
|
||||
PartialObjectDoc = iota
|
||||
PartialObjectDoc
|
||||
)
|
||||
|
||||
// DocKind returns the type of document produced by this rule.
|
||||
@@ -701,7 +787,7 @@ func (a Args) Copy() Args {
|
||||
}
|
||||
|
||||
func (a Args) String() string {
|
||||
var buf []string
|
||||
buf := make([]string, 0, len(a))
|
||||
for _, t := range a {
|
||||
buf = append(buf, t.String())
|
||||
}
|
||||
@@ -845,7 +931,7 @@ func (body Body) SetLoc(loc *Location) {
|
||||
}
|
||||
|
||||
func (body Body) String() string {
|
||||
var buf []string
|
||||
buf := make([]string, 0, len(body))
|
||||
for _, v := range body {
|
||||
buf = append(buf, v.String())
|
||||
}
|
||||
@@ -862,6 +948,11 @@ func (body Body) Vars(params VarVisitorParams) VarSet {
|
||||
|
||||
// NewExpr returns a new Expr object.
|
||||
func NewExpr(terms interface{}) *Expr {
|
||||
switch terms.(type) {
|
||||
case *SomeDecl, *Every, *Term, []*Term: // ok
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
return &Expr{
|
||||
Negated: false,
|
||||
Terms: terms,
|
||||
@@ -940,6 +1031,10 @@ func (expr *Expr) Compare(other *Expr) int {
|
||||
if cmp := Compare(t, other.Terms.(*SomeDecl)); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
case *Every:
|
||||
if cmp := Compare(t, other.Terms.(*Every)); cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
}
|
||||
|
||||
return withSliceCompare(expr.With, other.With)
|
||||
@@ -953,14 +1048,28 @@ func (expr *Expr) sortOrder() int {
|
||||
return 1
|
||||
case []*Term:
|
||||
return 2
|
||||
case *Every:
|
||||
return 3
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// CopyWithoutTerms returns a deep copy of expr without its Terms
|
||||
func (expr *Expr) CopyWithoutTerms() *Expr {
|
||||
cpy := *expr
|
||||
|
||||
cpy.With = make([]*With, len(expr.With))
|
||||
for i := range expr.With {
|
||||
cpy.With[i] = expr.With[i].Copy()
|
||||
}
|
||||
|
||||
return &cpy
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of expr.
|
||||
func (expr *Expr) Copy() *Expr {
|
||||
|
||||
cpy := *expr
|
||||
cpy := expr.CopyWithoutTerms()
|
||||
|
||||
switch ts := expr.Terms.(type) {
|
||||
case *SomeDecl:
|
||||
@@ -973,14 +1082,11 @@ func (expr *Expr) Copy() *Expr {
|
||||
cpy.Terms = cpyTs
|
||||
case *Term:
|
||||
cpy.Terms = ts.Copy()
|
||||
case *Every:
|
||||
cpy.Terms = ts.Copy()
|
||||
}
|
||||
|
||||
cpy.With = make([]*With, len(expr.With))
|
||||
for i := range expr.With {
|
||||
cpy.With[i] = expr.With[i].Copy()
|
||||
}
|
||||
|
||||
return &cpy
|
||||
return cpy
|
||||
}
|
||||
|
||||
// Hash returns the hash code of the Expr.
|
||||
@@ -1021,12 +1127,12 @@ func (expr *Expr) NoWith() *Expr {
|
||||
|
||||
// IsEquality returns true if this is an equality expression.
|
||||
func (expr *Expr) IsEquality() bool {
|
||||
return isglobalbuiltin(expr, Var(Equality.Name))
|
||||
return isGlobalBuiltin(expr, Var(Equality.Name))
|
||||
}
|
||||
|
||||
// IsAssignment returns true if this an assignment expression.
|
||||
func (expr *Expr) IsAssignment() bool {
|
||||
return isglobalbuiltin(expr, Var(Assign.Name))
|
||||
return isGlobalBuiltin(expr, Var(Assign.Name))
|
||||
}
|
||||
|
||||
// IsCall returns true if this expression calls a function.
|
||||
@@ -1035,14 +1141,36 @@ func (expr *Expr) IsCall() bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
// IsEvery returns true if this expression is an 'every' expression.
|
||||
func (expr *Expr) IsEvery() bool {
|
||||
_, ok := expr.Terms.(*Every)
|
||||
return ok
|
||||
}
|
||||
|
||||
// IsSome returns true if this expression is a 'some' expression.
|
||||
func (expr *Expr) IsSome() bool {
|
||||
_, ok := expr.Terms.(*SomeDecl)
|
||||
return ok
|
||||
}
|
||||
|
||||
// Operator returns the name of the function or built-in this expression refers
|
||||
// to. If this expression is not a function call, returns nil.
|
||||
func (expr *Expr) Operator() Ref {
|
||||
op := expr.OperatorTerm()
|
||||
if op == nil {
|
||||
return nil
|
||||
}
|
||||
return op.Value.(Ref)
|
||||
}
|
||||
|
||||
// OperatorTerm returns the name of the function or built-in this expression
|
||||
// refers to. If this expression is not a function call, returns nil.
|
||||
func (expr *Expr) OperatorTerm() *Term {
|
||||
terms, ok := expr.Terms.([]*Term)
|
||||
if !ok || len(terms) == 0 {
|
||||
return nil
|
||||
}
|
||||
return terms[0].Value.(Ref)
|
||||
return terms[0]
|
||||
}
|
||||
|
||||
// Operand returns the term at the zero-based pos. If the expr does not include
|
||||
@@ -1110,7 +1238,7 @@ func (expr *Expr) SetLoc(loc *Location) {
|
||||
}
|
||||
|
||||
func (expr *Expr) String() string {
|
||||
var buf []string
|
||||
buf := make([]string, 0, 2+len(expr.With))
|
||||
if expr.Negated {
|
||||
buf = append(buf, "not")
|
||||
}
|
||||
@@ -1121,9 +1249,7 @@ func (expr *Expr) String() string {
|
||||
} else {
|
||||
buf = append(buf, Call(t).String())
|
||||
}
|
||||
case *Term:
|
||||
buf = append(buf, t.String())
|
||||
case *SomeDecl:
|
||||
case fmt.Stringer:
|
||||
buf = append(buf, t.String())
|
||||
}
|
||||
|
||||
@@ -1158,6 +1284,12 @@ func NewBuiltinExpr(terms ...*Term) *Expr {
|
||||
}
|
||||
|
||||
func (d *SomeDecl) String() string {
|
||||
if call, ok := d.Symbols[0].Value.(Call); ok {
|
||||
if len(call) == 4 {
|
||||
return "some " + call[1].String() + ", " + call[2].String() + " in " + call[3].String()
|
||||
}
|
||||
return "some " + call[1].String() + " in " + call[2].String()
|
||||
}
|
||||
buf := make([]string, len(d.Symbols))
|
||||
for i := range buf {
|
||||
buf[i] = d.Symbols[i].String()
|
||||
@@ -1193,6 +1325,62 @@ func (d *SomeDecl) Hash() int {
|
||||
return termSliceHash(d.Symbols)
|
||||
}
|
||||
|
||||
func (q *Every) String() string {
|
||||
if q.Key != nil {
|
||||
return fmt.Sprintf("every %s, %s in %s { %s }",
|
||||
q.Key,
|
||||
q.Value,
|
||||
q.Domain,
|
||||
q.Body)
|
||||
}
|
||||
return fmt.Sprintf("every %s in %s { %s }",
|
||||
q.Value,
|
||||
q.Domain,
|
||||
q.Body)
|
||||
}
|
||||
|
||||
func (q *Every) Loc() *Location {
|
||||
return q.Location
|
||||
}
|
||||
|
||||
func (q *Every) SetLoc(l *Location) {
|
||||
q.Location = l
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of d.
|
||||
func (q *Every) Copy() *Every {
|
||||
cpy := *q
|
||||
cpy.Key = q.Key.Copy()
|
||||
cpy.Value = q.Value.Copy()
|
||||
cpy.Domain = q.Domain.Copy()
|
||||
cpy.Body = q.Body.Copy()
|
||||
return &cpy
|
||||
}
|
||||
|
||||
func (q *Every) Compare(other *Every) int {
|
||||
for _, terms := range [][2]*Term{
|
||||
{q.Key, other.Key},
|
||||
{q.Value, other.Value},
|
||||
{q.Domain, other.Domain},
|
||||
} {
|
||||
if d := Compare(terms[0], terms[1]); d != 0 {
|
||||
return d
|
||||
}
|
||||
}
|
||||
return q.Body.Compare(other.Body)
|
||||
}
|
||||
|
||||
// KeyValueVars returns the key and val arguments of an `every`
|
||||
// expression, if they are non-nil and not wildcards.
|
||||
func (q *Every) KeyValueVars() VarSet {
|
||||
vis := &VarVisitor{vars: VarSet{}}
|
||||
if q.Key != nil {
|
||||
vis.Walk(q.Key)
|
||||
}
|
||||
vis.Walk(q.Value)
|
||||
return vis.vars
|
||||
}
|
||||
|
||||
func (w *With) String() string {
|
||||
return "with " + w.Target.String() + " as " + w.Value.String()
|
||||
}
|
||||
@@ -1251,6 +1439,55 @@ func (w *With) SetLoc(loc *Location) {
|
||||
w.Location = loc
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of the AST node x. If x is not an AST node, x is returned unmodified.
|
||||
func Copy(x interface{}) interface{} {
|
||||
switch x := x.(type) {
|
||||
case *Module:
|
||||
return x.Copy()
|
||||
case *Package:
|
||||
return x.Copy()
|
||||
case *Import:
|
||||
return x.Copy()
|
||||
case *Rule:
|
||||
return x.Copy()
|
||||
case *Head:
|
||||
return x.Copy()
|
||||
case Args:
|
||||
return x.Copy()
|
||||
case Body:
|
||||
return x.Copy()
|
||||
case *Expr:
|
||||
return x.Copy()
|
||||
case *With:
|
||||
return x.Copy()
|
||||
case *SomeDecl:
|
||||
return x.Copy()
|
||||
case *Every:
|
||||
return x.Copy()
|
||||
case *Term:
|
||||
return x.Copy()
|
||||
case *ArrayComprehension:
|
||||
return x.Copy()
|
||||
case *SetComprehension:
|
||||
return x.Copy()
|
||||
case *ObjectComprehension:
|
||||
return x.Copy()
|
||||
case Set:
|
||||
return x.Copy()
|
||||
case *object:
|
||||
return x.Copy()
|
||||
case *Array:
|
||||
return x.Copy()
|
||||
case Ref:
|
||||
return x.Copy()
|
||||
case Call:
|
||||
return x.Copy()
|
||||
case *Comment:
|
||||
return x.Copy()
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
// RuleSet represents a collection of rules that produce a virtual document.
|
||||
type RuleSet []*Rule
|
||||
|
||||
@@ -1319,12 +1556,6 @@ func (rs RuleSet) String() string {
|
||||
return "{" + strings.Join(buf, ", ") + "}"
|
||||
}
|
||||
|
||||
type ruleSlice []*Rule
|
||||
|
||||
func (s ruleSlice) Less(i, j int) bool { return Compare(s[i], s[j]) < 0 }
|
||||
func (s ruleSlice) Swap(i, j int) { x := s[i]; s[i] = s[j]; s[j] = x }
|
||||
func (s ruleSlice) Len() int { return len(s) }
|
||||
|
||||
// Returns true if the equality or assignment expression referred to by expr
|
||||
// has a valid number of arguments.
|
||||
func validEqAssignArgCount(expr *Expr) bool {
|
||||
@@ -1333,7 +1564,7 @@ func validEqAssignArgCount(expr *Expr) bool {
|
||||
|
||||
// this function checks if the expr refers to a non-namespaced (global) built-in
|
||||
// function like eq, gt, plus, etc.
|
||||
func isglobalbuiltin(expr *Expr, name Var) bool {
|
||||
func isGlobalBuiltin(expr *Expr, name Var) bool {
|
||||
terms, ok := expr.Terms.([]*Term)
|
||||
if !ok {
|
||||
return false
|
||||
@@ -1344,9 +1575,9 @@ func isglobalbuiltin(expr *Expr, name Var) bool {
|
||||
ref, ok := terms[0].Value.(Ref)
|
||||
if !ok || len(ref) != 1 {
|
||||
return false
|
||||
} else if head, ok := ref[0].Value.(Var); !ok {
|
||||
return false
|
||||
} else {
|
||||
}
|
||||
if head, ok := ref[0].Value.(Var); ok {
|
||||
return head.Equal(name)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
311
vendor/github.com/open-policy-agent/opa/ast/rego.peg
generated
vendored
311
vendor/github.com/open-policy-agent/opa/ast/rego.peg
generated
vendored
@@ -1,311 +0,0 @@
|
||||
{
|
||||
package ast
|
||||
}
|
||||
|
||||
Program <- _ vals:(Stmt (ws Stmt)*)? _ EOF {
|
||||
return makeProgram(c, vals)
|
||||
}
|
||||
|
||||
Stmt <- val:(Package / Import / Rules / Body / Comment) {
|
||||
return val, nil
|
||||
}
|
||||
|
||||
Package <- "package" ws val:(Ref / Var) {
|
||||
return makePackage(currentLocation(c), val)
|
||||
}
|
||||
|
||||
Import <- "import" ws path:(Ref / Var) alias:(ws "as" ws Var)? {
|
||||
return makeImport(currentLocation(c), path, alias)
|
||||
}
|
||||
|
||||
Rules <- DefaultRules / NormalRules
|
||||
|
||||
DefaultRules <- "default" ws name:Var _ operator:( ":=" / "=" ) _ value:Term {
|
||||
return makeDefaultRule(currentLocation(c), name, operator, value)
|
||||
}
|
||||
|
||||
NormalRules <- head:(PartialRuleHead / RuleHead) _ rest:(NonEmptyBraceEnclosedBody ( _ RuleExt)* ) {
|
||||
return makeRule(currentLocation(c), head, rest)
|
||||
}
|
||||
|
||||
PartialRuleHead <- name:Var args:( _ "(" _ Args _ ")" _ ) value:( _ ( ":=" / "=" ) _ ExprTerm )? {
|
||||
return makeRuleHead(currentLocation(c), name, args, nil, value)
|
||||
}
|
||||
|
||||
RuleHead <- name:Var key:( _ "[" _ ExprTerm _ "]" _ )? value:( _ ( ":=" / "=" ) _ ExprTerm )? {
|
||||
return makeRuleHead(currentLocation(c), name, nil, key, value)
|
||||
}
|
||||
|
||||
Args <- list:ExprTermList {
|
||||
return makeArgs(list)
|
||||
}
|
||||
|
||||
Else <- "else" value:( _ "=" _ Term )? body:( _ NonEmptyBraceEnclosedBody ) {
|
||||
return makeRuleExt(currentLocation(c), value, body)
|
||||
}
|
||||
|
||||
RuleDup <- b:NonEmptyBraceEnclosedBody {
|
||||
return ruleExt{loc: currentLocation(c), body: b.(Body)}, nil
|
||||
}
|
||||
|
||||
RuleExt <- Else / RuleDup
|
||||
|
||||
Body <- NonWhitespaceBody / BraceEnclosedBody
|
||||
|
||||
NonEmptyBraceEnclosedBody <- "{" _ val:WhitespaceBody? _ "}" {
|
||||
if val == nil {
|
||||
return NewBody(), fmt.Errorf("found empty body")
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
BraceEnclosedBody <- "{" _ val:WhitespaceBody? _ "}" {
|
||||
return makeBraceEnclosedBody(currentLocation(c), val)
|
||||
}
|
||||
|
||||
WhitespaceBody <- head:Literal tail:(WhitespaceLiteralSeparator _ Literal)* {
|
||||
return makeBody(head, tail, 2)
|
||||
}
|
||||
|
||||
NonWhitespaceBody <- head:Literal tail:( _ NonWhitespaceLiteralSeparator _ Literal)* {
|
||||
return makeBody(head, tail, 3)
|
||||
}
|
||||
|
||||
WhitespaceLiteralSeparator <- [ \t]* ((NonWhitespaceLiteralSeparator Comment?) / (Comment? [\r\n]))
|
||||
|
||||
NonWhitespaceLiteralSeparator <- ";"
|
||||
|
||||
Literal <- TermExpr / SomeDecl
|
||||
|
||||
SomeDecl <- "some" ws symbols:SomeDeclList {
|
||||
return makeSomeDeclLiteral(currentLocation(c), symbols)
|
||||
}
|
||||
|
||||
SomeDeclList <- head:Var rest:( _ ',' _ Var)* {
|
||||
return makeSomeDeclSymbols(head, rest)
|
||||
}
|
||||
|
||||
TermExpr <- negated:NotKeyword? value:LiteralExpr with:WithKeywordList? {
|
||||
return makeLiteral(negated, value, with)
|
||||
}
|
||||
|
||||
LiteralExpr <- lhs:ExprTerm rest:( _ LiteralExprOperator _ ExprTerm)? {
|
||||
return makeLiteralExpr(currentLocation(c), lhs, rest)
|
||||
}
|
||||
|
||||
LiteralExprOperator <- val:( ":=" / "=" ) {
|
||||
return makeInfixOperator(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
NotKeyword <- val:("not" ws)? {
|
||||
return val != nil, nil
|
||||
}
|
||||
|
||||
WithKeywordList <- ws head:WithKeyword rest:( ws WithKeyword )* {
|
||||
return makeWithKeywordList(head, rest)
|
||||
}
|
||||
|
||||
WithKeyword <- "with" ws target:ExprTerm ws "as" ws value:ExprTerm {
|
||||
return makeWithKeyword(currentLocation(c), target, value)
|
||||
}
|
||||
|
||||
ExprTerm <- lhs:RelationExpr rest:( _ RelationOperator _ RelationExpr )* {
|
||||
return makeExprTerm(currentLocation(c), lhs, rest)
|
||||
}
|
||||
|
||||
ExprTermPairList <- head:ExprTermPair? tail:( _ ',' _ ExprTermPair )* _ ","? {
|
||||
return makeExprTermPairList(head, tail)
|
||||
}
|
||||
|
||||
ExprTermList <- head:ExprTerm? tail:( _ ',' _ ExprTerm )* _ ","? {
|
||||
return makeExprTermList(head, tail)
|
||||
}
|
||||
|
||||
ExprTermPair <- key:ExprTerm _ ':' _ value:ExprTerm {
|
||||
return makeExprTermPair(key, value)
|
||||
}
|
||||
|
||||
RelationOperator <- val:("==" / "!=" / "<=" / ">=" / ">" / "<") {
|
||||
return makeInfixOperator(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
RelationExpr <- lhs:BitwiseOrExpr rest:( _ BitwiseOrOperator _ BitwiseOrExpr)* {
|
||||
return makeExprTerm(currentLocation(c), lhs, rest)
|
||||
}
|
||||
|
||||
BitwiseOrOperator <- val:"|" {
|
||||
return makeInfixOperator(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
BitwiseOrExpr <- lhs:BitwiseAndExpr rest:( _ BitwiseAndOperator _ BitwiseAndExpr)* {
|
||||
return makeExprTerm(currentLocation(c), lhs, rest)
|
||||
}
|
||||
|
||||
BitwiseAndOperator <- val:"&" {
|
||||
return makeInfixOperator(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
BitwiseAndExpr <- lhs:ArithExpr rest:( _ ArithOperator _ ArithExpr)* {
|
||||
return makeExprTerm(currentLocation(c), lhs, rest)
|
||||
}
|
||||
|
||||
ArithOperator <- val:("+" / "-") {
|
||||
return makeInfixOperator(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
ArithExpr <- lhs:FactorExpr rest:( _ FactorOperator _ FactorExpr )* {
|
||||
return makeExprTerm(currentLocation(c), lhs, rest)
|
||||
}
|
||||
|
||||
FactorOperator <- val:("*" / "/" / "%"){
|
||||
return makeInfixOperator(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
FactorExpr <- ( "(" _ expr:ExprTerm _ ")" ) {
|
||||
return expr, nil
|
||||
} / term:Term {
|
||||
return term, nil
|
||||
}
|
||||
|
||||
Call <- operator:(Ref / Var) "(" _ args:ExprTermList _ ")" {
|
||||
return makeCall(currentLocation(c), operator, args)
|
||||
}
|
||||
|
||||
Term <- val:( Comprehension / Composite / Scalar / Call / Var ) refs:RefOperand* {
|
||||
return makeRef(currentLocation(c), val, refs)
|
||||
}
|
||||
|
||||
TermPair <- key:Term _ ":" _ value:Term {
|
||||
return makeExprTermPair(key, value)
|
||||
}
|
||||
|
||||
Comprehension <- ArrayComprehension / ObjectComprehension / SetComprehension
|
||||
|
||||
ArrayComprehension <- "[" _ head:Term _ "|" _ body:WhitespaceBody _ "]" {
|
||||
return makeArrayComprehension(currentLocation(c), head, body)
|
||||
}
|
||||
|
||||
ObjectComprehension <- "{" _ head:TermPair _ "|" _ body:WhitespaceBody _ "}" {
|
||||
return makeObjectComprehension(currentLocation(c), head, body)
|
||||
}
|
||||
|
||||
SetComprehension <- "{" _ head:Term _ "|" _ body:WhitespaceBody _ "}" {
|
||||
return makeSetComprehension(currentLocation(c), head, body)
|
||||
}
|
||||
|
||||
Composite <- Object / Array / Set
|
||||
|
||||
Scalar <- Number / String / Bool / Null
|
||||
|
||||
Object <- '{' _ list:ExprTermPairList _ '}' {
|
||||
return makeObject(currentLocation(c), list)
|
||||
}
|
||||
|
||||
Array <- '[' _ list:ExprTermList _ ']' {
|
||||
return makeArray(currentLocation(c), list)
|
||||
}
|
||||
|
||||
Set <- SetEmpty / SetNonEmpty
|
||||
|
||||
SetEmpty <- "set(" _ ")" {
|
||||
var empty []*Term
|
||||
return makeSet(currentLocation(c), empty)
|
||||
}
|
||||
|
||||
SetNonEmpty <- '{' _ list:ExprTermList _ '}' {
|
||||
return makeSet(currentLocation(c), list)
|
||||
}
|
||||
|
||||
Ref <- head:(Composite / Var) rest:RefOperand+ {
|
||||
return makeRef(currentLocation(c), head, rest)
|
||||
}
|
||||
|
||||
RefOperand <- RefOperandDot / RefOperandCanonical
|
||||
|
||||
RefOperandDot <- "." val:Var {
|
||||
return makeRefOperandDot(currentLocation(c), val)
|
||||
}
|
||||
|
||||
RefOperandCanonical <- "[" val:ExprTerm "]" {
|
||||
return val, nil
|
||||
}
|
||||
|
||||
Var <- val:VarChecked {
|
||||
return val.([]interface{})[0], nil
|
||||
}
|
||||
|
||||
VarChecked <- val:VarUnchecked !{
|
||||
return IsKeyword(string(val.(*Term).Value.(Var))), nil
|
||||
}
|
||||
|
||||
VarUnchecked <- VarStart VarChar* {
|
||||
return makeVar(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
Number <- '-'? ( Float / Integer ) {
|
||||
return makeNumber(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
Float <- ExponentFloat / PointFloat
|
||||
|
||||
ExponentFloat <- ( PointFloat / Integer ) Exponent
|
||||
|
||||
PointFloat <- Integer? Fraction
|
||||
|
||||
Fraction <- '.' DecimalDigit+
|
||||
|
||||
Exponent <- 'e'i [+-]? DecimalDigit+
|
||||
|
||||
Integer <- '0' / ( NonZeroDecimalDigit DecimalDigit* )
|
||||
|
||||
String <- QuotedString / RawString
|
||||
|
||||
QuotedString <- '"' Char* '"' {
|
||||
return makeString(currentLocation(c), c.text)
|
||||
} / '"' Char* !'"' {
|
||||
return makeNonterminatedString(currentLocation(c), string(c.text))
|
||||
}
|
||||
|
||||
RawString <- '`' [^`]* '`' {
|
||||
return makeRawString(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
Bool <- val:("true" / "false") !VarChar {
|
||||
return makeBool(currentLocation(c), c.text)
|
||||
}
|
||||
|
||||
Null <- "null" !VarChar {
|
||||
return makeNull(currentLocation(c))
|
||||
}
|
||||
|
||||
VarStart <- AsciiLetter
|
||||
|
||||
VarChar <- AsciiLetter / DecimalDigit
|
||||
|
||||
AsciiLetter <- [A-Za-z_]
|
||||
|
||||
Char <- ( !EscapedChar . ) / ( '\\' EscapeSequence )
|
||||
|
||||
EscapedChar <- [\x00-\x1f"\\]
|
||||
|
||||
EscapeSequence <- SingleCharEscape / UnicodeEscape
|
||||
|
||||
SingleCharEscape <- [ " \\ / b f n r t ]
|
||||
|
||||
UnicodeEscape <- 'u' HexDigit HexDigit HexDigit HexDigit
|
||||
|
||||
DecimalDigit <- [0-9]
|
||||
|
||||
NonZeroDecimalDigit <- [1-9]
|
||||
|
||||
HexDigit <- [0-9a-fA-F]
|
||||
|
||||
ws "whitespace" <- [ \t\r\n]+
|
||||
|
||||
_ "whitespace" <- ( [ \t\r\n] / Comment )*
|
||||
|
||||
Comment <- [ \t]* "#" text:[^\r\n]* {
|
||||
return makeComments(c, text)
|
||||
}
|
||||
|
||||
EOF <- !.
|
||||
63
vendor/github.com/open-policy-agent/opa/ast/schema.go
generated
vendored
Normal file
63
vendor/github.com/open-policy-agent/opa/ast/schema.go
generated
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
// Copyright 2021 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ast
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/open-policy-agent/opa/types"
|
||||
"github.com/open-policy-agent/opa/util"
|
||||
)
|
||||
|
||||
// SchemaSet holds a map from a path to a schema.
|
||||
type SchemaSet struct {
|
||||
m *util.HashMap
|
||||
}
|
||||
|
||||
// NewSchemaSet returns an empty SchemaSet.
|
||||
func NewSchemaSet() *SchemaSet {
|
||||
|
||||
eqFunc := func(a, b util.T) bool {
|
||||
return a.(Ref).Equal(b.(Ref))
|
||||
}
|
||||
|
||||
hashFunc := func(x util.T) int { return x.(Ref).Hash() }
|
||||
|
||||
return &SchemaSet{
|
||||
m: util.NewHashMap(eqFunc, hashFunc),
|
||||
}
|
||||
}
|
||||
|
||||
// Put inserts a raw schema into the set.
|
||||
func (ss *SchemaSet) Put(path Ref, raw interface{}) {
|
||||
ss.m.Put(path, raw)
|
||||
}
|
||||
|
||||
// Get returns the raw schema identified by the path.
|
||||
func (ss *SchemaSet) Get(path Ref) interface{} {
|
||||
if ss == nil {
|
||||
return nil
|
||||
}
|
||||
x, ok := ss.m.Get(path)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
func loadSchema(raw interface{}, allowNet []string) (types.Type, error) {
|
||||
|
||||
jsonSchema, err := compileSchema(raw, allowNet)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tpe, err := newSchemaParser().parseSchema(jsonSchema.RootSchema)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("type checking: %w", err)
|
||||
}
|
||||
|
||||
return tpe, nil
|
||||
}
|
||||
918
vendor/github.com/open-policy-agent/opa/ast/term.go
generated
vendored
918
vendor/github.com/open-policy-agent/opa/ast/term.go
generated
vendored
File diff suppressed because it is too large
Load Diff
44
vendor/github.com/open-policy-agent/opa/ast/transform.go
generated
vendored
44
vendor/github.com/open-policy-agent/opa/ast/transform.go
generated
vendored
@@ -4,7 +4,9 @@
|
||||
|
||||
package ast
|
||||
|
||||
import "fmt"
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Transformer defines the interface for transforming AST elements. If the
|
||||
// transformer returns nil and does not indicate an error, the AST element will
|
||||
@@ -59,6 +61,15 @@ func Transform(t Transformer, x interface{}) (interface{}, error) {
|
||||
return nil, fmt.Errorf("illegal transform: %T != %T", y.Rules[i], rule)
|
||||
}
|
||||
}
|
||||
for i := range y.Annotations {
|
||||
a, err := Transform(t, y.Annotations[i])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if y.Annotations[i], ok = a.(*Annotations); !ok {
|
||||
return nil, fmt.Errorf("illegal transform: %T != %T", y.Annotations[i], a)
|
||||
}
|
||||
}
|
||||
for i := range y.Comments {
|
||||
comment, err := Transform(t, y.Comments[i])
|
||||
if err != nil {
|
||||
@@ -161,6 +172,26 @@ func Transform(t Transformer, x interface{}) (interface{}, error) {
|
||||
if y.Terms, err = transformTerm(t, ts); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case *Every:
|
||||
if ts.Key != nil {
|
||||
ts.Key, err = transformTerm(t, ts.Key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
ts.Value, err = transformTerm(t, ts.Value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ts.Domain, err = transformTerm(t, ts.Domain)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ts.Body, err = transformBody(t, ts.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
y.Terms = ts
|
||||
}
|
||||
for i, w := range y.With {
|
||||
w, err := Transform(t, w)
|
||||
@@ -187,7 +218,7 @@ func Transform(t Transformer, x interface{}) (interface{}, error) {
|
||||
}
|
||||
}
|
||||
return y, nil
|
||||
case Object:
|
||||
case *object:
|
||||
return y.Map(func(k, v *Term) (*Term, *Term, error) {
|
||||
k, err := transformTerm(t, k)
|
||||
if err != nil {
|
||||
@@ -199,11 +230,13 @@ func Transform(t Transformer, x interface{}) (interface{}, error) {
|
||||
}
|
||||
return k, v, nil
|
||||
})
|
||||
case Array:
|
||||
for i := range y {
|
||||
if y[i], err = transformTerm(t, y[i]); err != nil {
|
||||
case *Array:
|
||||
for i := 0; i < y.Len(); i++ {
|
||||
v, err := transformTerm(t, y.Elem(i))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
y.set(i, v)
|
||||
}
|
||||
return y, nil
|
||||
case Set:
|
||||
@@ -321,6 +354,7 @@ func transformHead(t Transformer, head *Head) (*Head, error) {
|
||||
}
|
||||
return h, nil
|
||||
}
|
||||
|
||||
func transformArgs(t Transformer, args Args) (Args, error) {
|
||||
y, err := Transform(t, args)
|
||||
if err != nil {
|
||||
|
||||
85
vendor/github.com/open-policy-agent/opa/ast/unify.go
generated
vendored
85
vendor/github.com/open-policy-agent/opa/ast/unify.go
generated
vendored
@@ -4,6 +4,29 @@
|
||||
|
||||
package ast
|
||||
|
||||
func isRefSafe(ref Ref, safe VarSet) bool {
|
||||
switch head := ref[0].Value.(type) {
|
||||
case Var:
|
||||
return safe.Contains(head)
|
||||
case Call:
|
||||
return isCallSafe(head, safe)
|
||||
default:
|
||||
for v := range ref[0].Vars() {
|
||||
if !safe.Contains(v) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func isCallSafe(call Call, safe VarSet) bool {
|
||||
vis := NewVarVisitor().WithParams(SafetyCheckVisitorParams)
|
||||
vis.Walk(call)
|
||||
unsafe := vis.Vars().Diff(safe)
|
||||
return len(unsafe) == 0
|
||||
}
|
||||
|
||||
// Unify returns a set of variables that will be unified when the equality expression defined by
|
||||
// terms a and b is evaluated. The unifier assumes that variables in the VarSet safe are already
|
||||
// unified.
|
||||
@@ -42,10 +65,14 @@ func (u *unifier) unify(a *Term, b *Term) {
|
||||
u.markUnknown(a, b)
|
||||
u.markUnknown(b, a)
|
||||
}
|
||||
case Array, Object:
|
||||
case *Array, Object:
|
||||
u.unifyAll(a, b)
|
||||
case Ref:
|
||||
if u.isSafe(b[0].Value.(Var)) {
|
||||
if isRefSafe(b, u.safe) {
|
||||
u.markSafe(a)
|
||||
}
|
||||
case Call:
|
||||
if isCallSafe(b, u.safe) {
|
||||
u.markSafe(a)
|
||||
}
|
||||
default:
|
||||
@@ -53,11 +80,21 @@ func (u *unifier) unify(a *Term, b *Term) {
|
||||
}
|
||||
|
||||
case Ref:
|
||||
if u.isSafe(a[0].Value.(Var)) {
|
||||
if isRefSafe(a, u.safe) {
|
||||
switch b := b.Value.(type) {
|
||||
case Var:
|
||||
u.markSafe(b)
|
||||
case Array, Object:
|
||||
case *Array, Object:
|
||||
u.markAllSafe(b)
|
||||
}
|
||||
}
|
||||
|
||||
case Call:
|
||||
if isCallSafe(a, u.safe) {
|
||||
switch b := b.Value.(type) {
|
||||
case Var:
|
||||
u.markSafe(b)
|
||||
case *Array, Object:
|
||||
u.markAllSafe(b)
|
||||
}
|
||||
}
|
||||
@@ -66,14 +103,14 @@ func (u *unifier) unify(a *Term, b *Term) {
|
||||
switch b := b.Value.(type) {
|
||||
case Var:
|
||||
u.markSafe(b)
|
||||
case Array:
|
||||
case *Array:
|
||||
u.markAllSafe(b)
|
||||
}
|
||||
case *ObjectComprehension:
|
||||
switch b := b.Value.(type) {
|
||||
case Var:
|
||||
u.markSafe(b)
|
||||
case Object:
|
||||
case *object:
|
||||
u.markAllSafe(b)
|
||||
}
|
||||
case *SetComprehension:
|
||||
@@ -82,34 +119,48 @@ func (u *unifier) unify(a *Term, b *Term) {
|
||||
u.markSafe(b)
|
||||
}
|
||||
|
||||
case Array:
|
||||
case *Array:
|
||||
switch b := b.Value.(type) {
|
||||
case Var:
|
||||
u.unifyAll(b, a)
|
||||
case Ref, *ArrayComprehension, *ObjectComprehension, *SetComprehension:
|
||||
case *ArrayComprehension, *ObjectComprehension, *SetComprehension:
|
||||
u.markAllSafe(a)
|
||||
case Array:
|
||||
if len(a) == len(b) {
|
||||
for i := range a {
|
||||
u.unify(a[i], b[i])
|
||||
case Ref:
|
||||
if isRefSafe(b, u.safe) {
|
||||
u.markAllSafe(a)
|
||||
}
|
||||
case Call:
|
||||
if isCallSafe(b, u.safe) {
|
||||
u.markAllSafe(a)
|
||||
}
|
||||
case *Array:
|
||||
if a.Len() == b.Len() {
|
||||
for i := 0; i < a.Len(); i++ {
|
||||
u.unify(a.Elem(i), b.Elem(i))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case Object:
|
||||
case *object:
|
||||
switch b := b.Value.(type) {
|
||||
case Var:
|
||||
u.unifyAll(b, a)
|
||||
case Ref:
|
||||
u.markAllSafe(a)
|
||||
case Object:
|
||||
if isRefSafe(b, u.safe) {
|
||||
u.markAllSafe(a)
|
||||
}
|
||||
case Call:
|
||||
if isCallSafe(b, u.safe) {
|
||||
u.markAllSafe(a)
|
||||
}
|
||||
case *object:
|
||||
if a.Len() == b.Len() {
|
||||
a.Iter(func(k, v *Term) error {
|
||||
_ = a.Iter(func(k, v *Term) error {
|
||||
if v2 := b.Get(k); v2 != nil {
|
||||
u.unify(v, v2)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}) // impossible to return error
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
2
vendor/github.com/open-policy-agent/opa/ast/varset.go
generated
vendored
2
vendor/github.com/open-policy-agent/opa/ast/varset.go
generated
vendored
@@ -91,7 +91,7 @@ func (s VarSet) Update(vs VarSet) {
|
||||
}
|
||||
|
||||
func (s VarSet) String() string {
|
||||
tmp := []string{}
|
||||
tmp := make([]string, 0, len(s))
|
||||
for v := range s {
|
||||
tmp = append(tmp, string(v))
|
||||
}
|
||||
|
||||
131
vendor/github.com/open-policy-agent/opa/ast/visit.go
generated
vendored
131
vendor/github.com/open-policy-agent/opa/ast/visit.go
generated
vendored
@@ -52,6 +52,9 @@ func walk(v Visitor, x interface{}) {
|
||||
for _, r := range x.Rules {
|
||||
Walk(w, r)
|
||||
}
|
||||
for _, a := range x.Annotations {
|
||||
Walk(w, a)
|
||||
}
|
||||
for _, c := range x.Comments {
|
||||
Walk(w, c)
|
||||
}
|
||||
@@ -85,14 +88,12 @@ func walk(v Visitor, x interface{}) {
|
||||
}
|
||||
case *Expr:
|
||||
switch ts := x.Terms.(type) {
|
||||
case *SomeDecl:
|
||||
case *Term, *SomeDecl, *Every:
|
||||
Walk(w, ts)
|
||||
case []*Term:
|
||||
for _, t := range ts {
|
||||
Walk(w, t)
|
||||
}
|
||||
case *Term:
|
||||
Walk(w, ts)
|
||||
}
|
||||
for i := range x.With {
|
||||
Walk(w, x.With[i])
|
||||
@@ -106,15 +107,15 @@ func walk(v Visitor, x interface{}) {
|
||||
for _, t := range x {
|
||||
Walk(w, t)
|
||||
}
|
||||
case Object:
|
||||
case *object:
|
||||
x.Foreach(func(k, vv *Term) {
|
||||
Walk(w, k)
|
||||
Walk(w, vv)
|
||||
})
|
||||
case Array:
|
||||
for _, t := range x {
|
||||
case *Array:
|
||||
x.Foreach(func(t *Term) {
|
||||
Walk(w, t)
|
||||
}
|
||||
})
|
||||
case Set:
|
||||
x.Foreach(func(t *Term) {
|
||||
Walk(w, t)
|
||||
@@ -133,6 +134,13 @@ func walk(v Visitor, x interface{}) {
|
||||
for _, t := range x {
|
||||
Walk(w, t)
|
||||
}
|
||||
case *Every:
|
||||
if x.Key != nil {
|
||||
Walk(w, x.Key)
|
||||
}
|
||||
Walk(w, x.Value)
|
||||
Walk(w, x.Domain)
|
||||
Walk(w, x.Body)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,8 +160,8 @@ func WalkVars(x interface{}, f func(Var) bool) {
|
||||
// returns true, AST nodes under the last node will not be visited.
|
||||
func WalkClosures(x interface{}, f func(interface{}) bool) {
|
||||
vis := &GenericVisitor{func(x interface{}) bool {
|
||||
switch x.(type) {
|
||||
case *ArrayComprehension, *ObjectComprehension, *SetComprehension:
|
||||
switch x := x.(type) {
|
||||
case *ArrayComprehension, *ObjectComprehension, *SetComprehension, *Every:
|
||||
return f(x)
|
||||
}
|
||||
return false
|
||||
@@ -280,6 +288,9 @@ func (vis *GenericVisitor) Walk(x interface{}) {
|
||||
for _, r := range x.Rules {
|
||||
vis.Walk(r)
|
||||
}
|
||||
for _, a := range x.Annotations {
|
||||
vis.Walk(a)
|
||||
}
|
||||
for _, c := range x.Comments {
|
||||
vis.Walk(c)
|
||||
}
|
||||
@@ -313,14 +324,12 @@ func (vis *GenericVisitor) Walk(x interface{}) {
|
||||
}
|
||||
case *Expr:
|
||||
switch ts := x.Terms.(type) {
|
||||
case *SomeDecl:
|
||||
case *Term, *SomeDecl, *Every:
|
||||
vis.Walk(ts)
|
||||
case []*Term:
|
||||
for _, t := range ts {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case *Term:
|
||||
vis.Walk(ts)
|
||||
}
|
||||
for i := range x.With {
|
||||
vis.Walk(x.With[i])
|
||||
@@ -334,15 +343,15 @@ func (vis *GenericVisitor) Walk(x interface{}) {
|
||||
for _, t := range x {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case Object:
|
||||
for _, k := range x.Keys() {
|
||||
case *object:
|
||||
x.Foreach(func(k, v *Term) {
|
||||
vis.Walk(k)
|
||||
vis.Walk(x.Get(k))
|
||||
}
|
||||
case Array:
|
||||
for _, t := range x {
|
||||
})
|
||||
case *Array:
|
||||
x.Foreach(func(t *Term) {
|
||||
vis.Walk(t)
|
||||
}
|
||||
})
|
||||
case Set:
|
||||
for _, t := range x.Slice() {
|
||||
vis.Walk(t)
|
||||
@@ -361,6 +370,13 @@ func (vis *GenericVisitor) Walk(x interface{}) {
|
||||
for _, t := range x {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case *Every:
|
||||
if x.Key != nil {
|
||||
vis.Walk(x.Key)
|
||||
}
|
||||
vis.Walk(x.Value)
|
||||
vis.Walk(x.Domain)
|
||||
vis.Walk(x.Body)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -398,6 +414,9 @@ func (vis *BeforeAfterVisitor) Walk(x interface{}) {
|
||||
for _, r := range x.Rules {
|
||||
vis.Walk(r)
|
||||
}
|
||||
for _, a := range x.Annotations {
|
||||
vis.Walk(a)
|
||||
}
|
||||
for _, c := range x.Comments {
|
||||
vis.Walk(c)
|
||||
}
|
||||
@@ -431,14 +450,12 @@ func (vis *BeforeAfterVisitor) Walk(x interface{}) {
|
||||
}
|
||||
case *Expr:
|
||||
switch ts := x.Terms.(type) {
|
||||
case *SomeDecl:
|
||||
case *Term, *SomeDecl, *Every:
|
||||
vis.Walk(ts)
|
||||
case []*Term:
|
||||
for _, t := range ts {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case *Term:
|
||||
vis.Walk(ts)
|
||||
}
|
||||
for i := range x.With {
|
||||
vis.Walk(x.With[i])
|
||||
@@ -452,15 +469,15 @@ func (vis *BeforeAfterVisitor) Walk(x interface{}) {
|
||||
for _, t := range x {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case Object:
|
||||
for _, k := range x.Keys() {
|
||||
case *object:
|
||||
x.Foreach(func(k, v *Term) {
|
||||
vis.Walk(k)
|
||||
vis.Walk(x.Get(k))
|
||||
}
|
||||
case Array:
|
||||
for _, t := range x {
|
||||
})
|
||||
case *Array:
|
||||
x.Foreach(func(t *Term) {
|
||||
vis.Walk(t)
|
||||
}
|
||||
})
|
||||
case Set:
|
||||
for _, t := range x.Slice() {
|
||||
vis.Walk(t)
|
||||
@@ -479,6 +496,13 @@ func (vis *BeforeAfterVisitor) Walk(x interface{}) {
|
||||
for _, t := range x {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case *Every:
|
||||
if x.Key != nil {
|
||||
vis.Walk(x.Key)
|
||||
}
|
||||
vis.Walk(x.Value)
|
||||
vis.Walk(x.Domain)
|
||||
vis.Walk(x.Body)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -518,12 +542,14 @@ func (vis *VarVisitor) Vars() VarSet {
|
||||
return vis.vars
|
||||
}
|
||||
|
||||
// visit determines if the VarVisitor will recurse into x: if it returns `true`,
|
||||
// the visitor will _skip_ that branch of the AST
|
||||
func (vis *VarVisitor) visit(v interface{}) bool {
|
||||
if vis.params.SkipObjectKeys {
|
||||
if o, ok := v.(Object); ok {
|
||||
for _, k := range o.Keys() {
|
||||
vis.Walk(o.Get(k))
|
||||
}
|
||||
o.Foreach(func(k, v *Term) {
|
||||
vis.Walk(v)
|
||||
})
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -536,9 +562,15 @@ func (vis *VarVisitor) visit(v interface{}) bool {
|
||||
}
|
||||
}
|
||||
if vis.params.SkipClosures {
|
||||
switch v.(type) {
|
||||
switch v := v.(type) {
|
||||
case *ArrayComprehension, *ObjectComprehension, *SetComprehension:
|
||||
return true
|
||||
case *Expr:
|
||||
if ev, ok := v.Terms.(*Every); ok {
|
||||
vis.Walk(ev.Domain)
|
||||
// We're _not_ walking ev.Body -- that's the closure here
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
if vis.params.SkipWithTarget {
|
||||
@@ -576,6 +608,20 @@ func (vis *VarVisitor) visit(v interface{}) bool {
|
||||
vis.Walk(v[i])
|
||||
}
|
||||
return true
|
||||
case *With:
|
||||
if ref, ok := v.Target.Value.(Ref); ok {
|
||||
for _, t := range ref[1:] {
|
||||
vis.Walk(t)
|
||||
}
|
||||
}
|
||||
if ref, ok := v.Value.Value.(Ref); ok {
|
||||
for _, t := range ref[1:] {
|
||||
vis.Walk(t)
|
||||
}
|
||||
} else {
|
||||
vis.Walk(v.Value)
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
if v, ok := v.(Var); ok {
|
||||
@@ -634,14 +680,12 @@ func (vis *VarVisitor) Walk(x interface{}) {
|
||||
}
|
||||
case *Expr:
|
||||
switch ts := x.Terms.(type) {
|
||||
case *SomeDecl:
|
||||
case *Term, *SomeDecl, *Every:
|
||||
vis.Walk(ts)
|
||||
case []*Term:
|
||||
for _, t := range ts {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case *Term:
|
||||
vis.Walk(ts)
|
||||
}
|
||||
for i := range x.With {
|
||||
vis.Walk(x.With[i])
|
||||
@@ -655,15 +699,15 @@ func (vis *VarVisitor) Walk(x interface{}) {
|
||||
for _, t := range x {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case Object:
|
||||
for _, k := range x.Keys() {
|
||||
case *object:
|
||||
x.Foreach(func(k, v *Term) {
|
||||
vis.Walk(k)
|
||||
vis.Walk(x.Get(k))
|
||||
}
|
||||
case Array:
|
||||
for _, t := range x {
|
||||
})
|
||||
case *Array:
|
||||
x.Foreach(func(t *Term) {
|
||||
vis.Walk(t)
|
||||
}
|
||||
})
|
||||
case Set:
|
||||
for _, t := range x.Slice() {
|
||||
vis.Walk(t)
|
||||
@@ -682,5 +726,12 @@ func (vis *VarVisitor) Walk(x interface{}) {
|
||||
for _, t := range x {
|
||||
vis.Walk(t)
|
||||
}
|
||||
case *Every:
|
||||
if x.Key != nil {
|
||||
vis.Walk(x.Key)
|
||||
}
|
||||
vis.Walk(x.Value)
|
||||
vis.Walk(x.Domain)
|
||||
vis.Walk(x.Body)
|
||||
}
|
||||
}
|
||||
|
||||
1080
vendor/github.com/open-policy-agent/opa/bundle/bundle.go
generated
vendored
1080
vendor/github.com/open-policy-agent/opa/bundle/bundle.go
generated
vendored
File diff suppressed because it is too large
Load Diff
301
vendor/github.com/open-policy-agent/opa/bundle/file.go
generated
vendored
301
vendor/github.com/open-policy-agent/opa/bundle/file.go
generated
vendored
@@ -2,27 +2,71 @@ package bundle
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/open-policy-agent/opa/loader/filter"
|
||||
|
||||
"github.com/open-policy-agent/opa/storage"
|
||||
)
|
||||
|
||||
// Descriptor contains information about a file and
|
||||
// can be used to read the file contents.
|
||||
type Descriptor struct {
|
||||
url string
|
||||
path string
|
||||
reader io.Reader
|
||||
closer io.Closer
|
||||
closeOnce *sync.Once
|
||||
}
|
||||
|
||||
func newDescriptor(path string, reader io.Reader) *Descriptor {
|
||||
// lazyFile defers reading the file until the first call of Read
|
||||
type lazyFile struct {
|
||||
path string
|
||||
file *os.File
|
||||
}
|
||||
|
||||
// newLazyFile creates a new instance of lazyFile
|
||||
func newLazyFile(path string) *lazyFile {
|
||||
return &lazyFile{path: path}
|
||||
}
|
||||
|
||||
// Read implements io.Reader. It will check if the file has been opened
|
||||
// and open it if it has not before attempting to read using the file's
|
||||
// read method
|
||||
func (f *lazyFile) Read(b []byte) (int, error) {
|
||||
var err error
|
||||
|
||||
if f.file == nil {
|
||||
if f.file, err = os.Open(f.path); err != nil {
|
||||
return 0, fmt.Errorf("failed to open file %s: %w", f.path, err)
|
||||
}
|
||||
}
|
||||
|
||||
return f.file.Read(b)
|
||||
}
|
||||
|
||||
// Close closes the lazy file if it has been opened using the file's
|
||||
// close method
|
||||
func (f *lazyFile) Close() error {
|
||||
if f.file != nil {
|
||||
return f.file.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func newDescriptor(url, path string, reader io.Reader) *Descriptor {
|
||||
return &Descriptor{
|
||||
url: url,
|
||||
path: path,
|
||||
reader: reader,
|
||||
}
|
||||
@@ -39,6 +83,11 @@ func (d *Descriptor) Path() string {
|
||||
return d.path
|
||||
}
|
||||
|
||||
// URL returns the url of the file.
|
||||
func (d *Descriptor) URL() string {
|
||||
return d.url
|
||||
}
|
||||
|
||||
// Read will read all the contents from the file the Descriptor refers to
|
||||
// into the dest writer up n bytes. Will return an io.EOF error
|
||||
// if EOF is encountered before n bytes are read.
|
||||
@@ -65,23 +114,45 @@ type DirectoryLoader interface {
|
||||
// NextFile must return io.EOF if there is no next value. The returned
|
||||
// descriptor should *always* be closed when no longer needed.
|
||||
NextFile() (*Descriptor, error)
|
||||
WithFilter(filter filter.LoaderFilter) DirectoryLoader
|
||||
}
|
||||
|
||||
type dirLoader struct {
|
||||
root string
|
||||
files []string
|
||||
idx int
|
||||
root string
|
||||
files []string
|
||||
idx int
|
||||
filter filter.LoaderFilter
|
||||
}
|
||||
|
||||
// NewDirectoryLoader returns a basic DirectoryLoader implementation
|
||||
// that will load files from a given root directory path.
|
||||
func NewDirectoryLoader(root string) DirectoryLoader {
|
||||
|
||||
if len(root) > 1 {
|
||||
// Normalize relative directories, ex "./src/bundle" -> "src/bundle"
|
||||
// We don't need an absolute path, but this makes the joined/trimmed
|
||||
// paths more uniform.
|
||||
if root[0] == '.' && root[1] == filepath.Separator {
|
||||
if len(root) == 2 {
|
||||
root = root[:1] // "./" -> "."
|
||||
} else {
|
||||
root = root[2:] // remove leading "./"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
d := dirLoader{
|
||||
root: root,
|
||||
}
|
||||
return &d
|
||||
}
|
||||
|
||||
// WithFilter specifies the filter object to use to filter files while loading bundles
|
||||
func (d *dirLoader) WithFilter(filter filter.LoaderFilter) DirectoryLoader {
|
||||
d.filter = filter
|
||||
return d
|
||||
}
|
||||
|
||||
// NextFile iterates to the next file in the directory tree
|
||||
// and returns a file Descriptor for the file.
|
||||
func (d *dirLoader) NextFile() (*Descriptor, error) {
|
||||
@@ -90,12 +161,19 @@ func (d *dirLoader) NextFile() (*Descriptor, error) {
|
||||
d.files = []string{}
|
||||
err := filepath.Walk(d.root, func(path string, info os.FileInfo, err error) error {
|
||||
if info != nil && info.Mode().IsRegular() {
|
||||
if d.filter != nil && d.filter(filepath.ToSlash(path), info, getdepth(path, false)) {
|
||||
return nil
|
||||
}
|
||||
d.files = append(d.files, filepath.ToSlash(path))
|
||||
} else if info != nil && info.Mode().IsDir() {
|
||||
if d.filter != nil && d.filter(filepath.ToSlash(path), info, getdepth(path, true)) {
|
||||
return filepath.SkipDir
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to list files")
|
||||
return nil, fmt.Errorf("failed to list files: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,28 +185,40 @@ func (d *dirLoader) NextFile() (*Descriptor, error) {
|
||||
|
||||
fileName := d.files[d.idx]
|
||||
d.idx++
|
||||
fh, err := os.Open(fileName)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to open file %s", fileName)
|
||||
}
|
||||
fh := newLazyFile(fileName)
|
||||
|
||||
// Trim off the root directory and return path as if chrooted
|
||||
cleanedPath := strings.TrimPrefix(fileName, d.root)
|
||||
if d.root == "." && filepath.Base(fileName) == ManifestExt {
|
||||
cleanedPath = fileName
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(cleanedPath, "/") {
|
||||
cleanedPath = "/" + cleanedPath
|
||||
}
|
||||
|
||||
f := newDescriptor(cleanedPath, fh).withCloser(fh)
|
||||
f := newDescriptor(path.Join(d.root, cleanedPath), cleanedPath, fh).withCloser(fh)
|
||||
return f, nil
|
||||
}
|
||||
|
||||
type tarballLoader struct {
|
||||
r io.Reader
|
||||
tr *tar.Reader
|
||||
baseURL string
|
||||
r io.Reader
|
||||
tr *tar.Reader
|
||||
files []file
|
||||
idx int
|
||||
filter filter.LoaderFilter
|
||||
skipDir map[string]struct{}
|
||||
}
|
||||
|
||||
// NewTarballLoader returns a new DirectoryLoader that reads
|
||||
// files out of a gzipped tar archive.
|
||||
type file struct {
|
||||
name string
|
||||
reader io.Reader
|
||||
path storage.Path
|
||||
raw []byte
|
||||
}
|
||||
|
||||
// NewTarballLoader is deprecated. Use NewTarballLoaderWithBaseURL instead.
|
||||
func NewTarballLoader(r io.Reader) DirectoryLoader {
|
||||
l := tarballLoader{
|
||||
r: r,
|
||||
@@ -136,31 +226,188 @@ func NewTarballLoader(r io.Reader) DirectoryLoader {
|
||||
return &l
|
||||
}
|
||||
|
||||
// NewTarballLoaderWithBaseURL returns a new DirectoryLoader that reads
|
||||
// files out of a gzipped tar archive. The file URLs will be prefixed
|
||||
// with the baseURL.
|
||||
func NewTarballLoaderWithBaseURL(r io.Reader, baseURL string) DirectoryLoader {
|
||||
l := tarballLoader{
|
||||
baseURL: strings.TrimSuffix(baseURL, "/"),
|
||||
r: r,
|
||||
}
|
||||
return &l
|
||||
}
|
||||
|
||||
// WithFilter specifies the filter object to use to filter files while loading bundles
|
||||
func (t *tarballLoader) WithFilter(filter filter.LoaderFilter) DirectoryLoader {
|
||||
t.filter = filter
|
||||
return t
|
||||
}
|
||||
|
||||
// NextFile iterates to the next file in the directory tree
|
||||
// and returns a file Descriptor for the file.
|
||||
func (t *tarballLoader) NextFile() (*Descriptor, error) {
|
||||
if t.tr == nil {
|
||||
gr, err := gzip.NewReader(t.r)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "archive read failed")
|
||||
return nil, fmt.Errorf("archive read failed: %w", err)
|
||||
}
|
||||
|
||||
t.tr = tar.NewReader(gr)
|
||||
}
|
||||
|
||||
for {
|
||||
header, err := t.tr.Next()
|
||||
// Eventually we will get an io.EOF error when finished
|
||||
// iterating through the archive
|
||||
if err != nil {
|
||||
return nil, err
|
||||
if t.files == nil {
|
||||
t.files = []file{}
|
||||
|
||||
if t.skipDir == nil {
|
||||
t.skipDir = map[string]struct{}{}
|
||||
}
|
||||
|
||||
// Keep iterating on the archive until we find a normal file
|
||||
if header.Typeflag == tar.TypeReg {
|
||||
// no need to close this descriptor after reading
|
||||
f := newDescriptor(header.Name, t.tr)
|
||||
return f, nil
|
||||
for {
|
||||
header, err := t.tr.Next()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Keep iterating on the archive until we find a normal file
|
||||
if header.Typeflag == tar.TypeReg {
|
||||
|
||||
if t.filter != nil {
|
||||
|
||||
if t.filter(filepath.ToSlash(header.Name), header.FileInfo(), getdepth(header.Name, false)) {
|
||||
continue
|
||||
}
|
||||
|
||||
basePath := strings.Trim(filepath.Dir(filepath.ToSlash(header.Name)), "/")
|
||||
|
||||
// check if the directory is to be skipped
|
||||
if _, ok := t.skipDir[basePath]; ok {
|
||||
continue
|
||||
}
|
||||
|
||||
match := false
|
||||
for p := range t.skipDir {
|
||||
if strings.HasPrefix(basePath, p) {
|
||||
match = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if match {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
f := file{name: header.Name}
|
||||
|
||||
var buf bytes.Buffer
|
||||
if _, err := io.Copy(&buf, t.tr); err != nil {
|
||||
return nil, fmt.Errorf("failed to copy file %s: %w", header.Name, err)
|
||||
}
|
||||
|
||||
f.reader = &buf
|
||||
|
||||
t.files = append(t.files, f)
|
||||
} else if header.Typeflag == tar.TypeDir {
|
||||
cleanedPath := filepath.ToSlash(header.Name)
|
||||
if t.filter != nil && t.filter(cleanedPath, header.FileInfo(), getdepth(header.Name, true)) {
|
||||
t.skipDir[strings.Trim(cleanedPath, "/")] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If done reading files then just return io.EOF
|
||||
// errors for each NextFile() call
|
||||
if t.idx >= len(t.files) {
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
f := t.files[t.idx]
|
||||
t.idx++
|
||||
|
||||
return newDescriptor(path.Join(t.baseURL, f.name), f.name, f.reader), nil
|
||||
}
|
||||
|
||||
// Next implements the storage.Iterator interface.
|
||||
// It iterates to the next policy or data file in the directory tree
|
||||
// and returns a storage.Update for the file.
|
||||
func (it *iterator) Next() (*storage.Update, error) {
|
||||
|
||||
if it.files == nil {
|
||||
it.files = []file{}
|
||||
|
||||
for _, item := range it.raw {
|
||||
f := file{name: item.Path}
|
||||
|
||||
fpath := strings.TrimLeft(filepath.ToSlash(filepath.Dir(f.name)), "/.")
|
||||
if strings.HasSuffix(f.name, RegoExt) {
|
||||
fpath = strings.Trim(f.name, "/")
|
||||
}
|
||||
|
||||
p, ok := storage.ParsePathEscaped("/" + fpath)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("storage path invalid: %v", f.name)
|
||||
}
|
||||
f.path = p
|
||||
|
||||
f.raw = item.Value
|
||||
|
||||
it.files = append(it.files, f)
|
||||
}
|
||||
|
||||
sortFilePathAscend(it.files)
|
||||
}
|
||||
|
||||
// If done reading files then just return io.EOF
|
||||
// errors for each NextFile() call
|
||||
if it.idx >= len(it.files) {
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
f := it.files[it.idx]
|
||||
it.idx++
|
||||
|
||||
isPolicy := false
|
||||
if strings.HasSuffix(f.name, RegoExt) {
|
||||
isPolicy = true
|
||||
}
|
||||
|
||||
return &storage.Update{
|
||||
Path: f.path,
|
||||
Value: f.raw,
|
||||
IsPolicy: isPolicy,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type iterator struct {
|
||||
raw []Raw
|
||||
files []file
|
||||
idx int
|
||||
}
|
||||
|
||||
func NewIterator(raw []Raw) storage.Iterator {
|
||||
it := iterator{
|
||||
raw: raw,
|
||||
}
|
||||
return &it
|
||||
}
|
||||
|
||||
func sortFilePathAscend(files []file) {
|
||||
sort.Slice(files, func(i, j int) bool {
|
||||
return len(files[i].path) < len(files[j].path)
|
||||
})
|
||||
}
|
||||
|
||||
func getdepth(path string, isDir bool) int {
|
||||
if isDir {
|
||||
cleanedPath := strings.Trim(filepath.ToSlash(path), "/")
|
||||
return len(strings.Split(cleanedPath, "/"))
|
||||
}
|
||||
|
||||
basePath := strings.Trim(filepath.Dir(filepath.ToSlash(path)), "/")
|
||||
return len(strings.Split(basePath, "/"))
|
||||
}
|
||||
|
||||
100
vendor/github.com/open-policy-agent/opa/bundle/filefs.go
generated
vendored
Normal file
100
vendor/github.com/open-policy-agent/opa/bundle/filefs.go
generated
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
//go:build go1.16
|
||||
// +build go1.16
|
||||
|
||||
package bundle
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/fs"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
|
||||
"github.com/open-policy-agent/opa/loader/filter"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultFSLoaderRoot = "."
|
||||
)
|
||||
|
||||
type dirLoaderFS struct {
|
||||
sync.Mutex
|
||||
filesystem fs.FS
|
||||
files []string
|
||||
idx int
|
||||
filter filter.LoaderFilter
|
||||
}
|
||||
|
||||
// NewFSLoader returns a basic DirectoryLoader implementation
|
||||
// that will load files from a fs.FS interface
|
||||
func NewFSLoader(filesystem fs.FS) (DirectoryLoader, error) {
|
||||
d := dirLoaderFS{
|
||||
filesystem: filesystem,
|
||||
}
|
||||
|
||||
return &d, nil
|
||||
}
|
||||
|
||||
func (d *dirLoaderFS) walkDir(path string, dirEntry fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if dirEntry != nil {
|
||||
info, err := dirEntry.Info()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if dirEntry.Type().IsRegular() {
|
||||
if d.filter != nil && d.filter(filepath.ToSlash(path), info, getdepth(path, false)) {
|
||||
return nil
|
||||
}
|
||||
|
||||
d.files = append(d.files, path)
|
||||
} else if dirEntry.Type().IsDir() {
|
||||
if d.filter != nil && d.filter(filepath.ToSlash(path), info, getdepth(path, true)) {
|
||||
return fs.SkipDir
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// WithFilter specifies the filter object to use to filter files while loading bundles
|
||||
func (d *dirLoaderFS) WithFilter(filter filter.LoaderFilter) DirectoryLoader {
|
||||
d.filter = filter
|
||||
return d
|
||||
}
|
||||
|
||||
// NextFile iterates to the next file in the directory tree
|
||||
// and returns a file Descriptor for the file.
|
||||
func (d *dirLoaderFS) NextFile() (*Descriptor, error) {
|
||||
d.Lock()
|
||||
defer d.Unlock()
|
||||
|
||||
if d.files == nil {
|
||||
err := fs.WalkDir(d.filesystem, defaultFSLoaderRoot, d.walkDir)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to list files: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// If done reading files then just return io.EOF
|
||||
// errors for each NextFile() call
|
||||
if d.idx >= len(d.files) {
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
fileName := d.files[d.idx]
|
||||
d.idx++
|
||||
|
||||
fh, err := d.filesystem.Open(fileName)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to open file %s: %w", fileName, err)
|
||||
}
|
||||
|
||||
fileNameWithSlash := fmt.Sprintf("/%s", fileName)
|
||||
f := newDescriptor(fileNameWithSlash, fileNameWithSlash, fh).withCloser(fh)
|
||||
return f, nil
|
||||
}
|
||||
141
vendor/github.com/open-policy-agent/opa/bundle/hash.go
generated
vendored
Normal file
141
vendor/github.com/open-policy-agent/opa/bundle/hash.go
generated
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package bundle
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/md5"
|
||||
"crypto/sha1"
|
||||
"crypto/sha256"
|
||||
"crypto/sha512"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"hash"
|
||||
"io"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// HashingAlgorithm represents a subset of hashing algorithms implemented in Go
|
||||
type HashingAlgorithm string
|
||||
|
||||
// Supported values for HashingAlgorithm
|
||||
const (
|
||||
MD5 HashingAlgorithm = "MD5"
|
||||
SHA1 HashingAlgorithm = "SHA-1"
|
||||
SHA224 HashingAlgorithm = "SHA-224"
|
||||
SHA256 HashingAlgorithm = "SHA-256"
|
||||
SHA384 HashingAlgorithm = "SHA-384"
|
||||
SHA512 HashingAlgorithm = "SHA-512"
|
||||
SHA512224 HashingAlgorithm = "SHA-512-224"
|
||||
SHA512256 HashingAlgorithm = "SHA-512-256"
|
||||
)
|
||||
|
||||
// String returns the string representation of a HashingAlgorithm
|
||||
func (alg HashingAlgorithm) String() string {
|
||||
return string(alg)
|
||||
}
|
||||
|
||||
// SignatureHasher computes a signature digest for a file with (structured or unstructured) data and policy
|
||||
type SignatureHasher interface {
|
||||
HashFile(v interface{}) ([]byte, error)
|
||||
}
|
||||
|
||||
type hasher struct {
|
||||
h func() hash.Hash // hash function factory
|
||||
}
|
||||
|
||||
// NewSignatureHasher returns a signature hasher suitable for a particular hashing algorithm
|
||||
func NewSignatureHasher(alg HashingAlgorithm) (SignatureHasher, error) {
|
||||
h := &hasher{}
|
||||
|
||||
switch alg {
|
||||
case MD5:
|
||||
h.h = md5.New
|
||||
case SHA1:
|
||||
h.h = sha1.New
|
||||
case SHA224:
|
||||
h.h = sha256.New224
|
||||
case SHA256:
|
||||
h.h = sha256.New
|
||||
case SHA384:
|
||||
h.h = sha512.New384
|
||||
case SHA512:
|
||||
h.h = sha512.New
|
||||
case SHA512224:
|
||||
h.h = sha512.New512_224
|
||||
case SHA512256:
|
||||
h.h = sha512.New512_256
|
||||
default:
|
||||
return nil, fmt.Errorf("unsupported hashing algorithm: %s", alg)
|
||||
}
|
||||
|
||||
return h, nil
|
||||
}
|
||||
|
||||
// HashFile hashes the file content, JSON or binary, both in golang native format.
|
||||
func (h *hasher) HashFile(v interface{}) ([]byte, error) {
|
||||
hf := h.h()
|
||||
walk(v, hf)
|
||||
return hf.Sum(nil), nil
|
||||
}
|
||||
|
||||
// walk hashes the file content, JSON or binary, both in golang native format.
|
||||
//
|
||||
// Computation for unstructured documents is a hash of the document.
|
||||
//
|
||||
// Computation for the types of structured JSON document is as follows:
|
||||
//
|
||||
// object: Hash {, then each key (in alphabetical order) and digest of the value, then comma (between items) and finally }.
|
||||
//
|
||||
// array: Hash [, then digest of the value, then comma (between items) and finally ].
|
||||
func walk(v interface{}, h io.Writer) {
|
||||
|
||||
switch x := v.(type) {
|
||||
case map[string]interface{}:
|
||||
_, _ = h.Write([]byte("{"))
|
||||
|
||||
var keys []string
|
||||
for k := range x {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
|
||||
for i, key := range keys {
|
||||
if i > 0 {
|
||||
_, _ = h.Write([]byte(","))
|
||||
}
|
||||
|
||||
_, _ = h.Write(encodePrimitive(key))
|
||||
_, _ = h.Write([]byte(":"))
|
||||
walk(x[key], h)
|
||||
}
|
||||
|
||||
_, _ = h.Write([]byte("}"))
|
||||
case []interface{}:
|
||||
_, _ = h.Write([]byte("["))
|
||||
|
||||
for i, e := range x {
|
||||
if i > 0 {
|
||||
_, _ = h.Write([]byte(","))
|
||||
}
|
||||
walk(e, h)
|
||||
}
|
||||
|
||||
_, _ = h.Write([]byte("]"))
|
||||
case []byte:
|
||||
_, _ = h.Write(x)
|
||||
default:
|
||||
_, _ = h.Write(encodePrimitive(x))
|
||||
}
|
||||
}
|
||||
|
||||
func encodePrimitive(v interface{}) []byte {
|
||||
var buf bytes.Buffer
|
||||
encoder := json.NewEncoder(&buf)
|
||||
encoder.SetEscapeHTML(false)
|
||||
_ = encoder.Encode(v)
|
||||
return []byte(strings.Trim(buf.String(), "\n"))
|
||||
}
|
||||
145
vendor/github.com/open-policy-agent/opa/bundle/keys.go
generated
vendored
Normal file
145
vendor/github.com/open-policy-agent/opa/bundle/keys.go
generated
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package bundle provide helpers that assist in creating the verification and signing key configuration
|
||||
package bundle
|
||||
|
||||
import (
|
||||
"encoding/pem"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
|
||||
"github.com/open-policy-agent/opa/internal/jwx/jwa"
|
||||
"github.com/open-policy-agent/opa/internal/jwx/jws/sign"
|
||||
"github.com/open-policy-agent/opa/keys"
|
||||
|
||||
"github.com/open-policy-agent/opa/util"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultTokenSigningAlg = "RS256"
|
||||
)
|
||||
|
||||
// KeyConfig holds the keys used to sign or verify bundles and tokens
|
||||
// Moved to own package, alias kept for backwards compatibility
|
||||
type KeyConfig = keys.Config
|
||||
|
||||
// VerificationConfig represents the key configuration used to verify a signed bundle
|
||||
type VerificationConfig struct {
|
||||
PublicKeys map[string]*KeyConfig
|
||||
KeyID string `json:"keyid"`
|
||||
Scope string `json:"scope"`
|
||||
Exclude []string `json:"exclude_files"`
|
||||
}
|
||||
|
||||
// NewVerificationConfig return a new VerificationConfig
|
||||
func NewVerificationConfig(keys map[string]*KeyConfig, id, scope string, exclude []string) *VerificationConfig {
|
||||
return &VerificationConfig{
|
||||
PublicKeys: keys,
|
||||
KeyID: id,
|
||||
Scope: scope,
|
||||
Exclude: exclude,
|
||||
}
|
||||
}
|
||||
|
||||
// ValidateAndInjectDefaults validates the config and inserts default values
|
||||
func (vc *VerificationConfig) ValidateAndInjectDefaults(keys map[string]*KeyConfig) error {
|
||||
vc.PublicKeys = keys
|
||||
|
||||
if vc.KeyID != "" {
|
||||
found := false
|
||||
for key := range keys {
|
||||
if key == vc.KeyID {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("key id %s not found", vc.KeyID)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetPublicKey returns the public key corresponding to the given key id
|
||||
func (vc *VerificationConfig) GetPublicKey(id string) (*KeyConfig, error) {
|
||||
var kc *KeyConfig
|
||||
var ok bool
|
||||
|
||||
if kc, ok = vc.PublicKeys[id]; !ok {
|
||||
return nil, fmt.Errorf("verification key corresponding to ID %v not found", id)
|
||||
}
|
||||
return kc, nil
|
||||
}
|
||||
|
||||
// SigningConfig represents the key configuration used to generate a signed bundle
|
||||
type SigningConfig struct {
|
||||
Plugin string
|
||||
Key string
|
||||
Algorithm string
|
||||
ClaimsPath string
|
||||
}
|
||||
|
||||
// NewSigningConfig return a new SigningConfig
|
||||
func NewSigningConfig(key, alg, claimsPath string) *SigningConfig {
|
||||
if alg == "" {
|
||||
alg = defaultTokenSigningAlg
|
||||
}
|
||||
|
||||
return &SigningConfig{
|
||||
Plugin: defaultSignerID,
|
||||
Key: key,
|
||||
Algorithm: alg,
|
||||
ClaimsPath: claimsPath,
|
||||
}
|
||||
}
|
||||
|
||||
// WithPlugin sets the signing plugin in the signing config
|
||||
func (s *SigningConfig) WithPlugin(plugin string) *SigningConfig {
|
||||
if plugin != "" {
|
||||
s.Plugin = plugin
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// GetPrivateKey returns the private key or secret from the signing config
|
||||
func (s *SigningConfig) GetPrivateKey() (interface{}, error) {
|
||||
|
||||
block, _ := pem.Decode([]byte(s.Key))
|
||||
if block != nil {
|
||||
return sign.GetSigningKey(s.Key, jwa.SignatureAlgorithm(s.Algorithm))
|
||||
}
|
||||
|
||||
var priv string
|
||||
if _, err := os.Stat(s.Key); err == nil {
|
||||
bs, err := ioutil.ReadFile(s.Key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
priv = string(bs)
|
||||
} else if os.IsNotExist(err) {
|
||||
priv = s.Key
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return sign.GetSigningKey(priv, jwa.SignatureAlgorithm(s.Algorithm))
|
||||
}
|
||||
|
||||
// GetClaims returns the claims by reading the file specified in the signing config
|
||||
func (s *SigningConfig) GetClaims() (map[string]interface{}, error) {
|
||||
var claims map[string]interface{}
|
||||
|
||||
bs, err := ioutil.ReadFile(s.ClaimsPath)
|
||||
if err != nil {
|
||||
return claims, err
|
||||
}
|
||||
|
||||
if err := util.UnmarshalJSON(bs, &claims); err != nil {
|
||||
return claims, err
|
||||
}
|
||||
return claims, nil
|
||||
}
|
||||
135
vendor/github.com/open-policy-agent/opa/bundle/sign.go
generated
vendored
Normal file
135
vendor/github.com/open-policy-agent/opa/bundle/sign.go
generated
vendored
Normal file
@@ -0,0 +1,135 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package bundle provide helpers that assist in the creating a signed bundle
|
||||
package bundle
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/open-policy-agent/opa/internal/jwx/jwa"
|
||||
"github.com/open-policy-agent/opa/internal/jwx/jws"
|
||||
)
|
||||
|
||||
const defaultSignerID = "_default"
|
||||
|
||||
var signers map[string]Signer
|
||||
|
||||
// Signer is the interface expected for implementations that generate bundle signatures.
|
||||
type Signer interface {
|
||||
GenerateSignedToken([]FileInfo, *SigningConfig, string) (string, error)
|
||||
}
|
||||
|
||||
// GenerateSignedToken will retrieve the Signer implementation based on the Plugin specified
|
||||
// in SigningConfig, and call its implementation of GenerateSignedToken. The signer generates
|
||||
// a signed token given the list of files to be included in the payload and the bundle
|
||||
// signing config. The keyID if non-empty, represents the value for the "keyid" claim in the token.
|
||||
func GenerateSignedToken(files []FileInfo, sc *SigningConfig, keyID string) (string, error) {
|
||||
var plugin string
|
||||
// for backwards compatibility, check if there is no plugin specified, and use default
|
||||
if sc.Plugin == "" {
|
||||
plugin = defaultSignerID
|
||||
} else {
|
||||
plugin = sc.Plugin
|
||||
}
|
||||
signer, err := GetSigner(plugin)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return signer.GenerateSignedToken(files, sc, keyID)
|
||||
}
|
||||
|
||||
// DefaultSigner is the default bundle signing implementation. It signs bundles by generating
|
||||
// a JWT and signing it using a locally-accessible private key.
|
||||
type DefaultSigner struct{}
|
||||
|
||||
// GenerateSignedToken generates a signed token given the list of files to be
|
||||
// included in the payload and the bundle signing config. The keyID if non-empty,
|
||||
// represents the value for the "keyid" claim in the token
|
||||
func (*DefaultSigner) GenerateSignedToken(files []FileInfo, sc *SigningConfig, keyID string) (string, error) {
|
||||
payload, err := generatePayload(files, sc, keyID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
privateKey, err := sc.GetPrivateKey()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var headers jws.StandardHeaders
|
||||
|
||||
if err := headers.Set(jws.AlgorithmKey, jwa.SignatureAlgorithm(sc.Algorithm)); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if keyID != "" {
|
||||
if err := headers.Set(jws.KeyIDKey, keyID); err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
hdr, err := json.Marshal(headers)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
token, err := jws.SignLiteral(payload,
|
||||
jwa.SignatureAlgorithm(sc.Algorithm),
|
||||
privateKey,
|
||||
hdr,
|
||||
rand.Reader)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(token), nil
|
||||
}
|
||||
|
||||
func generatePayload(files []FileInfo, sc *SigningConfig, keyID string) ([]byte, error) {
|
||||
payload := make(map[string]interface{})
|
||||
payload["files"] = files
|
||||
|
||||
if sc.ClaimsPath != "" {
|
||||
claims, err := sc.GetClaims()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for claim, value := range claims {
|
||||
payload[claim] = value
|
||||
}
|
||||
} else {
|
||||
if keyID != "" {
|
||||
// keyid claim is deprecated but include it for backwards compatibility.
|
||||
payload["keyid"] = keyID
|
||||
}
|
||||
}
|
||||
return json.Marshal(payload)
|
||||
}
|
||||
|
||||
// GetSigner returns the Signer registered under the given id
|
||||
func GetSigner(id string) (Signer, error) {
|
||||
signer, ok := signers[id]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no signer exists under id %s", id)
|
||||
}
|
||||
return signer, nil
|
||||
}
|
||||
|
||||
// RegisterSigner registers a Signer under the given id
|
||||
func RegisterSigner(id string, s Signer) error {
|
||||
if id == defaultSignerID {
|
||||
return fmt.Errorf("signer id %s is reserved, use a different id", id)
|
||||
}
|
||||
signers[id] = s
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
signers = map[string]Signer{
|
||||
defaultSignerID: &DefaultSigner{},
|
||||
}
|
||||
}
|
||||
571
vendor/github.com/open-policy-agent/opa/bundle/store.go
generated
vendored
571
vendor/github.com/open-policy-agent/opa/bundle/store.go
generated
vendored
@@ -6,41 +6,61 @@ package bundle
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/open-policy-agent/opa/metrics"
|
||||
|
||||
"github.com/open-policy-agent/opa/ast"
|
||||
|
||||
"github.com/open-policy-agent/opa/internal/json/patch"
|
||||
"github.com/open-policy-agent/opa/metrics"
|
||||
"github.com/open-policy-agent/opa/storage"
|
||||
"github.com/open-policy-agent/opa/util"
|
||||
)
|
||||
|
||||
var bundlesBasePath = storage.MustParsePath("/system/bundles")
|
||||
// BundlesBasePath is the storage path used for storing bundle metadata
|
||||
var BundlesBasePath = storage.MustParsePath("/system/bundles")
|
||||
|
||||
// Note: As needed these helpers could be memoized.
|
||||
|
||||
// ManifestStoragePath is the storage path used for the given named bundle manifest.
|
||||
func ManifestStoragePath(name string) storage.Path {
|
||||
return append(bundlesBasePath, name, "manifest")
|
||||
return append(BundlesBasePath, name, "manifest")
|
||||
}
|
||||
|
||||
// EtagStoragePath is the storage path used for the given named bundle etag.
|
||||
func EtagStoragePath(name string) storage.Path {
|
||||
return append(BundlesBasePath, name, "etag")
|
||||
}
|
||||
|
||||
func namedBundlePath(name string) storage.Path {
|
||||
return append(bundlesBasePath, name)
|
||||
return append(BundlesBasePath, name)
|
||||
}
|
||||
|
||||
func rootsPath(name string) storage.Path {
|
||||
return append(bundlesBasePath, name, "manifest", "roots")
|
||||
return append(BundlesBasePath, name, "manifest", "roots")
|
||||
}
|
||||
|
||||
func revisionPath(name string) storage.Path {
|
||||
return append(bundlesBasePath, name, "manifest", "revision")
|
||||
return append(BundlesBasePath, name, "manifest", "revision")
|
||||
}
|
||||
|
||||
func wasmModulePath(name string) storage.Path {
|
||||
return append(BundlesBasePath, name, "wasm")
|
||||
}
|
||||
|
||||
func wasmEntrypointsPath(name string) storage.Path {
|
||||
return append(BundlesBasePath, name, "manifest", "wasm")
|
||||
}
|
||||
|
||||
func metadataPath(name string) storage.Path {
|
||||
return append(BundlesBasePath, name, "manifest", "metadata")
|
||||
}
|
||||
|
||||
// ReadBundleNamesFromStore will return a list of bundle names which have had their metadata stored.
|
||||
func ReadBundleNamesFromStore(ctx context.Context, store storage.Store, txn storage.Transaction) ([]string, error) {
|
||||
value, err := store.Read(ctx, txn, bundlesBasePath)
|
||||
value, err := store.Read(ctx, txn, BundlesBasePath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -65,8 +85,12 @@ func WriteManifestToStore(ctx context.Context, store storage.Store, txn storage.
|
||||
return write(ctx, store, txn, ManifestStoragePath(name), manifest)
|
||||
}
|
||||
|
||||
func write(ctx context.Context, store storage.Store, txn storage.Transaction, path storage.Path, manifest Manifest) error {
|
||||
var value interface{} = manifest
|
||||
// WriteEtagToStore will write the bundle etag into the storage. This function is called when the bundle is activated.
|
||||
func WriteEtagToStore(ctx context.Context, store storage.Store, txn storage.Transaction, name, etag string) error {
|
||||
return write(ctx, store, txn, EtagStoragePath(name), etag)
|
||||
}
|
||||
|
||||
func write(ctx context.Context, store storage.Store, txn storage.Transaction, path storage.Path, value interface{}) error {
|
||||
if err := util.RoundTrip(&value); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -88,12 +112,94 @@ func write(ctx context.Context, store storage.Store, txn storage.Transaction, pa
|
||||
func EraseManifestFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) error {
|
||||
path := namedBundlePath(name)
|
||||
err := store.Write(ctx, txn, storage.RemoveOp, path, nil)
|
||||
if err != nil && !storage.IsNotFound(err) {
|
||||
return err
|
||||
return suppressNotFound(err)
|
||||
}
|
||||
|
||||
// eraseBundleEtagFromStore will remove the bundle etag from storage. This function is called
|
||||
// when the bundle is deactivated.
|
||||
func eraseBundleEtagFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) error {
|
||||
path := EtagStoragePath(name)
|
||||
err := store.Write(ctx, txn, storage.RemoveOp, path, nil)
|
||||
return suppressNotFound(err)
|
||||
}
|
||||
|
||||
func suppressNotFound(err error) error {
|
||||
if err == nil || storage.IsNotFound(err) {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func writeWasmModulesToStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string, b *Bundle) error {
|
||||
basePath := wasmModulePath(name)
|
||||
for _, wm := range b.WasmModules {
|
||||
path := append(basePath, wm.Path)
|
||||
err := write(ctx, store, txn, path, base64.StdEncoding.EncodeToString(wm.Raw))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func eraseWasmModulesFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) error {
|
||||
path := wasmModulePath(name)
|
||||
|
||||
err := store.Write(ctx, txn, storage.RemoveOp, path, nil)
|
||||
return suppressNotFound(err)
|
||||
}
|
||||
|
||||
// ReadWasmMetadataFromStore will read Wasm module resolver metadata from the store.
|
||||
func ReadWasmMetadataFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) ([]WasmResolver, error) {
|
||||
path := wasmEntrypointsPath(name)
|
||||
value, err := store.Read(ctx, txn, path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
bs, err := json.Marshal(value)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("corrupt wasm manifest data")
|
||||
}
|
||||
|
||||
var wasmMetadata []WasmResolver
|
||||
|
||||
err = util.UnmarshalJSON(bs, &wasmMetadata)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("corrupt wasm manifest data")
|
||||
}
|
||||
|
||||
return wasmMetadata, nil
|
||||
}
|
||||
|
||||
// ReadWasmModulesFromStore will write Wasm module resolver metadata from the store.
|
||||
func ReadWasmModulesFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) (map[string][]byte, error) {
|
||||
path := wasmModulePath(name)
|
||||
value, err := store.Read(ctx, txn, path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
encodedModules, ok := value.(map[string]interface{})
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("corrupt wasm modules")
|
||||
}
|
||||
|
||||
rawModules := map[string][]byte{}
|
||||
for path, enc := range encodedModules {
|
||||
encStr, ok := enc.(string)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("corrupt wasm modules")
|
||||
}
|
||||
bs, err := base64.StdEncoding.DecodeString(encStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
rawModules[path] = bs
|
||||
}
|
||||
return rawModules, nil
|
||||
}
|
||||
|
||||
// ReadBundleRootsFromStore returns the roots in the specified bundle.
|
||||
// If the bundle is not activated, this function will return
|
||||
// storage NotFound error.
|
||||
@@ -141,11 +247,54 @@ func readRevisionFromStore(ctx context.Context, store storage.Store, txn storage
|
||||
return str, nil
|
||||
}
|
||||
|
||||
// ReadBundleMetadataFromStore returns the metadata in the specified bundle.
|
||||
// If the bundle is not activated, this function will return
|
||||
// storage NotFound error.
|
||||
func ReadBundleMetadataFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) (map[string]interface{}, error) {
|
||||
return readMetadataFromStore(ctx, store, txn, metadataPath(name))
|
||||
}
|
||||
|
||||
func readMetadataFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, path storage.Path) (map[string]interface{}, error) {
|
||||
value, err := store.Read(ctx, txn, path)
|
||||
if err != nil {
|
||||
return nil, suppressNotFound(err)
|
||||
}
|
||||
|
||||
data, ok := value.(map[string]interface{})
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("corrupt manifest metadata")
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// ReadBundleEtagFromStore returns the etag for the specified bundle.
|
||||
// If the bundle is not activated, this function will return
|
||||
// storage NotFound error.
|
||||
func ReadBundleEtagFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) (string, error) {
|
||||
return readEtagFromStore(ctx, store, txn, EtagStoragePath(name))
|
||||
}
|
||||
|
||||
func readEtagFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, path storage.Path) (string, error) {
|
||||
value, err := store.Read(ctx, txn, path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
str, ok := value.(string)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("corrupt bundle etag")
|
||||
}
|
||||
|
||||
return str, nil
|
||||
}
|
||||
|
||||
// ActivateOpts defines options for the Activate API call.
|
||||
type ActivateOpts struct {
|
||||
Ctx context.Context
|
||||
Store storage.Store
|
||||
Txn storage.Transaction
|
||||
TxnCtx *storage.Context
|
||||
Compiler *ast.Compiler
|
||||
Metrics metrics.Metrics
|
||||
Bundles map[string]*Bundle // Optional
|
||||
@@ -173,13 +322,13 @@ type DeactivateOpts struct {
|
||||
func Deactivate(opts *DeactivateOpts) error {
|
||||
erase := map[string]struct{}{}
|
||||
for name := range opts.BundleNames {
|
||||
if roots, err := ReadBundleRootsFromStore(opts.Ctx, opts.Store, opts.Txn, name); err == nil {
|
||||
for _, root := range roots {
|
||||
erase[root] = struct{}{}
|
||||
}
|
||||
} else if !storage.IsNotFound(err) {
|
||||
roots, err := ReadBundleRootsFromStore(opts.Ctx, opts.Store, opts.Txn, name)
|
||||
if suppressNotFound(err) != nil {
|
||||
return err
|
||||
}
|
||||
for _, root := range roots {
|
||||
erase[root] = struct{}{}
|
||||
}
|
||||
}
|
||||
_, err := eraseBundles(opts.Ctx, opts.Store, opts.Txn, opts.BundleNames, erase)
|
||||
return err
|
||||
@@ -190,21 +339,28 @@ func activateBundles(opts *ActivateOpts) error {
|
||||
// Build collections of bundle names, modules, and roots to erase
|
||||
erase := map[string]struct{}{}
|
||||
names := map[string]struct{}{}
|
||||
deltaBundles := map[string]*Bundle{}
|
||||
snapshotBundles := map[string]*Bundle{}
|
||||
|
||||
for name, b := range opts.Bundles {
|
||||
names[name] = struct{}{}
|
||||
if b.Type() == DeltaBundleType {
|
||||
deltaBundles[name] = b
|
||||
} else {
|
||||
snapshotBundles[name] = b
|
||||
names[name] = struct{}{}
|
||||
|
||||
if roots, err := ReadBundleRootsFromStore(opts.Ctx, opts.Store, opts.Txn, name); err == nil {
|
||||
roots, err := ReadBundleRootsFromStore(opts.Ctx, opts.Store, opts.Txn, name)
|
||||
if suppressNotFound(err) != nil {
|
||||
return err
|
||||
}
|
||||
for _, root := range roots {
|
||||
erase[root] = struct{}{}
|
||||
}
|
||||
} else if !storage.IsNotFound(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
// Erase data at new roots to prepare for writing the new data
|
||||
for _, root := range *b.Manifest.Roots {
|
||||
erase[root] = struct{}{}
|
||||
// Erase data at new roots to prepare for writing the new data
|
||||
for _, root := range *b.Manifest.Roots {
|
||||
erase[root] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,23 +371,77 @@ func activateBundles(opts *ActivateOpts) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(deltaBundles) != 0 {
|
||||
err := activateDeltaBundles(opts, deltaBundles)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Erase data and policies at new + old roots, and remove the old
|
||||
// manifests before activating a new bundles.
|
||||
// manifests before activating a new snapshot bundle.
|
||||
remaining, err := eraseBundles(opts.Ctx, opts.Store, opts.Txn, names, erase)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, b := range opts.Bundles {
|
||||
// Write data from each new bundle into the store. Only write under the
|
||||
// roots contained in their manifest. This should be done *before* the
|
||||
// policies so that path conflict checks can occur.
|
||||
if err := writeData(opts.Ctx, opts.Store, opts.Txn, *b.Manifest.Roots, b.Data); err != nil {
|
||||
return err
|
||||
// Validate data in bundle does not contain paths outside the bundle's roots.
|
||||
for _, b := range snapshotBundles {
|
||||
|
||||
if b.lazyLoadingMode {
|
||||
|
||||
for _, item := range b.Raw {
|
||||
path := filepath.ToSlash(item.Path)
|
||||
|
||||
if filepath.Base(path) == dataFile || filepath.Base(path) == yamlDataFile {
|
||||
var val map[string]json.RawMessage
|
||||
err = util.Unmarshal(item.Value, &val)
|
||||
if err == nil {
|
||||
err = doDFS(val, filepath.Dir(strings.Trim(path, "/")), *b.Manifest.Roots)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
// Build an object for the value
|
||||
p := getNormalizedPath(path)
|
||||
|
||||
if len(p) == 0 {
|
||||
return fmt.Errorf("root value must be object")
|
||||
}
|
||||
|
||||
// verify valid YAML or JSON value
|
||||
var x interface{}
|
||||
err := util.Unmarshal(item.Value, &x)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value := item.Value
|
||||
dir := map[string]json.RawMessage{}
|
||||
for i := len(p) - 1; i > 0; i-- {
|
||||
dir[p[i]] = value
|
||||
|
||||
bs, err := json.Marshal(dir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
value = bs
|
||||
dir = map[string]json.RawMessage{}
|
||||
}
|
||||
dir[p[0]] = value
|
||||
|
||||
err = doDFS(dir, filepath.Dir(strings.Trim(path, "/")), *b.Manifest.Roots)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Write and compile the modules all at once to avoid having to re-do work.
|
||||
// Compile the modules all at once to avoid having to re-do work.
|
||||
remainingAndExtra := make(map[string]*ast.Module)
|
||||
for name, mod := range remaining {
|
||||
remainingAndExtra[name] = mod
|
||||
@@ -240,22 +450,132 @@ func activateBundles(opts *ActivateOpts) error {
|
||||
remainingAndExtra[name] = mod
|
||||
}
|
||||
|
||||
err = writeModules(opts.Ctx, opts.Store, opts.Txn, opts.Compiler, opts.Metrics, opts.Bundles, remainingAndExtra, opts.legacy)
|
||||
err = compileModules(opts.Compiler, opts.Metrics, snapshotBundles, remainingAndExtra, opts.legacy)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for name, b := range opts.Bundles {
|
||||
// Always write manifests to the named location. If the plugin is in the older style config
|
||||
// then also write to the old legacy unnamed location.
|
||||
if err := WriteManifestToStore(opts.Ctx, opts.Store, opts.Txn, name, b.Manifest); err != nil {
|
||||
if err := writeDataAndModules(opts.Ctx, opts.Store, opts.Txn, opts.TxnCtx, snapshotBundles, opts.legacy); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := ast.CheckPathConflicts(opts.Compiler, storage.NonEmpty(opts.Ctx, opts.Store, opts.Txn)); len(err) > 0 {
|
||||
return err
|
||||
}
|
||||
|
||||
for name, b := range snapshotBundles {
|
||||
if err := writeManifestToStore(opts, name, b.Manifest); err != nil {
|
||||
return err
|
||||
}
|
||||
if opts.legacy {
|
||||
if err := LegacyWriteManifestToStore(opts.Ctx, opts.Store, opts.Txn, b.Manifest); err != nil {
|
||||
return err
|
||||
|
||||
if err := writeEtagToStore(opts, name, b.Etag); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := writeWasmModulesToStore(opts.Ctx, opts.Store, opts.Txn, name, b); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func doDFS(obj map[string]json.RawMessage, path string, roots []string) error {
|
||||
if len(roots) == 1 && roots[0] == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
for key := range obj {
|
||||
|
||||
newPath := filepath.Join(strings.Trim(path, "/"), key)
|
||||
|
||||
// Note: filepath.Join can return paths with '\' separators, always use
|
||||
// filepath.ToSlash to keep them normalized.
|
||||
newPath = strings.TrimLeft(filepath.ToSlash(newPath), "/.")
|
||||
|
||||
contains := false
|
||||
prefix := false
|
||||
if RootPathsContain(roots, newPath) {
|
||||
contains = true
|
||||
} else {
|
||||
for i := range roots {
|
||||
if strings.HasPrefix(strings.Trim(roots[i], "/"), newPath) {
|
||||
prefix = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !contains && !prefix {
|
||||
return fmt.Errorf("manifest roots %v do not permit data at path '/%s' (hint: check bundle directory structure)", roots, newPath)
|
||||
}
|
||||
|
||||
if contains {
|
||||
continue
|
||||
}
|
||||
|
||||
var next map[string]json.RawMessage
|
||||
err := util.Unmarshal(obj[key], &next)
|
||||
if err != nil {
|
||||
return fmt.Errorf("manifest roots %v do not permit data at path '/%s' (hint: check bundle directory structure)", roots, newPath)
|
||||
}
|
||||
|
||||
if err := doDFS(next, newPath, roots); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func activateDeltaBundles(opts *ActivateOpts, bundles map[string]*Bundle) error {
|
||||
|
||||
// Check that the manifest roots and wasm resolvers in the delta bundle
|
||||
// match with those currently in the store
|
||||
for name, b := range bundles {
|
||||
value, err := opts.Store.Read(opts.Ctx, opts.Txn, ManifestStoragePath(name))
|
||||
if err != nil {
|
||||
if storage.IsNotFound(err) {
|
||||
continue
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
bs, err := json.Marshal(value)
|
||||
if err != nil {
|
||||
return fmt.Errorf("corrupt manifest data: %w", err)
|
||||
}
|
||||
|
||||
var manifest Manifest
|
||||
|
||||
err = util.UnmarshalJSON(bs, &manifest)
|
||||
if err != nil {
|
||||
return fmt.Errorf("corrupt manifest data: %w", err)
|
||||
}
|
||||
|
||||
if !b.Manifest.equalWasmResolversAndRoots(manifest) {
|
||||
return fmt.Errorf("delta bundle '%s' has wasm resolvers or manifest roots that are different from those in the store", name)
|
||||
}
|
||||
}
|
||||
|
||||
for _, b := range bundles {
|
||||
err := applyPatches(opts.Ctx, opts.Store, opts.Txn, b.Patch.Data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if err := ast.CheckPathConflicts(opts.Compiler, storage.NonEmpty(opts.Ctx, opts.Store, opts.Txn)); len(err) > 0 {
|
||||
return err
|
||||
}
|
||||
|
||||
for name, b := range bundles {
|
||||
if err := writeManifestToStore(opts, name, b.Manifest); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := writeEtagToStore(opts, name, b.Etag); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -275,11 +595,19 @@ func eraseBundles(ctx context.Context, store storage.Store, txn storage.Transact
|
||||
}
|
||||
|
||||
for name := range names {
|
||||
if err := EraseManifestFromStore(ctx, store, txn, name); err != nil && !storage.IsNotFound(err) {
|
||||
if err := EraseManifestFromStore(ctx, store, txn, name); suppressNotFound(err) != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := LegacyEraseManifestFromStore(ctx, store, txn); err != nil && !storage.IsNotFound(err) {
|
||||
if err := LegacyEraseManifestFromStore(ctx, store, txn); suppressNotFound(err) != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := eraseBundleEtagFromStore(ctx, store, txn, name); suppressNotFound(err) != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := eraseWasmModulesFromStore(ctx, store, txn, name); suppressNotFound(err) != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
@@ -293,11 +621,10 @@ func eraseData(ctx context.Context, store storage.Store, txn storage.Transaction
|
||||
if !ok {
|
||||
return fmt.Errorf("manifest root path invalid: %v", root)
|
||||
}
|
||||
|
||||
if len(path) > 0 {
|
||||
if err := store.Write(ctx, txn, storage.RemoveOp, path, nil); err != nil {
|
||||
if !storage.IsNotFound(err) {
|
||||
return err
|
||||
}
|
||||
if err := store.Write(ctx, txn, storage.RemoveOp, path, nil); suppressNotFound(err) != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -328,7 +655,7 @@ func erasePolicies(ctx context.Context, store storage.Store, txn storage.Transac
|
||||
}
|
||||
deleted := false
|
||||
for root := range roots {
|
||||
if strings.HasPrefix(path, root) {
|
||||
if RootPathsContain([]string{root}, path) {
|
||||
if err := store.DeletePolicy(ctx, txn, id); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -344,6 +671,70 @@ func erasePolicies(ctx context.Context, store storage.Store, txn storage.Transac
|
||||
return remaining, nil
|
||||
}
|
||||
|
||||
func writeManifestToStore(opts *ActivateOpts, name string, manifest Manifest) error {
|
||||
// Always write manifests to the named location. If the plugin is in the older style config
|
||||
// then also write to the old legacy unnamed location.
|
||||
if err := WriteManifestToStore(opts.Ctx, opts.Store, opts.Txn, name, manifest); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if opts.legacy {
|
||||
if err := LegacyWriteManifestToStore(opts.Ctx, opts.Store, opts.Txn, manifest); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeEtagToStore(opts *ActivateOpts, name, etag string) error {
|
||||
if err := WriteEtagToStore(opts.Ctx, opts.Store, opts.Txn, name, etag); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeDataAndModules(ctx context.Context, store storage.Store, txn storage.Transaction, txnCtx *storage.Context, bundles map[string]*Bundle, legacy bool) error {
|
||||
params := storage.WriteParams
|
||||
params.Context = txnCtx
|
||||
|
||||
for name, b := range bundles {
|
||||
if len(b.Raw) == 0 {
|
||||
// Write data from each new bundle into the store. Only write under the
|
||||
// roots contained in their manifest.
|
||||
if err := writeData(ctx, store, txn, *b.Manifest.Roots, b.Data); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, mf := range b.Modules {
|
||||
var path string
|
||||
|
||||
// For backwards compatibility, in legacy mode, upsert policies to
|
||||
// the unprefixed path.
|
||||
if legacy {
|
||||
path = mf.Path
|
||||
} else {
|
||||
path = modulePathWithPrefix(name, mf.Path)
|
||||
}
|
||||
|
||||
if err := store.UpsertPolicy(ctx, txn, path, mf.Raw); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
params.BasePaths = *b.Manifest.Roots
|
||||
|
||||
err := store.Truncate(ctx, txn, params, NewIterator(b.Raw))
|
||||
if err != nil {
|
||||
return fmt.Errorf("store truncate failed for bundle '%s': %v", name, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeData(ctx context.Context, store storage.Store, txn storage.Transaction, roots []string, data map[string]interface{}) error {
|
||||
for _, root := range roots {
|
||||
path, ok := storage.ParsePathEscaped("/" + root)
|
||||
@@ -364,6 +755,43 @@ func writeData(ctx context.Context, store storage.Store, txn storage.Transaction
|
||||
return nil
|
||||
}
|
||||
|
||||
func compileModules(compiler *ast.Compiler, m metrics.Metrics, bundles map[string]*Bundle, extraModules map[string]*ast.Module, legacy bool) error {
|
||||
|
||||
m.Timer(metrics.RegoModuleCompile).Start()
|
||||
defer m.Timer(metrics.RegoModuleCompile).Stop()
|
||||
|
||||
modules := map[string]*ast.Module{}
|
||||
|
||||
// preserve any modules already on the compiler
|
||||
for name, module := range compiler.Modules {
|
||||
modules[name] = module
|
||||
}
|
||||
|
||||
// preserve any modules passed in from the store
|
||||
for name, module := range extraModules {
|
||||
modules[name] = module
|
||||
}
|
||||
|
||||
// include all the new bundle modules
|
||||
for bundleName, b := range bundles {
|
||||
if legacy {
|
||||
for _, mf := range b.Modules {
|
||||
modules[mf.Path] = mf.Parsed
|
||||
}
|
||||
} else {
|
||||
for name, module := range b.ParsedModules(bundleName) {
|
||||
modules[name] = module
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if compiler.Compile(modules); compiler.Failed() {
|
||||
return compiler.Errors
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeModules(ctx context.Context, store storage.Store, txn storage.Transaction, compiler *ast.Compiler, m metrics.Metrics, bundles map[string]*Bundle, extraModules map[string]*ast.Module, legacy bool) error {
|
||||
|
||||
m.Timer(metrics.RegoModuleCompile).Start()
|
||||
@@ -439,7 +867,7 @@ func lookup(path storage.Path, data map[string]interface{}) (interface{}, bool)
|
||||
func hasRootsOverlap(ctx context.Context, store storage.Store, txn storage.Transaction, bundles map[string]*Bundle) error {
|
||||
collisions := map[string][]string{}
|
||||
allBundles, err := ReadBundleNamesFromStore(ctx, store, txn)
|
||||
if err != nil && !storage.IsNotFound(err) {
|
||||
if suppressNotFound(err) != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -448,7 +876,7 @@ func hasRootsOverlap(ctx context.Context, store storage.Store, txn storage.Trans
|
||||
// Build a map of roots for existing bundles already in the system
|
||||
for _, name := range allBundles {
|
||||
roots, err := ReadBundleRootsFromStore(ctx, store, txn, name)
|
||||
if err != nil && !storage.IsNotFound(err) {
|
||||
if suppressNotFound(err) != nil {
|
||||
return err
|
||||
}
|
||||
allRoots[name] = roots
|
||||
@@ -489,6 +917,47 @@ func hasRootsOverlap(ctx context.Context, store storage.Store, txn storage.Trans
|
||||
return nil
|
||||
}
|
||||
|
||||
func applyPatches(ctx context.Context, store storage.Store, txn storage.Transaction, patches []PatchOperation) error {
|
||||
for _, pat := range patches {
|
||||
|
||||
// construct patch path
|
||||
path, ok := patch.ParsePatchPathEscaped("/" + strings.Trim(pat.Path, "/"))
|
||||
if !ok {
|
||||
return fmt.Errorf("error parsing patch path")
|
||||
}
|
||||
|
||||
var op storage.PatchOp
|
||||
switch pat.Op {
|
||||
case "upsert":
|
||||
op = storage.AddOp
|
||||
|
||||
_, err := store.Read(ctx, txn, path[:len(path)-1])
|
||||
if err != nil {
|
||||
if !storage.IsNotFound(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := storage.MakeDir(ctx, store, txn, path[:len(path)-1]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case "remove":
|
||||
op = storage.RemoveOp
|
||||
case "replace":
|
||||
op = storage.ReplaceOp
|
||||
default:
|
||||
return fmt.Errorf("bad patch operation: %v", pat.Op)
|
||||
}
|
||||
|
||||
// apply the patch
|
||||
if err := store.Write(ctx, txn, op, path, pat.Value); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Helpers for the older single (unnamed) bundle style manifest storage.
|
||||
|
||||
// LegacyManifestStoragePath is the older unnamed bundle path for manifests to be stored.
|
||||
|
||||
231
vendor/github.com/open-policy-agent/opa/bundle/verify.go
generated
vendored
Normal file
231
vendor/github.com/open-policy-agent/opa/bundle/verify.go
generated
vendored
Normal file
@@ -0,0 +1,231 @@
|
||||
// Copyright 2020 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package bundle provide helpers that assist in the bundle signature verification process
|
||||
package bundle
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/open-policy-agent/opa/internal/jwx/jwa"
|
||||
"github.com/open-policy-agent/opa/internal/jwx/jws"
|
||||
"github.com/open-policy-agent/opa/internal/jwx/jws/verify"
|
||||
"github.com/open-policy-agent/opa/util"
|
||||
)
|
||||
|
||||
const defaultVerifierID = "_default"
|
||||
|
||||
var verifiers map[string]Verifier
|
||||
|
||||
// Verifier is the interface expected for implementations that verify bundle signatures.
|
||||
type Verifier interface {
|
||||
VerifyBundleSignature(SignaturesConfig, *VerificationConfig) (map[string]FileInfo, error)
|
||||
}
|
||||
|
||||
// VerifyBundleSignature will retrieve the Verifier implementation based
|
||||
// on the Plugin specified in SignaturesConfig, and call its implementation
|
||||
// of VerifyBundleSignature. VerifyBundleSignature verifies the bundle signature
|
||||
// using the given public keys or secret. If a signature is verified, it keeps
|
||||
// track of the files specified in the JWT payload
|
||||
func VerifyBundleSignature(sc SignaturesConfig, bvc *VerificationConfig) (map[string]FileInfo, error) {
|
||||
// default implementation does not return a nil for map, so don't
|
||||
// do it here either
|
||||
files := make(map[string]FileInfo)
|
||||
var plugin string
|
||||
// for backwards compatibility, check if there is no plugin specified, and use default
|
||||
if sc.Plugin == "" {
|
||||
plugin = defaultVerifierID
|
||||
} else {
|
||||
plugin = sc.Plugin
|
||||
}
|
||||
verifier, err := GetVerifier(plugin)
|
||||
if err != nil {
|
||||
return files, err
|
||||
}
|
||||
return verifier.VerifyBundleSignature(sc, bvc)
|
||||
}
|
||||
|
||||
// DefaultVerifier is the default bundle verification implementation. It verifies bundles by checking
|
||||
// the JWT signature using a locally-accessible public key.
|
||||
type DefaultVerifier struct{}
|
||||
|
||||
// VerifyBundleSignature verifies the bundle signature using the given public keys or secret.
|
||||
// If a signature is verified, it keeps track of the files specified in the JWT payload
|
||||
func (*DefaultVerifier) VerifyBundleSignature(sc SignaturesConfig, bvc *VerificationConfig) (map[string]FileInfo, error) {
|
||||
files := make(map[string]FileInfo)
|
||||
|
||||
if len(sc.Signatures) == 0 {
|
||||
return files, fmt.Errorf(".signatures.json: missing JWT (expected exactly one)")
|
||||
}
|
||||
|
||||
if len(sc.Signatures) > 1 {
|
||||
return files, fmt.Errorf(".signatures.json: multiple JWTs not supported (expected exactly one)")
|
||||
}
|
||||
|
||||
for _, token := range sc.Signatures {
|
||||
payload, err := verifyJWTSignature(token, bvc)
|
||||
if err != nil {
|
||||
return files, err
|
||||
}
|
||||
|
||||
for _, file := range payload.Files {
|
||||
files[file.Name] = file
|
||||
}
|
||||
}
|
||||
return files, nil
|
||||
}
|
||||
|
||||
func verifyJWTSignature(token string, bvc *VerificationConfig) (*DecodedSignature, error) {
|
||||
// decode JWT to check if the header specifies the key to use and/or if claims have the scope.
|
||||
|
||||
parts, err := jws.SplitCompact(token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var decodedHeader []byte
|
||||
if decodedHeader, err = base64.RawURLEncoding.DecodeString(parts[0]); err != nil {
|
||||
return nil, fmt.Errorf("failed to base64 decode JWT headers: %w", err)
|
||||
}
|
||||
|
||||
var hdr jws.StandardHeaders
|
||||
if err := json.Unmarshal(decodedHeader, &hdr); err != nil {
|
||||
return nil, fmt.Errorf("failed to parse JWT headers: %w", err)
|
||||
}
|
||||
|
||||
payload, err := base64.RawURLEncoding.DecodeString(parts[1])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var ds DecodedSignature
|
||||
if err := json.Unmarshal(payload, &ds); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// check for the id of the key to use for JWT signature verification
|
||||
// first in the OPA config. If not found, then check the JWT kid.
|
||||
keyID := bvc.KeyID
|
||||
if keyID == "" {
|
||||
keyID = hdr.KeyID
|
||||
}
|
||||
if keyID == "" {
|
||||
// If header has no key id, check the deprecated key claim.
|
||||
keyID = ds.KeyID
|
||||
}
|
||||
|
||||
if keyID == "" {
|
||||
return nil, fmt.Errorf("verification key ID is empty")
|
||||
}
|
||||
|
||||
// now that we have the keyID, fetch the actual key
|
||||
keyConfig, err := bvc.GetPublicKey(keyID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// verify JWT signature
|
||||
alg := jwa.SignatureAlgorithm(keyConfig.Algorithm)
|
||||
key, err := verify.GetSigningKey(keyConfig.Key, alg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_, err = jws.Verify([]byte(token), alg, key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// verify the scope
|
||||
scope := bvc.Scope
|
||||
if scope == "" {
|
||||
scope = keyConfig.Scope
|
||||
}
|
||||
|
||||
if ds.Scope != scope {
|
||||
return nil, fmt.Errorf("scope mismatch")
|
||||
}
|
||||
return &ds, nil
|
||||
}
|
||||
|
||||
// VerifyBundleFile verifies the hash of a file in the bundle matches to that provided in the bundle's signature
|
||||
func VerifyBundleFile(path string, data bytes.Buffer, files map[string]FileInfo) error {
|
||||
var file FileInfo
|
||||
var ok bool
|
||||
|
||||
if file, ok = files[path]; !ok {
|
||||
return fmt.Errorf("file %v not included in bundle signature", path)
|
||||
}
|
||||
|
||||
if file.Algorithm == "" {
|
||||
return fmt.Errorf("no hashing algorithm provided for file %v", path)
|
||||
}
|
||||
|
||||
hash, err := NewSignatureHasher(HashingAlgorithm(file.Algorithm))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// hash the file content
|
||||
// For unstructured files, hash the byte stream of the file
|
||||
// For structured files, read the byte stream and parse into a JSON structure;
|
||||
// then recursively order the fields of all objects alphabetically and then apply
|
||||
// the hash function to result to compute the hash. This ensures that the digital signature is
|
||||
// independent of whitespace and other non-semantic JSON features.
|
||||
var value interface{}
|
||||
if IsStructuredDoc(path) {
|
||||
err := util.Unmarshal(data.Bytes(), &value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
value = data.Bytes()
|
||||
}
|
||||
|
||||
bs, err := hash.HashFile(value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// compare file hash with same file in the JWT payloads
|
||||
fb, err := hex.DecodeString(file.Hash)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !bytes.Equal(fb, bs) {
|
||||
return fmt.Errorf("%v: digest mismatch (want: %x, got: %x)", path, fb, bs)
|
||||
}
|
||||
|
||||
delete(files, path)
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetVerifier returns the Verifier registered under the given id
|
||||
func GetVerifier(id string) (Verifier, error) {
|
||||
verifier, ok := verifiers[id]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no verifier exists under id %s", id)
|
||||
}
|
||||
return verifier, nil
|
||||
}
|
||||
|
||||
// RegisterVerifier registers a Verifier under the given id
|
||||
func RegisterVerifier(id string, v Verifier) error {
|
||||
if id == defaultVerifierID {
|
||||
return fmt.Errorf("verifier id %s is reserved, use a different id", id)
|
||||
}
|
||||
verifiers[id] = v
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
verifiers = map[string]Verifier{
|
||||
defaultVerifierID: &DefaultVerifier{},
|
||||
}
|
||||
}
|
||||
18
vendor/github.com/open-policy-agent/opa/capabilities/capabilities.go
generated
vendored
Normal file
18
vendor/github.com/open-policy-agent/opa/capabilities/capabilities.go
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright 2021 The OPA Authors. All rights reserved.
|
||||
// Use of this source code is governed by an Apache2
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build go1.16
|
||||
// +build go1.16
|
||||
|
||||
package capabilities
|
||||
|
||||
import (
|
||||
"embed"
|
||||
)
|
||||
|
||||
// FS contains the embedded capabilities/ directory of the built version,
|
||||
// which has all the capabilities of previous versions:
|
||||
// "v0.18.0.json" contains the capabilities JSON of version v0.18.0, etc
|
||||
//go:embed *.json
|
||||
var FS embed.FS
|
||||
2392
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.0.json
generated
vendored
Normal file
2392
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2392
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.1.json
generated
vendored
Normal file
2392
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2525
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.2.json
generated
vendored
Normal file
2525
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2525
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.3.json
generated
vendored
Normal file
2525
vendor/github.com/open-policy-agent/opa/capabilities/v0.17.3.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2685
vendor/github.com/open-policy-agent/opa/capabilities/v0.18.0.json
generated
vendored
Normal file
2685
vendor/github.com/open-policy-agent/opa/capabilities/v0.18.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2835
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.0-rc1.json
generated
vendored
Normal file
2835
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.0-rc1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2858
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.0.json
generated
vendored
Normal file
2858
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2858
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.1.json
generated
vendored
Normal file
2858
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2858
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.2.json
generated
vendored
Normal file
2858
vendor/github.com/open-policy-agent/opa/capabilities/v0.19.2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.0.json
generated
vendored
Normal file
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.1.json
generated
vendored
Normal file
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.2.json
generated
vendored
Normal file
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.3.json
generated
vendored
Normal file
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.3.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.4.json
generated
vendored
Normal file
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.4.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.5.json
generated
vendored
Normal file
3064
vendor/github.com/open-policy-agent/opa/capabilities/v0.20.5.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3086
vendor/github.com/open-policy-agent/opa/capabilities/v0.21.0.json
generated
vendored
Normal file
3086
vendor/github.com/open-policy-agent/opa/capabilities/v0.21.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3086
vendor/github.com/open-policy-agent/opa/capabilities/v0.21.1.json
generated
vendored
Normal file
3086
vendor/github.com/open-policy-agent/opa/capabilities/v0.21.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3137
vendor/github.com/open-policy-agent/opa/capabilities/v0.22.0.json
generated
vendored
Normal file
3137
vendor/github.com/open-policy-agent/opa/capabilities/v0.22.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3168
vendor/github.com/open-policy-agent/opa/capabilities/v0.23.0.json
generated
vendored
Normal file
3168
vendor/github.com/open-policy-agent/opa/capabilities/v0.23.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3168
vendor/github.com/open-policy-agent/opa/capabilities/v0.23.1.json
generated
vendored
Normal file
3168
vendor/github.com/open-policy-agent/opa/capabilities/v0.23.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3168
vendor/github.com/open-policy-agent/opa/capabilities/v0.23.2.json
generated
vendored
Normal file
3168
vendor/github.com/open-policy-agent/opa/capabilities/v0.23.2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3243
vendor/github.com/open-policy-agent/opa/capabilities/v0.24.0.json
generated
vendored
Normal file
3243
vendor/github.com/open-policy-agent/opa/capabilities/v0.24.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3271
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc1.json
generated
vendored
Normal file
3271
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3313
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc2.json
generated
vendored
Normal file
3313
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3313
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc3.json
generated
vendored
Normal file
3313
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc3.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3313
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc4.json
generated
vendored
Normal file
3313
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0-rc4.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3355
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0.json
generated
vendored
Normal file
3355
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3355
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.1.json
generated
vendored
Normal file
3355
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3355
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.2.json
generated
vendored
Normal file
3355
vendor/github.com/open-policy-agent/opa/capabilities/v0.25.2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3383
vendor/github.com/open-policy-agent/opa/capabilities/v0.26.0.json
generated
vendored
Normal file
3383
vendor/github.com/open-policy-agent/opa/capabilities/v0.26.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3389
vendor/github.com/open-policy-agent/opa/capabilities/v0.27.0.json
generated
vendored
Normal file
3389
vendor/github.com/open-policy-agent/opa/capabilities/v0.27.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3389
vendor/github.com/open-policy-agent/opa/capabilities/v0.27.1.json
generated
vendored
Normal file
3389
vendor/github.com/open-policy-agent/opa/capabilities/v0.27.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.28.0.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.28.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.0.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.1.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.2.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.3.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.3.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.4.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.29.4.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.30.0.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.30.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.30.1.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.30.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.30.2.json
generated
vendored
Normal file
3458
vendor/github.com/open-policy-agent/opa/capabilities/v0.30.2.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3512
vendor/github.com/open-policy-agent/opa/capabilities/v0.31.0.json
generated
vendored
Normal file
3512
vendor/github.com/open-policy-agent/opa/capabilities/v0.31.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3512
vendor/github.com/open-policy-agent/opa/capabilities/v0.32.0.json
generated
vendored
Normal file
3512
vendor/github.com/open-policy-agent/opa/capabilities/v0.32.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3512
vendor/github.com/open-policy-agent/opa/capabilities/v0.32.1.json
generated
vendored
Normal file
3512
vendor/github.com/open-policy-agent/opa/capabilities/v0.32.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3534
vendor/github.com/open-policy-agent/opa/capabilities/v0.33.0.json
generated
vendored
Normal file
3534
vendor/github.com/open-policy-agent/opa/capabilities/v0.33.0.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3534
vendor/github.com/open-policy-agent/opa/capabilities/v0.33.1.json
generated
vendored
Normal file
3534
vendor/github.com/open-policy-agent/opa/capabilities/v0.33.1.json
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user